站長資訊網
        最全最豐富的資訊網站

        為什么需要性能監控?聊聊Node.js性能監控

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

        為什么需要性能監控?聊聊Node.js性能監控

        為什么需要性能監控

        Node作為Javascript在服務端的一個運行時(Runtime),極大的豐富了Javascript的應用場景。

        但是Node.js Runtime本身是一個黑盒,我們無法感知運行時的狀態,對于線上問題也難以復現

        因此性能監控是Node.js應用程序「正常運行」的基石。不僅可以隨時監控運行時的各項指標,還可以幫助排查異常場景問題。

        組成部分

        性能監控可以分為兩個部分:

        • 性能指標的采集和展示

          • 進程級別的數據:CPU,Memory,Heap,GC等
          • 系統級別的數據:磁盤占用率,I/O負載,TCP/UDP連接狀態等
          • 應用層的數據:QPS,慢HTTP,業務處理鏈路日志等
        • 性能數據的抓取和分析

          • Heapsnapshot:堆內存快照
          • Cpuprofile:CPU快照
          • Coredump:應用崩潰快照

        方案對比

        為什么需要性能監控?聊聊Node.js性能監控

        從上圖可以看到目前主流的三種Node.js性能監控方案的優缺點,以下是簡單介紹這三種方案的組成:

        • Prometheus

          • prom-client是prometheus的nodejs實現,用于采集性能指標
          • grafana是一個可視化平臺,用來展示各種數據圖表,支持prometheus的接入
          • 只支持了性能指標的采集和展示,排查問題還需要其他快照工具,才能組成閉環
        • AliNode

          • alinode是一個兼容官方nodejs的拓展運行時,提供了一些額外功能:

            • v8的運行時內存狀態監控
            • libuv的運行時狀態監控
            • 在線故障診斷功能:堆快照、CPU Profile、GC Trace等
          • agenthub是一個常駐進程,用來收集性能指標并上報

            • 整合了agentx + commdx的便利工具
          • 整體從監控,展示,快照,分析形成閉環,接入便捷簡單,但是拓展運行時還是有風險

        • Easy-Monitor

          • xprofiler 負責進行實時的運行時狀態采樣,以及輸出性能日志(也就是性能數據的抓取)
          • xtransit 負責性能日志的采集與傳輸
          • 跟AliNode最大的區別在于使用了Node.js Addon來實現采樣器

        性能指標

        CPU

        為什么需要性能監控?聊聊Node.js性能監控

        通過process.cpuUsage()可以獲取當前進程的CPU耗時數據,返回值的單位是微秒

        • user:進程執行時本身消耗的CPU時間
        • system:進程執行時系統消耗的CPU時間

        Memory

        為什么需要性能監控?聊聊Node.js性能監控

        通過process.memoryUsage()可以獲取當前進程的內存分配數據,返回值的單位是字節

        • rss:常駐內存,node進程分配的總內存大小
        • heapTotal:v8申請的堆內存大小
        • heapUsed:v8已使用的堆內存大小
        • external:v8管理的C++所占用的內存大小
        • arrayBuffers:分配給ArrayBuffer的內存大小

        為什么需要性能監控?聊聊Node.js性能監控

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

        • Code Segment:存儲代碼段
        • Stack:存儲局部變量和管理函數調用
        • Heap:存儲對象、閉包、或者其他一切

        Heap

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

        為什么需要性能監控?聊聊Node.js性能監控

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

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

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

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

        • Map Space:存放Object指向的隱藏類的指針對象,隱藏類指針是v8根據運行時記錄下的對象布局結構,用于快速訪問對象成員

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

        GC

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

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

        Scavenge

        為什么需要性能監控?聊聊Node.js性能監控

        前提:New space分為fromto兩個對象空間

        觸發時機:當New space空間滿了

        步驟:

        • from space中,進行寬度優先遍歷

        • 發現存活(可達)對象

          • 已經存活過一次(經歷過一次Scavange),晉升到Old space
          • 其他的復制到to space
        • 當復制結束時,to space中只有存活的對象,from space就被清空了

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

        適用于回收頻繁,內存不大的對象,典型的空間換時間的策略,缺點是浪費了多一倍的空間

        Mark-Sweep-Compact

        為什么需要性能監控?聊聊Node.js性能監控

        三個步驟:標記、清除、整理

        觸發時機:當Old space空間滿了

        步驟:

        • Marking(三色標記法)

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

          • 清除白色對象
          • 會造成內存空間不連續
        • Compact

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

        Stop-The-World

        在最開始v8進行垃圾回收時,需要停止程序的運行,掃描完整個堆,回收完內存,才會重新運行程序。這種行為就叫全停頓(Stop-The-World

        雖然新生代活動對象較小,回收頻繁,全停頓,影響不大,但是老生代存活對象多且大,標記、清理、整理等造成的停頓就會比較嚴重。

        優化策略

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

        這個理念其實有點像React框架中的Fiber架構,只有在瀏覽器的空閑時間才會去遍歷Fiber Tree執行對應的任務,否則延遲執行,盡可能少地影響主線程的任務,避免應用卡頓,提升應用性能。

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

        空間調整

        由于v8對于新老生代的空間默認限制了大小

        • New space 默認限制:64位系統為32M,32位系統為16M
        • Old space 默認限制:64位系統為1400M,32位系統為700M

        因此node提供了兩個參數用于調整新老生代的空間上限

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

        查看GC日志

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

        • --trace_gc:一行日志簡要描述每次GC時的時間、類型、堆大小變化和產生原因
        • --trace_gc_verbose:展示每次GC后每個V8堆空間的詳細狀況
        • --trace_gc_nvp:每次GC的詳細鍵值對信息,包含GC類型,暫停時間,內存變化等

        由于GC日志比較原始,還需要二次處理,可以使用AliNode團隊開發的v8-gc-log-parser

        快照工具

        Heapsnapshot

        對于運行程序的堆內存進行快照采樣,可以用來分析內存的消耗以及變化

        生成方式

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

        • 使用heapdump

        為什么需要性能監控?聊聊Node.js性能監控

        • 使用v8的heap-profile

        為什么需要性能監控?聊聊Node.js性能監控

        • 使用nodejs內置的v8模塊提供的api

          • v8.getHeapSnapshot()

          為什么需要性能監控?聊聊Node.js性能監控

          • v8.writeHeapSnapshot(fileName)

          為什么需要性能監控?聊聊Node.js性能監控

        • 使用v8-profiler-next

        為什么需要性能監控?聊聊Node.js性能監控

        分析方法

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

        為什么需要性能監控?聊聊Node.js性能監控

        默認的視圖是Summary視圖,在這里我們要關注最右邊兩欄:Shallow SizeRetained Size

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

        當發現Retained Size特別大時,該對象內部可能存在內存泄漏,可以進一步展開去定位問題

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

        為什么需要性能監控?聊聊Node.js性能監控

        Cpuprofile

        對于運行程序的CPU進行快照采樣,可以用來分析CPU的耗時及占比

        生成方式

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

        • v8-profiler(node官方提供的工具,不過已經無法支持node v10以上的版本,并不再維護)
        • v8-profiler-next(國人維護版本,支持到最新node v18,持續維護中)

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

        為什么需要性能監控?聊聊Node.js性能監控

        分析方法

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

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 国产精品久久久久影院色| 精品亚洲一区二区三区在线播放 | 老司机午夜网站国内精品久久久久久久久| 亚洲av无码国产精品夜色午夜| 国产免费久久精品99久久| 99久久99这里只有免费费精品| 亚洲国产精品尤物YW在线观看| 国产精品高清2021在线 | 免费短视频软件精品一区二区| 四虎国产精品永久地址99| 国产精品国色综合久久| 亚洲AV日韩精品久久久久久久 | www.亚洲精品| 亚洲精品美女久久久久99| 国产精品亚洲美女久久久| 国产精品成人不卡在线观看 | 在线精品亚洲一区二区| 日本一区二区三区精品国产| 国产精品女同一区二区久久| 国内精品久久国产大陆| 500av导航大全精品| 国产精品亚洲片在线| 精品一区二区三区免费毛片爱 | 99热精品在线观看| 国产精品白浆在线观看免费| 久久精品毛片免费观看| 奇米精品视频一区二区三区| 中文字幕在线精品视频入口一区| 久久久久久国产精品无码下载 | 91久久精品无码一区二区毛片| 久久91综合国产91久久精品| 华人在线精品免费观看| 国产精品免费观看| 秋霞午夜鲁丝片午夜精品久| 亚洲精品成人av在线| 国产va免费精品| 国产成人精品久久亚洲| 国产韩国精品一区二区三区| 国产成人久久久精品二区三区| 国产精品v欧美精品v日本精| 国产精品国产三级国产潘金莲|