久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

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

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

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

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

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

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

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

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

      組成部分

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

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

        • 進(jìn)程級別的數(shù)據(jù):CPU,Memory,Heap,GC等
        • 系統(tǒng)級別的數(shù)據(jù):磁盤占用率,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)用崩潰快照

      方案對比

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

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

      • Prometheus

        • prom-client是prometheus的nodejs實(shí)現(xiàn),用于采集性能指標(biāo)
        • grafana是一個(gè)可視化平臺,用來展示各種數(shù)據(jù)圖表,支持prometheus的接入
        • 只支持了性能指標(biāo)的采集和展示,排查問題還需要其他快照工具,才能組成閉環(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)控
          • 在線故障診斷功能:堆快照、CPU Profile、GC Trace等
        • agenthub是一個(gè)常駐進(jìn)程,用來收集性能指標(biāo)并上報(bào)

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

      • Easy-Monitor

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

      性能指標(biāo)

      CPU

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

      通過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)控

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

      • rss:常駐內(nèi)存,node進(jìn)程分配的總內(nèi)存大小
      • heapTotal:v8申請的堆內(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ǔ)對象、閉包、或者其他一切

      Heap

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

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

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

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

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

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

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

      • Large Object Space:用于存放大于1MB而無法分配到頁的對象

      GC

      v8的垃圾回收算法分為兩類:

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

      Scavenge

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

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

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

      步驟:

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

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

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

      • 交換from spaceto space,開始下一輪Scavenge

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

      Mark-Sweep-Compact

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

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

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

      步驟:

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

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

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

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

      Stop-The-World

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

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

      優(yōu)化策略

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

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

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

      空間調(diào)整

      由于v8對于新老生代的空間默認(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:一行日志簡要描述每次GC時(shí)的時(shí)間、類型、堆大小變化和產(chǎn)生原因
      • --trace_gc_verbose:展示每次GC后每個(gè)V8堆空間的詳細(xì)狀況
      • --trace_gc_nvp:每次GC的詳細(xì)鍵值對信息,包含GC類型,暫停時(shí)間,內(nèi)存變化等

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

      快照工具

      Heapsnapshot

      對于運(yùn)行程序的堆內(nèi)存進(jìn)行快照采樣,可以用來分析內(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:表示該對象本身在v8堆內(nèi)存分配的大小
      • Retained Size:表示該對象所有引用對象的Shallow Size之和

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

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

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

      Cpuprofile

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

      生成方式

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

      • v8-profiler(node官方提供的工具,不過已經(jīng)無法支持node v10以上的版本,并不再維護(hù))
      • v8-profiler-next(國人維護(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號-2    滬公網(wǎng)安備31011702889846號