久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

為什么需要性能監(jiān)控?聊聊Node.js性能監(jiān)控

為什么需要性能監(jiān)控?下面本篇就來(lái)帶大家了解一下Node.js性能監(jiān)控,希望對(duì)大家有所幫助!

為什么需要性能監(jiān)控?聊聊Node.js性能監(jiān)控

為什么需要性能監(jiān)控

Node作為Javascript在服務(wù)端的一個(gè)運(yùn)行時(shí)(Runtime),極大的豐富了Javascript的應(yīng)用場(chǎng)景。

但是Node.js Runtime本身是一個(gè)黑盒,我們無(wú)法感知運(yùn)行時(shí)的狀態(tài),對(duì)于線(xiàn)上問(wèn)題也難以復(fù)現(xiàn)

因此性能監(jiān)控是Node.js應(yīng)用程序「正常運(yùn)行」的基石。不僅可以隨時(shí)監(jiān)控運(yùn)行時(shí)的各項(xiàng)指標(biāo),還可以幫助排查異常場(chǎng)景問(wèn)題。

組成部分

性能監(jiān)控可以分為兩個(gè)部分:

  • 性能指標(biāo)的采集和展示

    • 進(jìn)程級(jí)別的數(shù)據(jù):CPU,Memory,Heap,GC等
    • 系統(tǒng)級(jí)別的數(shù)據(jù):磁盤(pán)占用率,I/O負(fù)載,TCP/UDP連接狀態(tài)等
    • 應(yīng)用層的數(shù)據(jù):QPS,慢HTTP,業(yè)務(wù)處理鏈路日志等
  • 性能數(shù)據(jù)的抓取和分析

    • Heapsnapshot:堆內(nèi)存快照
    • Cpuprofile:CPU快照
    • Coredump:應(yīng)用崩潰快照

方案對(duì)比

為什么需要性能監(jiān)控?聊聊Node.js性能監(jiān)控

從上圖可以看到目前主流的三種Node.js性能監(jiān)控方案的優(yōu)缺點(diǎn),以下是簡(jiǎn)單介紹這三種方案的組成:

  • Prometheus

    • prom-client是prometheus的nodejs實(shí)現(xiàn),用于采集性能指標(biāo)
    • grafana是一個(gè)可視化平臺(tái),用來(lái)展示各種數(shù)據(jù)圖表,支持prometheus的接入
    • 只支持了性能指標(biāo)的采集和展示,排查問(wèn)題還需要其他快照工具,才能組成閉環(huán)
  • AliNode

    • alinode是一個(gè)兼容官方nodejs的拓展運(yùn)行時(shí),提供了一些額外功能:

      • v8的運(yùn)行時(shí)內(nèi)存狀態(tài)監(jiān)控
      • libuv的運(yùn)行時(shí)狀態(tài)監(jiān)控
      • 在線(xiàn)故障診斷功能:堆快照、CPU Profile、GC Trace等
    • agenthub是一個(gè)常駐進(jìn)程,用來(lái)收集性能指標(biāo)并上報(bào)

      • 整合了agentx + commdx的便利工具
    • 整體從監(jiān)控,展示,快照,分析形成閉環(huán),接入便捷簡(jiǎn)單,但是拓展運(yùn)行時(shí)還是有風(fēng)險(xiǎn)

  • Easy-Monitor

    • xprofiler 負(fù)責(zé)進(jìn)行實(shí)時(shí)的運(yùn)行時(shí)狀態(tài)采樣,以及輸出性能日志(也就是性能數(shù)據(jù)的抓取)
    • xtransit 負(fù)責(zé)性能日志的采集與傳輸
    • 跟AliNode最大的區(qū)別在于使用了Node.js Addon來(lái)實(shí)現(xiàn)采樣器

性能指標(biāo)

CPU

為什么需要性能監(jiān)控?聊聊Node.js性能監(jiān)控

通過(guò)process.cpuUsage()可以獲取當(dāng)前進(jìn)程的CPU耗時(shí)數(shù)據(jù),返回值的單位是微秒

  • user:進(jìn)程執(zhí)行時(shí)本身消耗的CPU時(shí)間
  • system:進(jìn)程執(zhí)行時(shí)系統(tǒng)消耗的CPU時(shí)間

Memory

為什么需要性能監(jiān)控?聊聊Node.js性能監(jiān)控

