Qcon北京2018-《唯快不破——高效定位线上 Node.js 应用内存泄漏》-黄一君

Similar documents
Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7.

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

六盘水人资社保发〔2013〕137号


Intruduction to the NGINX stream subsystem and OpenResty's support

電機工程系認可證照清單 /7/1

(改)AI时代的移动技术革新-Node全栈-i5ting.key


大连软~1

ebook

基于Electron-vue的桌应用实战2

天仁期末個人報告1.PDF

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

Hippy-VueConf

浙江师范大学2014年度毕业生就业质量报告

目 录 监 管 资 讯 2016 年 全 国 保 险 监 管 工 作 会 议 召 开...3 协 会 动 态 赤 峰 保 险 行 业 协 会 召 开 数 据 统 计 和 信 息 宣 传 总 结 表 彰 会 议...5 赤 峰 市 保 险 行 业 协 会 秘 书 处 召 开 2015 年 度 述 职

同 时, 采 取 提 供 新 闻 线 索 和 素 材 安 排 专 访 等 方 式 主 动 为 新 闻 媒 体 服 务, 为 采 访 报 道 活 动 创 造 便 利 条 件 建 设 网 络 信 息 发 布 平 台 2013 年 9 月 开 通 中 央 纪 委 监 察 部 网 站,2015 年 1 月

公務員服務法第13條相關解釋彙整表

大陸教育部等6個部門公佈「現代職業教育體系建設規劃 ( 年)」規劃到2015年初步形成現代職業教育體系框架,到2020年基本建成「中國」特色現代職業教育體系

资 讯 速 递 台 基 于 大 数 据 的 学 校 督 导 评 估 系 统 建 设 上 海 市 闵 行 区 人 民 政 府 教 育 督 导 室 ( 摘 要 ) 闵 行 教 育 在 深 化 教 育 改 革 探 索 管 办 评 分 离 的 背 景 下, 把 教 育 督 导 评 估 系 统 建 设 作 为

B1

時間軸上的竹蓮記憶 學務主任 黃雅彙 我不是竹蓮國小的畢業校友 但對於身為新竹人的我來 說 仔細回想起來 似乎和竹蓮有著一種特別的緣分 對竹蓮國小最初的印象是在小學的時候 猶記得年幼的 我經過一段時日的啦啦隊舞蹈訓練後 老師便帶著我們從學 校步行到竹蓮國小來參加比賽 一踏入竹蓮校門 映入眼簾 的是黑

B1

Microsoft Word - 临政办发6.doc

基于ECO的UML模型驱动的数据库应用开发1.doc

epub 21-22

AS北京2017-《知乎 Feed 流构架演进》-姚钢强.key

2014年全国体操锦标赛

30.00% 25.00% 25.00% 22.50% 20.00% 15.00% 12.50% 15.00% 12.50% 10.00% 7.50% 5.00% 2.50% 2.50% 0.00% 文 学 理 学 工 学 法 学 教 育 学 管 理 学 历 史 学 艺 术 学 ( 三 ) 学 生

Important Notice SUNPLUS TECHNOLOGY CO. reserves the right to change this documentation without prior notice. Information provided by SUNPLUS TECHNOLO

untitled

59 1 CSpace 2 CSpace CSpace URL CSpace 1 CSpace URL 2 Lucene 3 ID 4 ID Web 1. 2 CSpace LireSolr 3 LireSolr 3 Web LireSolr ID

02 微服务设计原则与生态系统-final.key

<4D F736F F F696E74202D20C8EDBCFEBCDCB9B9CAA6D1D0D0DEBDB2D7F92E707074>

Microsoft Word 级第二专业学士学位培养计划.doc

不不可能完成的任务从 用户空间窃取内核数据 Yueqiang Cheng, Zhaofeng Chen, Yulong Zhang, Yu Ding, Tao Wei Baidu Security

近四年网络工程专业培养方案.doc

untitled

ac2017-joeyguo-2.0.key

05.(最终版)手机淘宝 H5 和 Weex 容器的构建实践-云栖-2016-鬼道.key

