《腾讯-张宇昂-使用Rust开发v8引擎可视化分析工具.pdf》由会员分享,可在线阅读,更多相关《腾讯-张宇昂-使用Rust开发v8引擎可视化分析工具.pdf(38页珍藏版)》请在三个皮匠报告上搜索。
1、使Rust可视化分析V8内存快照张宇昂 微信级前端程师个简介怎么称呼我:张宇昂 2018年毕业 Title:微信级前端程师 Github:https:/ 擅什么:专注于 Node.js与前端的结合,前端框架的SSR服务端渲染,Rust 与 JS 的结合提速 开源经历:Github 个项 Stars 6k,给 Vite,Webpack 等多个业界知名开源项贡献过核代码 最近在什么:写些 Rust 相关的东 录介绍 v8-profiler-rsIntroduction01产环境如何动化成分析报告推送Production03分析原理Design02v8-profiler-rs介绍 v8-profil
2、er-rsIntroduce01案例背景Node.js 整个态缺乏内存层的分析具Heapdump单纯的成内存快照件,不具备分析能Chrome Devtools只提供了简单的信息展示能 缺少搜索,分类,分析能Easy-Monitor起 Chrome Devtools 迈出了进步 提供了搜索能和定的分析能v8-profiler-rs基于现有具能的不,开发了个可视化智能分析内存信息的具 v8-profiler-rsv8-profiler-rshttp:/v8.ssr- 会不断引新的 theThing 对象v8-profiler-rs第步:成快照件上传持同时上传1个/多个快照件使 Wasm 纯浏览器端
3、解析件上传件按照 retained_size选择前50个排列 retained_size:节点被释放后能够被 GC 的内存,问题节点通常出现在这些节点之中根据不同的颜进节点分类业务层原节点:JS层业务代码节点(通常是出现问题的节点)系统层节点:般是C+层节点业务层原节点:般是node模块,例如 fs,path 这些节点根据节点分类进筛选这我们可以选择只看JS 业务层的结点,这些结点通常是问题的发地问题排查可以看到这出现了很多名为 someMethod 的节点结点引链路分析点击节点展开我们可以看到节点的引链条过滤引链路通过左侧板我们可以过滤关信息只关注业务代码的引链路这我们可以看到存在someM
4、ethod 之间的引链条推测是由于闭包导致的内存泄漏成分析报告聚焦下两个维度,动成分析报告-重复次数最多的业务节点-释放后可回收内存最多的业务节点对快照能对于型应来说,我们法从单快照刻得出有结论时可以使对快照功能对快照能开发者可以同时上传两个快照件具将基于下列两个维度进对-快照前后新增的节点-快照前后id相同但retained_size增的节点成分析报告通过图示可以看出 replaceThing这个业务层节点的RS在两次快照前后显著增加v8-profiler-rs分析原理Design02内存分布内存节点在内存中通常以有向图的数据结构描述个内存节点个初步序列化后的未处理内存节点具有以下信息垃圾回
5、收在 V8 中使标记清除法进垃圾回收任何从 Root 节点法被访问的节点将会被回收配树从根节点1到达节点5有两条道路,也就是说论是删除节点3还是节点4,我们仍然可以从节点1访问到节点5,此时节点5并不能被回收。只有删除节点2才能够回收节点5,所以我们将节点2称之为节点5的直接配节点。配树转换为配树每个节点的节点都是它的直接配节点流的配树算法有两种:tarjan 算法A Simple,Fast Dominance Algorithm 在 V8 中注意过滤节点之间的持有关系解析流程转换为配树每个节点的节点都是它的直接配节点流的配树算法有两种:tarjan 算法A Simple,Fast Domin
6、ance Algorithm 在 V8 中注意过滤节点之间的持有关系补充完整信息后的内存节点经过解析逻辑处理,补充了retained_size,constructor,parents,is_weak,source 信息性能对以 65MB 的快照件为例 内存节点数量概在 72w 个左右 实际的应节点数量概在200w左右 对会更加强烈通过下的流程,我们将V8成的快照件,解析为包含完整信息的节点数组解析流程v8-profiler-rs产环境如何动化推送分析报告Production0