通過(guò)process.memoryUsage()可以獲取當(dāng)前進(jìn)程的內(nèi)存分配數(shù)據(jù),返回值的單位是字節(jié)

  • rss:常駐內(nèi)存,node進(jìn)程分配的總內(nèi)存大小
  • heapTotal:v8申請(qǐng)的堆內(nèi)存大小
  • heapUsed:v8已使用的堆內(nèi)存大小
  • external:v8管理的C++所占用的內(nèi)存大小
  • arrayBuffers:分配給ArrayBuffer的內(nèi)存大小

為什么需要性能監(jiān)控?聊聊Node.js性能監(jiān)控

從上圖可以看出,rss包含代碼段(Code Segment)、棧內(nèi)存(Stack)、堆內(nèi)存(Heap)

  • Code Segment:存儲(chǔ)代碼段
  • Stack:存儲(chǔ)局部變量和管理函數(shù)調(diào)用
  • Heap:存儲(chǔ)對(duì)象、閉包、或者其他一切

Heap

通過(guò)v8.getHeapStatistics()v8.getHeapSpaceStatistics()可以獲取v8堆內(nèi)存和堆空間的分析數(shù)據(jù),下圖展示了v8的堆內(nèi)存組成分布:

為什么需要性能監(jiān)控?聊聊Node.js性能監(jiān)控

堆內(nèi)存空間先劃分為空間(space),空間又劃分為頁(yè)(page),內(nèi)存按照1MB對(duì)齊進(jìn)行分頁(yè)。

  • New Space:新生代空間,用來(lái)存放一些生命周期比較短的對(duì)象數(shù)據(jù),平分為兩個(gè)空間(空間類(lèi)型為semi space):from spaceto space

    • 晉升條件:在New space中經(jīng)過(guò)兩次GC依舊存活
  • Old Space:老生代空間,用來(lái)存放New Space晉升的對(duì)象

  • Code Space:存放v8 JIT編譯后的可執(zhí)行代碼

  • Map Space:存放Object指向的隱藏類(lèi)的指針對(duì)象,隱藏類(lèi)指針是v8根據(jù)運(yùn)行時(shí)記錄下的對(duì)象布局結(jié)構(gòu),用于快速訪(fǎng)問(wèn)對(duì)象成員

  • Large Object Space:用于存放大于1MB而無(wú)法分配到頁(yè)的對(duì)象

GC

v8的垃圾回收算法分為兩類(lèi):

  • Major GC:使用了Mark-Sweep-Compact算法,用于老生代的對(duì)象回收
  • Minor GC:使用了Scavenge算法,用于新生代的對(duì)象回收

Scavenge

為什么需要性能監(jiān)控?聊聊Node.js性能監(jiān)控

前提:New space分為fromto兩個(gè)對(duì)象空間

觸發(fā)時(shí)機(jī):當(dāng)New space空間滿(mǎn)了

步驟:

  • from space中,進(jìn)行寬度優(yōu)先遍歷

  • 發(fā)現(xiàn)存活(可達(dá))對(duì)象

    • 已經(jīng)存活過(guò)一次(經(jīng)歷過(guò)一次Scavange),晉升到Old space
    • 其他的復(fù)制到to space
  • 當(dāng)復(fù)制結(jié)束時(shí),to space中只有存活的對(duì)象,from space就被清空了

  • 交換from spaceto space,開(kāi)始下一輪Scavenge

適用于回收頻繁,內(nèi)存不大的對(duì)象,典型的空間換時(shí)間的策略,缺點(diǎn)是浪費(fèi)了多一倍的空間

Mark-Sweep-Compact

為什么需要性能監(jiān)控?聊聊Node.js性能監(jiān)控

三個(gè)步驟:標(biāo)記、清除、整理

觸發(fā)時(shí)機(jī):當(dāng)Old space空間滿(mǎn)了