chapter 2 HTML5 目錄iii HTML HTML HTML HTML HTML canvas

Microsoft PowerPoint - ch6 [相容模式]

Move Component Object selection Component selection UV Maya Hotkeys editor Maya USING MAYA POLYGONAL MODELING 55

本 课 程 作 为 非 计 算 机 专 业 本 科 通 识 课 程, 是 一 门 理 论 和 实 践 紧 密 结 合 的 实 用 课 程, 内 容 包 括 计 算 机 基 础 部 分 和 程 序 设 计 部 分 计 算 机 基 础 部 分 涵 盖 计 算 机 软 硬 件 组 成 数 制 表 示 操

計畫-送府.doc

Python 和 人 工智能基 础课程 ( 第 二课 ) 张威, 雷雷萧萧

站在巨人的肩膀上 - 使用Symfony框架开发你的下一个项目.key

优迈科技教学大纲2009版本

ii Vue Bootstrap 4 ES 6 Vue Vue Bootstrap 4 ES 6 Vue 2 vue html vue html vue Vue HTML 5 CSS ES 6 HTML 5 CSS Visual Studio Code h

第 15 章 程 式 編 写 語 言 15.1 程 式 編 写 語 言 的 角 色 程 式 編 寫 語 言 是 程 式 編 寫 員 與 電 腦 溝 通 的 界 面 語 法 是 一 組 規 則 讓 程 式 編 寫 員 將 字 詞 集 合 起 來 電 腦 是 處 理 位 元 和 字 節 的 機 器, 與

实践课堂成都站-0609.key

OpenResty在又拍云容器平台中的应用

TVS厂商接入流程API文档

Chap06

IP505SM_manual_cn.doc

文档 3

ebook140-9

响应式在iOS开发中的应用 For PDF

入 大 立立 手 口 面 耳 鼻 耳 鼻 子 耳 鼻 生 生 耳 鼻 耳 鼻 耳 鼻 小 手 入 大 一 支 手 入 支 立立 手 入 支 手 入 石 口 口 支 手 支 手 手 支 入 入 入 人 人 人 人 人 田 手 入 耳 鼻 手 入 小 一 支 人 見見 赤 十 耳 鼻 金金 口 手 支

13 A DSS B DSS C DSS D DSS A. B. C. CPU D. 15 A B Cache C Cache D L0 L1 L2 Cache 16 SMP A B. C D 17 A B. C D A B - C - D

“百企入校——广西青年企业家协会高校

念「舊」新潮流─國立臺灣圖書館舊籍行銷策略探究

构建高效的私有云平台V3

RUN_PC連載_8_.doc

广西英腾教育科技股份有限公司

演算法導入、ソート、データ構造、ハッシュ

1.【可以发布,不需去二维码】AS北京2017-张振华-美丽联合容器云平台建设的实战分享.key

中南大学第二届软件创新大赛

Network Bandwidth Applications MATE Applications Applications On Demand Calendaring Load Balancer Live Archive Design Northbound Service,Netwo

附件2

SL2511 SR Plus 操作手冊_單面.doc

ArcGIS Sever.NET ArcGIS Server Web JAVA ArcGIS Server Web

新美大酒店开放平台SDK(.NET版)使用说明.pages

python_free

EJB-Programming-4-cn.doc

ebook60-13

ebook140-8


EJB-Programming-3.PDF

张炅轩-360基础架构之一:插件化漫谈-3.正式演讲.key

第三章 中原儺文化圈

Dell EMC Data Domain DDOS 5.5 Data Domain Data Domain Data Domain : Data Domain Boost (DDBoost) Dell EMC DDBoost Data Domain DDBoost Source De-Dup Bac

未命名

when-memory-safe-langueages-become-unsafe-defcon-china-cn

ESP-TOUCH_User_Guide__CN.pages

API网关在大数据开放中的应用-童剑-v0.3.key

untitled

Open topic Bellman-Ford算法与负环

OpenResty 动态流控的几种姿势

