天天看點

alinode-基于Node.js運作時的應用性能管了解決方案

本文主要由中生代技術群的技術讨論分享整理而成,作者張子發(花名:穆客)是阿裡雲node.js方面的專家。本文主要是alinode的開發過程總結,同時希望能造福廣大node.js開發者。

今天分享node.js應用管理方面的心得,對node.js感興趣的朋友可以關注下更多内容可以參考團隊裡面樸靈同學的《深入淺出node.js》,哈哈~

針對node.js應用管理,我們做了一套解決方案alinode,是針對node.js應用的性能管理方面,解決生産環境下node.js應用的深度監控和線上故障診斷

alinode-基于Node.js運作時的應用性能管了解決方案
alinode-基于Node.js運作時的應用性能管了解決方案
alinode-基于Node.js運作時的應用性能管了解決方案
alinode-基于Node.js運作時的應用性能管了解決方案
alinode-基于Node.js運作時的應用性能管了解決方案
alinode-基于Node.js運作時的應用性能管了解決方案
alinode-基于Node.js運作時的應用性能管了解決方案
alinode-基于Node.js運作時的應用性能管了解決方案

沿着提出問題->分析問題->解決問題的道路,針對上面的問題,我們做了alinode

alinode-基于Node.js運作時的應用性能管了解決方案

下面是一些具體的監控名額在實際應用中的用途

alinode-基于Node.js運作時的應用性能管了解決方案

node程序級别的記憶體資料,主要是記憶體使用狀态和趨勢, 到底是v8堆上記憶體用多了,還是堆外記憶體使用的多

如果記憶體不合理,優化的時候就有了方向

alinode-基于Node.js運作時的應用性能管了解決方案

這個是具體到v8上各個space的使用情況, 新生代/老生代/大對象空間之類的,也是給優化提供更精确的知道意義

alinode-基于Node.js運作時的應用性能管了解決方案

垃圾回收時間占比,因為在垃圾回收的時候,使用者代碼是停止的,是以這個數值過高,也是需要關注的

alinode-基于Node.js運作時的應用性能管了解決方案

這個是qps和timer狀态和趨勢,qps/rt堆業務是和重要的名額,timer本身是比較耗資源的,如果timer數量不正常,那麼需要關注下,因為寫代碼的人應該知道具體使用timer的情況,是以異常還是比較容易判斷的

alinode-基于Node.js運作時的應用性能管了解決方案

這個是系統級别(同一伺服器上所有node程序總計)的一些load/qps/memory/cpu之類的資訊。

下面是一些診斷的試圖,在發現系統異常後,可以做堆快照, cpuprofiling來分析,因為代碼邏輯錯誤之外的問題,基本上最終都歸于記憶體和cpu的問題

alinode-基于Node.js運作時的應用性能管了解決方案

這個圖是比較糊的, 用過chrome devtools的同學應該比較熟悉,就是分析cpuprofiling,有三種視圖

alinode-基于Node.js運作時的應用性能管了解決方案
alinode-基于Node.js運作時的應用性能管了解決方案

與原生的node想必,我們在v8層面多輸出了一些資訊,是以看到代碼是否被優化過

alinode-基于Node.js運作時的應用性能管了解決方案
alinode-基于Node.js運作時的應用性能管了解決方案

與原生的node想必,我們在v8層面多輸出了一些資訊,是以看到代碼是否被優化過這兩個圖是堆快照的輸出,基本上所有與記憶體相關的問題,仔細分析下都能知道到原因,可以直接把堆上占用記憶體排前幾位的對象指出,展開後就能分析到對應到代碼哪一部分了

alinode-基于Node.js運作時的應用性能管了解決方案

下面說幾個解決問題的案例

一個是cpu相關的,某使用者在高峰期,cpu會到80-90%的樣子,找不出原因,profiling後,發現是這樣的

alinode-基于Node.js運作時的應用性能管了解決方案
alinode-基于Node.js運作時的應用性能管了解決方案

處理函數降到了 24%不到一點,其實我們做開發的都知道,如果發現問題了,解決問題不是很難的事情