步驟:

  • Marking(三色標(biāo)記法)

    • 白色:代表可回收對(duì)象
    • 黑色:代表不可回收對(duì)象,且其所產(chǎn)生的引用都已經(jīng)掃描完畢
    • 灰色:代表不可回收對(duì)象,且其所產(chǎn)生的引用還沒(méi)掃描完
    • 將V8根對(duì)象直接引用的對(duì)象放進(jìn)一個(gè)marking queue(顯式棧)中,并將這些對(duì)象標(biāo)記為灰色
    • 從這些對(duì)象開(kāi)始做深度優(yōu)先遍歷,每訪(fǎng)問(wèn)一個(gè)對(duì)象,將該對(duì)象從marking queue pop出來(lái),并標(biāo)記為黑色
    • 然后將該對(duì)象引用下的所有白色對(duì)象標(biāo)記為灰色,pushmarking queue上,如此往復(fù)
    • 直到棧上所有對(duì)象都pop掉為止,老生代的對(duì)象只剩下黑色(不可回收)和白色(可以回收)兩種了
    • PS:當(dāng)一個(gè)對(duì)象太大,無(wú)法push到空間有限的棧時(shí),v8會(huì)把這個(gè)對(duì)象保留灰色跳過(guò),將整個(gè)棧標(biāo)記為溢出狀態(tài)(overflowed),等棧清空后,再次進(jìn)行遍歷標(biāo)記,這樣導(dǎo)致需要額外掃描一遍堆
  • Sweep

    • 清除白色對(duì)象
    • 會(huì)造成內(nèi)存空間不連續(xù)
  • Compact

    • 由于Sweep會(huì)造成內(nèi)存空間不連續(xù),不利于新對(duì)象進(jìn)入GC
    • 把黑色(存活)對(duì)象移到Old space的一端,這樣清除出來(lái)的空間就是連續(xù)完整的
    • 雖然可以解決內(nèi)存碎片問(wèn)題,但是會(huì)增加停頓時(shí)間(執(zhí)行速度慢)
    • 在空間不足以對(duì)新生代晉升過(guò)來(lái)的對(duì)象進(jìn)行分配時(shí)才使用mark-compact

Stop-The-World