Tangram For GMTC 2017.key

WWW PHP

<4D F736F F D20B9FABCD2BBFAB9D8B0ECB9ABBDA8D6FEBACDB4F3D0CDB9ABB9B2BDA8D6FEC4DCBAC4BCE0B2E2CFB5CDB3C8EDBCFEBFAAB7A2D6B8B5BCCBB5C3F7CAE92E646F63>

无类继承.key

CloudNative应用实践V3

XML XML XMPP XML XML Schema XML XML,,, XML,

桃園縣秀才實驗學校多元適性發展的課程規畫

weblogic

天津天狮学院关于修订2014级本科培养方案的指导意见

南京市人才服务中心

IXDC

Transcription:

唯快不不破 高效定位线上 Node.js 应 用内存泄漏漏

关于我 @hyj1991 (GitHub, CNode) @ 黄 一君,Easy-Monitor 作者 @ 阿 里里云计算有限公司, 高级开发 工程师,Node.js 性能平台

背景 作为中间层, 前后端分离 长连接, 纯服务端应 用 NW.js Electron 等构建跨平台客户端 Java Services RPC calls, protocols Node.js Applications CDN, Tengine(Nginx) Distributed Systems (C++, Erlang, Java.) Building new products Refactoring old products(php/java Web) Rapid iteration, better communication

探究 V8 GC 过程

堆内内存划分 Map Space Object 指向的隐藏类元对象 Large Object Space 大对象 ( 大于 507136 byte) Code Space v8 编译后的可执 行行代码 Old Space 在 new space 中经过两次 GC 依旧存活的对象晋升到 old space 中 New Space 对半分割为两个部分, 同 一时刻只使 用其中的 一半, 绝 大部分对象的创建和销毁都在这 里里发 生

新 生代 (Scavenge 算法 ) a1 D A a2 a2-1 e1 Root B b1 E e2 C c1 c1-1 c1-1- c1-2

新 生代 (Scavenge 算法 ) to space Allocation Pointer A B C a1 a2 b1 a2-1 c1 c1-1 c1- D c1- E e1 e2 1-2 1 from space not in use

新 生代 (Flip) from space A B C a1 a2 b1 a2-1 c1 c1-1 c1- D c1- E e1 e2 1-2 1 to space Scan Pointer Allocation Pointer

新 生代 (Copy Roots) from space A B C a1 a2 b1 a2-1 c1 c1-1 c1- D c1- E e1 e2 1-2 1 to space A B C Scan Pointer Allocation Pointer

新 生代 (BFS) from space A B C a1 a2 b1 a2-1 c1 c1-1 c1- D c1- E e1 e2 1-2 1 to space A B C a1 a2 b1 c1 Scan Pointer Allocation Pointer

新 生代 (Scan 指针和 Allocation 指针重合 ) from space A B C a1 a2 b1 a2-1 c1 c1-1 c1- D c1- E e1 e2 1-2 1 to space A B C a1 a2 b1 c1 a2-1 c1-1 c1-2 c1-1- 1 Scan Pointer Allocation Pointer

老老 生代 (Mark-Sweep/Mark-Compact 算法 ) A D H Root B E F G C I J K marking deque

老老 生代 (Mark-Sweep/Mark-Compact 算法 ) A D H E Root B F G C B C J A I K marking deque

老老 生代 (Mark-Sweep/Mark-Compact 算法 ) A D H Root B E C I F G J K B A marking deque

老老 生代 (Mark-Sweep/Mark-Compact 算法 ) A D H Root B E F G F E C I J K A marking deque

老老 生代 (Mark-Sweep/Mark-Compact 算法 ) A D H Root B E F G G E C I J K A marking deque

老老 生代 (Mark-Sweep/Mark-Compact 算法 ) A D H Root B E F G C I J K marking deque

老老 生代 (overflow) A D H E Root B overflow E F G A C I J marking deque K 先将 G 标记为灰 色, 但是不不放 入 marking queue, 那么从 E 开始 pop, 很快 marking queue 就会被清空 ; 此时再遍历整个堆, 找到灰 色的对象放 入 marking queue, 继续原样 标记执 行行