alinode-基于Node.js運作時的應用性能管了解決方案

這裡有個很誇張的值,就是發現記憶體慢慢增長,大了沒辦法就重新開機;做了個堆快照後,發現是tlswrap這個獨享有幾萬個...

原來是有個庫封裝的問題,本來一條連結就可以了,結果每次都建立一個新的。不釋放...然後堆起來了

類似的問題很多

可能對群裡面的大牛而言,這些錯誤會犯的比較少,可是對那些不是大牛的同學來講,有時候還真難以避免這些問題,樸靈同學也犯過記憶體洩露的錯誤....因為有個資料庫異常沒有處理,然後堆起來,v8的堆就爆掉了

接下來分享下做alinode的過程中對v8的學習

alinode-基于Node.js運作時的應用性能管了解決方案

我們也不敢說了解了v8了,花了大部分時間在v8的學習上面

下面是一些學習筆記的例子,詳細内容就不列了,隻列了一些标題

alinode-基于Node.js運作時的應用性能管了解決方案
alinode-基于Node.js運作時的應用性能管了解決方案
alinode-基于Node.js運作時的應用性能管了解決方案
alinode-基于Node.js運作時的應用性能管了解決方案
alinode-基于Node.js運作時的應用性能管了解決方案
alinode-基于Node.js運作時的應用性能管了解決方案
alinode-基于Node.js運作時的應用性能管了解決方案

<a target="_blank" href="http://alinode.aliyun.com/">http://alinode.aliyun.com/</a>

q&amp;a

問題1:mysql在update某行的過程中,其他線程是不是不能讀這一行了?等update完畢才能讀?

這個不是我的領域哎... 這方面的專家誰幫忙回答下吧

問題2:張老師,你們在調優過程中是否對v8引擎作一些優化呢,是否可以舉個案例?

這個也是學習v8的出發點, 其中一個優化是對arrayjoin的彙編改進了一下,原來隻支援ascii,改進後也支援中文

問題3:看您介紹的很多都是宏觀上的監測,在調優過程是否有發現像cve-2015-8027 denial of service vulnerability這樣的nodejs漏洞呢?

安全漏洞倒是沒有發現,發現了nodejs本身的一些性能問題,踢給社群了

問題4:nodejs的性能是否還有很大的潛力挖掘呢?

個人覺得不會有幾倍的提升了, 小改進會有

我以前是做c開發的,開始非常難以接受js,後來做alinode的過程中發現,這個東西開發效率太高了,比c高了不知道多少倍,這個非常重要,尤其在一些創業公司中,開發效率的提高,然後還有無數的庫的支援,當然這也帶來了庫本身參差不齊的問題,是以才需要應用性能管理

問題5:張老師,能否簡單列舉下node.js在ali的主要應用場景?

裡面也有deadhorse同學在天貓那邊的應用,基本上,阿裡内部有幾百個應用在用node.js了,但是核心交易系統沒有用,那個是java的天下,哈哈

問題6 node.js 程序間緩存共享你們有用到嗎?

我寫過一個子產品,用共享記憶體的,适合同一台伺服器内不同程序間應用,但是沒有用到線上,因為線上還要考慮不同伺服器之間的問題,使用tair了

問題7 阿裡的node主要是前段工程師在寫還是伺服器端工程師在寫

都有,比例我還真的不清楚,估計現在還是前端多點吧。

問題8:慢請求調用鍊比較長這個怎麼排查的

這個先把慢路徑找出來,然後再想辦法解決吧

問題9:為何選擇了node.js,而不是erlang,go這些?除了開發效率和并發之類的考慮,技術選型上是否還有其他關注點?

這個貌似這個群還是另外一個群正在讨論,選node.js是因為有這方面的人才儲備,國内一夥做node比較早的阿裡有好幾個,然後就是js語言與前端統一,溝通成本降低很多

                                                        中生代技術群微信公衆号

alinode-基于Node.js運作時的應用性能管了解決方案

本文作者 張子發(花名:穆客) 阿裡雲專家