關於NODEJS性能測試和優缺點總結

    最近公司開發了一套新產品,採用nodejs前端+Java後端框架,爲徹底的先後端分離結構,如下爲相關信息。

軟件及功能:前端

軟件 功能
Nginx 負責反向代理和負載均衡
Nodejs 前端代碼
JDK+Tomcat Java後端代碼
Mysql 數據庫服務
MongoDB 客戶表單工做流數據庫服務
Redis TOKEN認證及緩存

 

 

 

 

 

 


測試服務器信息node

IP 服務器 CPU 內存 空間
192.168.1.11 NGINX+NODEJS+TOMCAT 8 16 120G
192.168.1.12 MYSQL
4 8 120G
192.168.1.13 MONGODB+REDIS
4 8 120G
192.168.1.14 NODEJS 8 16 120G

 

 

 

 


測試工具:
LOADRUNNER+JMC 配合LINUX系統工具

測試狀況:

爲了更清楚的瞭解該系統的平靜點,對整個系統進行不一樣狀況的性能測試。
測試過程以下:

1:採用4核CPU配置資源進行測試 (JVM調節爲4G固定內存 永久代512M)
經測試在NODEJS未開啓CLUSTER時,TPS爲20左右,CPU佔用率約65%(其中TOMCAT佔用約27%)內存:三臺機均有剩餘,MYSQL MONGO+REDIS使用率極低 鏈接數:NODEJS約200,MYSQL約30 MONGODB約30低。
從如上結果看:NODEJS不開啓CLUSTER不能充分利用CPU,TPS太低。

2:採用8核CPU16G內存進行測試 (JVM調節爲4G固定內存 永久代512M)
經測試在NODEJS未開啓CLUSTER時,TPS爲33左右,CPU佔用率約60%(其中TOMCAT佔用約27%)內存:三臺機均有剩餘,MYSQL MONGO+REDIS使用率極低 鏈接數:NODEJS約200,MYSQL約30 MONGODB約30低。
從如上結果看:NODEJS不開啓CLUSTER不能充分利用CPU,TPS太低。

3:採用8核CPU16G內存進行測試(JVM調節爲4G固定內存 永久代512M)
NODEJS開啓CLUSTER爲MAX,TPS爲80左右,CPU佔用率約92%(其中TOMCAT佔用約27%)內存:三臺機均有剩餘,MYSQL MONGO+REDIS使用率極低 鏈接數:NODEJS約900,MYSQL約200 MONGODB約230低。

4:採用8核CPU16G內存進行測試 (JVM調節爲4G固定內存 永久代512M)
NODEJS開啓CLUSTER爲4,TPS爲80左右,CPU佔用率約76%(其中TOMCAT佔用約27%)內存:三臺機均有剩餘,MYSQL MONGO+REDIS使用率極低 鏈接數:NODEJS約900,MYSQL約200 MONGODB約230低。

5:將NODEJS單獨劃分到另一臺機,採用一樣壓力測試
NODEJS開啓CLUSTER爲8,TPS爲80左右,CPU佔用率約83%(其中TOMCAT佔用約27%)內存:三臺機均有剩餘,MYSQL MONGO+REDIS使用率極低 鏈接數:NODEJS約900,MYSQL約200 MONGODB約230低。

6:NGINX開啓負載均衡
採用兩臺機安裝NODE方式(其中Nginx+NODEJS+TOMCAT一臺,NODEJS單獨一臺)
和TOMCAT在同一臺的NODE開啓CLUSETER爲4:單獨NODEJS開啓CLUSTER爲MAX,TPS爲85左右,CPU佔用率約70%(其中TOMCAT佔用約27%)內存:三臺機均有剩餘,MYSQL MONGO+REDIS使用率極低 鏈接數:NODEJS約900,MYSQL約200 MONGODB約230低。

7:NGINX開啓負載均衡 (加壓一倍進行測試)
採用兩臺機安裝NODE方式(其中Nginx+NODEJS+TOMCAT一臺,NODEJS單獨一臺)
和TOMCAT在同一臺的NODE開啓CLUSETER爲4:單獨NODEJS開啓CLUSTER爲MAX,TPS爲110左右,CPU佔用率約80%(其中TOMCAT佔用約27%,但此時後端出現錯誤,因本次主要驗證NODEJS性能,略去排查過程)內存:三臺機均有剩餘,MYSQL MONGO+REDIS使用率極低 鏈接數:NODEJS約900,MYSQL約200 MONGODB約230低。

總結:

     從如上測試狀況看,NODEJS爲CPU密集型應用,性能和吞吐對CPU依賴嚴重,增長CPU核數後啓用CLUSTER能夠大大增長TPS.但並非CLUSTER越多性能越優,本次測試採用8核的狀況下CLUSTER爲4 的狀況下 在保障TPS最優狀況下,CPU佔用率最優。開啓6 CLUSTER CPU會升高,TPS不變。4核CPU以上的CLUSTER CPU使用太高,會對其它軟件和系統帶來不穩定因素。之前曾看過一篇資料,NODEJS的CLUSTER開啓後,會啓動對應的進程,當採用單端口進入後,會有一個分配機制選擇一個最優的進程提供相應,當進程過多的時候,選舉過程會有消耗,這可能也是這次測試4CLUSTER比MAX 8CLUSTER 結果更理想的緣由。另外若是NODEJS是鏈接數過多,這種狀況,開啓CLUSTER並不能有效緩解,還須要負載均衡纔能有效分流鏈接數。生產環境不宜開啓CLUSTER爲MAX(須要留1到2核和系統和JAVA,以保障在某些狀況下系統出問題的可能)
    在開啓負載均衡的測試中,原測試壓力顯然不夠,測試壓力增長至一倍,TPS也增長到110。此時後端報錯,這說明開啓負載均衡能夠更好的充分利用2臺機器的CPU資源。
結論:若要提升TPS,可增長CPU核數

一些我的關於NODEJS的優缺點總結(非摘抄):
 優勢: 
1.在少許業務邏輯的狀況下,具備優異的性能,可支持高併發。響應延時理想。缺省部署較便捷(NODEJS+PM2)

2.啓動速度快,重啓時間短。

 缺點:
1. NODEJS 在業務流和代碼邏輯變得複雜時,性能降低嚴重,且易出現內存泄漏。(公司原有幾個系統不一樣程度存在此問題,對CPU依賴嚴重,若部署於雲上,多購入CPU內核會帶來成本上升 )

2. NODEJS模塊成熟度及穩定性欠佳(NODE_MODULES)不少模塊成熟度不如JAVA那麼高,如REDIS集羣插件早起性能不佳。另部分如GRUNT框架在遇到有調用失敗後會觸發重啓,研發須要花大量時間排查問題。部分組件使用起來較麻煩如ORACLE鏈接等等,部分插件安裝會致使更新系統GLIBC等包,或須要升級GCC及PYTHON,運維成本偏高。

3. NODEJS的問題解決方法網上較少(相較於JAVA PHP)

4. NODEJS+PM2在處理日誌統一存儲,須要進行若干設置。便利性欠佳。(缺省全局安裝會將日誌生成到/root/.pm2/下)

    如上所述,對於大量業務邏輯且複雜度高的系統,不建議採用NODE開發。適合I/O密集型的應用,如在線多人聊天,多人在線小遊戲,實時新聞之類的。不適合的場景有:cpu密集型的應用,如計算圓周率,視頻解碼等業務場景較多的。sql

相關文章
相關標籤/搜索