增量量式标记 每次 Mark-Sweep 需要全量量扫描整个堆, 开销过 大 堆达到 一定 大 小时, 执 行行增量量标记 (incremental_marking)

探究 Heapsnapshot

什什么是 Heapsnapshot Root 到应 用运 行行 生成的各个对象间的引 用关系

获取 Heapsnapshot (heapdump) 使 用 writesnapshot 按需获取堆快照 使 用 kill -USR2 <pid> 按需获取堆快照

获取 Heapsnapshot (v8- profiler) 传 入回调获取完整序列列化堆快照 不不传回调返回 transform 流式获取堆快照

获取 Heapsnapshot (Node.js 性能平台 )

Heapsnapshot 数据结构详解 { snapshot: {} nodes: [] node1 edge1 snapshot describe node & edge edges: [] node2 node & edge s name strings: [] } edge2 node3

Heapsnapshot 数据结构详解 ( snapshot ) meta.node_fields: 长度为 一个 node 实际 长度, 每 一个元素代表其含 meta.node_types: 每 一个 node 中每 一位的类型, 第 一位 type 是 一个数 meta.edge_fields: 长度为 一个 edge 实际 长度, 每 一个元素代表其含义 meta.edge_types: 每 一个 edge 中每 一位的类型, 第 一位 type 是 一个数

Heapsnapshot 数据结构详解 ( node 和 edge 的对应关系 ) node1 node2 node3 edge_count: 2 edge_count: 1 edge_count: 3 edge1 edge2 edge3 edge4 edge5 edge6

Heapsnapshot 数据结构详解 ( node 和 node 的引 用关系 ) edge node1 to_node: node2

定位泄漏漏点 ( 内存图 ) 1 2 3 4 5 6 7 8

定位泄漏漏点 ( 支配树 ) 1 2 3 5 4 7 6 8

定位泄漏漏点 (GC roots)

经典案例例实战

EventHandle if (!client) { client = Client.create({ refreshinterval: 30000, requesttimeout: 5000, urllib: urllib }); } client.on('error', err => { // error 处理理... });

EventHandle

EventHandle MyEvent extends events.eventemitter myevent.on( some, listener ) myevent._events[ some ] = [listener1, listener2, listener3, ]

EventHandle home.js()@3454 context Client@4607 EventHandlers Array listener1, _events erro array

EventHandle 总结 设置 max listeners ( setmaxlisteners ) 调 用 on 方法时记得留留意下是否会重复执 行行

动态更更新模块 const a = require('a'); const b = require('b'); const c = require('c'); // 业务处理理... delete require.cache[require.resolve('a')]; delete require.cache[require.resolve('b')]; delete require.cache[require.resolve('c')];

动态更更新模块 delete require.cache[ mod1-v1 ] require( mod1-v2 ) mod1- mod2- mod1- mod1- node 进程

动态更更新模块

动态更更新模块 Mod A add reference to Mod A.children B 缓存是否存在 require(./b ) not exists 解析 B 模 add cache

动态更更新模块 总结 清除模块的缓存需要清除 require.cache 和所有 父引 用 清除的模块中包含定时器器 socket 连接等资源的需要 手动释放 不不建议在线上对 Node.js 进程做模块的热加载

网红 Vue beforecreate created beforemount mounted

网红 Vue const app = new Vue({ created() { setinterval(function () { // 业务处理理.. }); }, template: `<xxx></xxx>` }); render.rendertostring(app, (err, html) => { // 业务处理理.. });

网红 Vue

网红 Vue created 会在 ssr 时执 行行, 这 里里创建的 timer 等资源属性的元素会在服务端累加

网红 Vue 总结 加强 SSR 生命周期的理理解 SSR 中处于服务端执 行行的 生命周期钩 子中不不添加资源属性元素

总结与思考

线上诊断两 大难题 Out of Memory 进程仍存活但 无故不不响应