在最開(kāi)始v8進(jìn)行垃圾回收時(shí),需要停止程序的運(yùn)行,掃描完整個(gè)堆,回收完內(nèi)存,才會(huì)重新運(yùn)行程序。這種行為就叫全停頓(Stop-The-World

雖然新生代活動(dòng)對(duì)象較小,回收頻繁,全停頓,影響不大,但是老生代存活對(duì)象多且大,標(biāo)記、清理、整理等造成的停頓就會(huì)比較嚴(yán)重。

優(yōu)化策略

  • 增量回收(Incremental Marking):在Marking階段,當(dāng)堆達(dá)到一定大小時(shí),開(kāi)始增量GC,每次分配了一定量的內(nèi)存后,就暫停運(yùn)行程序,做幾毫秒到幾十毫秒的marking,然后恢復(fù)程序的運(yùn)行。

這個(gè)理念其實(shí)有點(diǎn)像React框架中的Fiber架構(gòu),只有在瀏覽器的空閑時(shí)間才會(huì)去遍歷Fiber Tree執(zhí)行對(duì)應(yīng)的任務(wù),否則延遲執(zhí)行,盡可能少地影響主線(xiàn)程的任務(wù),避免應(yīng)用卡頓,提升應(yīng)用性能。

  • 并發(fā)清除(Concurrent Sweeping):讓其他線(xiàn)程同時(shí)來(lái)做 sweeping,而不用擔(dān)心和執(zhí)行程序的主線(xiàn)程沖突
  • 并行清除(Parallel Sweeping):讓多個(gè) Sweeping 線(xiàn)程同時(shí)工作,提升 sweeping 的吞吐量,縮短整個(gè) GC 的周期

空間調(diào)整

由于v8對(duì)于新老生代的空間默認(rèn)限制了大小

  • New space 默認(rèn)限制:64位系統(tǒng)為32M,32位系統(tǒng)為16M
  • Old space 默認(rèn)限制:64位系統(tǒng)為1400M,32位系統(tǒng)為700M

因此node提供了兩個(gè)參數(shù)用于調(diào)整新老生代的空間上限

  • --max-semi-space-size:設(shè)置New Space空間的最大值
  • --max-old-space-size:設(shè)置Old Space空間的最大值

查看GC日志

node也提供了三種查看GC日志的方式:

  • --trace_gc:一行日志簡(jiǎn)要描述每次GC時(shí)的時(shí)間、類(lèi)型、堆大小變化和產(chǎn)生原因
  • --trace_gc_verbose:展示每次GC后每個(gè)V8堆空間的詳細(xì)狀況
  • --trace_gc_nvp:每次GC的詳細(xì)鍵值對(duì)信息,包含GC類(lèi)型,暫停時(shí)間,內(nèi)存變化等

由于GC日志比較原始,還需要二次處理,可以使用AliNode團(tuán)隊(duì)開(kāi)發(fā)的v8-gc-log-parser

快照工具

Heapsnapshot

對(duì)于運(yùn)行程序的堆內(nèi)存進(jìn)行快照采樣,可以用來(lái)分析內(nèi)存的消耗以及變化

生成方式

生成.heapsnapshot文件有以下幾種方式:

  • 使用heapdump

為什么需要性能監(jiān)控?聊聊Node.js性能監(jiān)控

  • 使用v8的heap-profile

為什么需要性能監(jiān)控?聊聊Node.js性能監(jiān)控

  • 使用nodejs內(nèi)置的v8模塊提供的api

    • v8.getHeapSnapshot()

    為什么需要性能監(jiān)控?聊聊Node.js性能監(jiān)控

    • v8.writeHeapSnapshot(fileName)

    為什么需要性能監(jiān)控?聊聊Node.js性能監(jiān)控

  • 使用v8-profiler-next

為什么需要性能監(jiān)控?聊聊Node.js性能監(jiān)控

分析方法

生成的.heapsnapshot文件,可以在Chrome devtools工具欄的Memory,選擇上傳后,展示結(jié)果如下圖:

為什么需要性能監(jiān)控?聊聊Node.js性能監(jiān)控

默認(rèn)的視圖是Summary視圖,在這里我們要關(guān)注最右邊兩欄:Shallow SizeRetained Size

  • Shallow Size:表示該對(duì)象本身在v8堆內(nèi)存分配的大小
  • Retained Size:表示該對(duì)象所有引用對(duì)象的Shallow Size之和

當(dāng)發(fā)現(xiàn)Retained Size特別大時(shí),該對(duì)象內(nèi)部可能存在內(nèi)存泄漏,可以進(jìn)一步展開(kāi)去定位問(wèn)題

還有Comparison視圖是用于比較分析兩個(gè)不同時(shí)段的堆快照,通過(guò)Delta列可以篩選出內(nèi)存變化最大的對(duì)象

為什么需要性能監(jiān)控?聊聊Node.js性能監(jiān)控

Cpuprofile

對(duì)于運(yùn)行程序的CPU進(jìn)行快照采樣,可以用來(lái)分析CPU的耗時(shí)及占比

生成方式

生成.cpuprofile文件有以下幾種方式:

  • v8-profiler(node官方提供的工具,不過(guò)已經(jīng)無(wú)法支持node v10以上的版本,并不再維護(hù))
  • v8-profiler-next(國(guó)人維護(hù)版本,支持到最新node v18,持續(xù)維護(hù)中)

這是采集5分鐘的CPU Profile樣例

為什么需要性能監(jiān)控?聊聊Node.js性能監(jiān)控

分析方法

生成的.cpuprofile文件,可以在Chrome devtools工具欄的Javascript Profiler(不在默認(rèn)tab,需要在工具欄右側(cè)的

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
国产精品视频一区二区三区综合| 99国产精品久久久久久久成人热| 亚洲韩日在线| 欧美午夜精彩| 久久久久免费av| 美女福利一区二区三区| www在线观看黄色| 亚洲啊v在线| 久久久国产精品一区二区中文| 欧美一区二区三区高清视频| 日韩国产欧美| 成人av动漫在线观看| 91久久中文| 综合激情网...| 好看的av在线不卡观看| 国产亚洲在线| 亚洲欧美视频| 日韩欧美精品一区二区综合视频| 国产乱人伦精品一区| 久久精品亚洲一区二区| 亚洲精品福利电影| 狠狠爱www人成狠狠爱综合网| 日韩精品看片| 日韩极品在线观看| 亚洲www啪成人一区二区| 怡红院精品视频在线观看极品| 亚洲精品高潮| 国产色播av在线| 在线午夜精品| 日韩高清一级| 狠狠久久伊人中文字幕| jiujiure精品视频播放| 久久国产精品色av免费看| 91日韩欧美| 日韩综合一区二区| 国产成人免费精品| 国产国产精品| 久久中文在线| 日本三级亚洲精品| 在线日韩成人| 亚洲二区在线| 国产精品99久久精品| 日韩午夜精品| 麻豆视频在线看| 国产亚洲精品v| 特黄特色欧美大片| 久久国产精品免费精品3p| 亚洲成人av观看| 国产激情精品一区二区三区| 亚洲乱码久久| 久久亚洲图片| 亚洲欧美日韩精品一区二区| 日韩免费在线| 欧美黄色一区| 日韩一区二区三区在线看| 欧美日韩激情| 亚洲二区精品| 一本一道久久a久久精品蜜桃| 不卡福利视频| 韩日一区二区| 国产精品多人| 麻豆精品少妇| 精品一区二区三区中文字幕| 久久午夜视频| 欧美在线亚洲综合一区| 日韩中文字幕高清在线观看| 国产精品久久久久久久久妇女| 成人午夜网址| 欧美sss在线视频| 精品欧美激情在线观看| 亚洲成av在线| 欧美在线亚洲综合一区| 亚洲欧美日韩综合国产aⅴ| 日韩一区二区免费看| 欧美日韩国产在线观看网站| 在线视频日韩| 国产毛片久久久| 嫩呦国产一区二区三区av| 久久wwww| 久久电影tv| 国产国产精品| 国产美女撒尿一区二区| 美女久久精品| 免费福利视频一区二区三区| 成人精品中文字幕| 免费精品视频在线| 国产伦理一区| 亚洲一级高清| 日韩视频一二区| 欧美日韩在线精品一区二区三区激情综合| 亚洲精品欧美| 激情亚洲影院在线观看| 蜜臀91精品国产高清在线观看| 欧美午夜不卡| 亚洲乱码视频| 日韩精品午夜| 四虎成人精品一区二区免费网站| 日韩免费看片| 国产精品视频一区二区三区四蜜臂| 国产成人a视频高清在线观看| 在线一区欧美| 国产精品久久久久久久免费观看 | 99热精品在线| 亚欧洲精品视频在线观看| 麻豆精品久久| 亚洲精品九九| 久久三级福利| 国产精品一区二区三区美女 | 国产一区二区视频在线看| 亚洲综合二区| 国产成人免费视频网站视频社区| 日韩不卡一二三区| 欧美在线资源| 午夜av成人| 日韩av在线播放网址| 免费视频久久| 四虎影视精品| 国产精品毛片一区二区在线看| 日韩高清三区| 免费日韩视频| 欧美一区二区三区激情视频| 激情综合婷婷| 国产探花一区二区| 日韩激情一二三区| 亚洲欧美久久精品| www.51av欧美视频| 精品久久精品| 亚洲精品福利电影| 久久伊人国产| 国产精品va| 久久精品国产福利| 美女久久久久久| 欧美在线91| 日韩欧美中文字幕一区二区三区| 午夜欧美精品| 丝袜美腿亚洲一区二区图片| 欧美在线综合| 蜜桃视频在线观看一区二区| 亚洲作爱视频| 免费在线成人网| 中文字幕系列一区| 欧美日韩一二| 日韩午夜在线| 欧美一级二级三级视频| 国产精品调教视频| 精品一区二区三区在线观看视频| 国产乱码精品一区二区亚洲| 国产精品免费99久久久| 精品国产a一区二区三区v免费| 国产高潮在线| 欧美精品高清| 久久xxxx精品视频| 国产精选久久| 日韩高清不卡| 亚洲精品韩国| 日本亚洲视频在线| 国产福利资源一区| 日韩在线高清| 日本不卡在线视频| 99久久婷婷这里只有精品| 日韩中文字幕一区二区三区| 国模精品一区| 视频一区二区三区在线| 国产欧美日韩在线一区二区 | 中文无码久久精品| 麻豆国产精品| 国产日韩欧美一区二区三区在线观看| 欧洲精品一区二区三区| 欧洲av一区二区| 亚洲一区导航| 蜜臀久久99精品久久一区二区 | 国产精品久久亚洲不卡| 日韩视频网站在线观看| 日韩制服丝袜av| 成人亚洲一区二区| 中文在线日韩| 国产一区欧美| 亚洲欧洲av| 女人天堂亚洲aⅴ在线观看| 国产精品一区二区精品| 亚洲自拍另类| 日韩av影院| 欧美日韩国产一区精品一区| 国产精品麻豆成人av电影艾秋 | 精品成人18| 欧美综合精品| 在线精品观看| 激情综合自拍| 98精品久久久久久久| 久久精品99久久久| 亚洲免费观看| 亚洲最新无码中文字幕久久| 日韩精品a在线观看91| 国产精品毛片| 中文字幕高清在线播放| 少妇高潮一区二区三区99| 日韩精品一二三| 夜久久久久久| 亚洲男女自偷自拍| 中文字幕一区日韩精品|