最近公司开发了一套新产品,采用nodejs前端+Java后端框架,为完全的前后端分离结构,以下为相关信息。

软件及功能:

软件 功能
Nginx 负责反向代理和负载均衡
Nodejs 前端代码
JDK+Tomcat Java后端代码
Mysql 数据库服务
MongoDB 客户表单工作流数据库服务
Redis TOKEN认证及缓存

测试服务器信息

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密集型的应用,如计算圆周率,视频解码等业务场景较多的。

关于NODEJS性能测试和优缺点总结的更多相关文章

  1. asyncio与gevent并发性能测试

    asyncio与gevent并发性能测试 在对网站进行扫描或者暴破时需要对网站进行高并发操作,然而requests+concurrent多线程性能上不太理想,了解到python用得比较多的并发库有as ...

  2. mac下编译node源码

    看过一篇win7 64x下面编译node的文章,链接地址:编译nodejs及其源码研究 下面学习一下在mac下面如何编译node源码. 过程也挺简单. 1.下载源码. > mkdir nodes ...

  3. [NodeJS] 优缺点及适用场景讨论

    概述: NodeJS宣称其目标是“旨在提供一种简单的构建可伸缩网络程序的方法”,那么它的出现是为了解决什么问题呢,它有什么优缺点以及它适用于什么场景呢? 本文就个人使用经验对这些问题进行探讨. 一. ...

  4. NodeJS优缺点及适用场景讨论

    概述:NodeJS宣称其目标是“旨在提供一种简单的构建可伸缩网络程序的方法”,那么它的出现是为了解决什么问题呢,它有什么优缺点以及它适用于什么场景呢? 本文就个人使用经验对这些问题进行探讨. 一. N ...

  5. NodeJS静态文件访问性能测试

    受益于JavaScript语言优秀特点,使NodeJS开发服务端应用很方便,配合NPM官方提供的大量第三方组件,让NodeJS更加如虎添翼.最近,需要使用NodeJS做一个服务端HTML5的游戏服务器 ...

  6. NodeJS的优缺点

    我们知道NodeJS是2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装.Node.js对一些特殊用例进行优化,提供替代的API,使得V8在非浏览器环境下运行得更好,解 ...

  7. [转载]NodeJS优缺点及适用场景讨论

    http://www.xprogrammer.com/159.html 概述:NodeJS宣称其目标是“旨在提供一种简单的构建可伸缩网络程序的方法”,那么它的出现是为了解决什么问题呢,它有什么优缺点以 ...

  8. 【转载】【Todo】Nodejs的优缺点

    Nodejs的优缺点,这里面讲的比较详细.有时间可以多看看别人的分析. https://www.zhihu.com/question/19653241 Node.js 的架构与 Django, Rai ...

  9. nodejs 实践:express 最佳实践(八) egg.js 框架的优缺点

    nodejs 实践:express 最佳实践(八) egg.js 框架的优缺点 优点 所有的 web开发的点都考虑到了 agent 很有特色 文件夹规划到位 扩展能力优秀 缺点 最大的问题在于: 使用 ...

随机推荐

  1. C# 特性 System.ComponentModel 命名空间属性方法大全,System.ComponentModel 命名空间的特性

    目录: System.ComponentModel 特性命名空间与常用类 System.ComponentModel.DataAnnotations ComponentModel - Classes ...

  2. redis下的字符串处理

    redis设计一款sds对象[字符串对象] 优点:可跨平台的内存处理zmalloc:内存消耗的线性增长优势:每次加SDS_MAX_PREALLOC(1MB)的空间: 重写了各种字符串操作的函数: 写跨 ...

  3. [Codeup 25481] swan

    莫名其妙还找到了另一个铟炔锶烃的OJ : Codeup墓地 25481: swan 时间限制: 1 Sec  内存限制: 128 MB献花: 86  解决: 13[献花][花圈][TK题库] 题目描述 ...

  4. 动画的分类:属性(几何)动画、内容(视频)动画:gpu vs cpu

    属性动画通过gpu根据属性来呈现: 内容动画通过cpu解码内容按照时间呈现给gpu: (或者gpu直接解码现实?)

  5. js的鼠标事件整理-------Day47

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/marSmile_tbo/article/details/34202437 今天回来的有些晚了,实在是 ...

  6. mongd配置文件解释

    mongd配置文件解释 系统日志配置 systemLog: verbosity: <int> quiet: <boolean> traceAllExceptions: < ...

  7. TP框架---Model模型层---做模型对象

    TP框架----Model模型层---------------做模型对象 Model模型层是用来做什么的呢???? 主要是用来做操作数据库访问的. 也就说明TP框架自带了一种访问数据库的方式,使用的是 ...

  8. 为什么要使用GetSafeHwnd()函数

    当我们想得到一个窗口对象(CWnd的派生对象)指针的句柄(HWND)时,最安全的方法是使用GetSafeHwnd()函数,通过下面的例子来看其理由: CWnd *pwnd = FindWindow(“ ...

  9. PHP面试系列之Linux(一) ----- Linux基础

    一.系统安全 sudo:以系统管理者的身份执行指令,也就是说,经由 sudo 所执行的指令就好像是 root 亲自执行. su:用于变更为其他使用者的身份,除 root 外,需要键入该使用者的密码. ...

  10. matplotlib.pyplot的两种模式

    在交互模式下: 1.plt.plot(x)或plt.imshow(x)是直接出图像,不需要plt.show() 2.如果在脚本中使用ion()命令开启了交互模式,没有使用ioff()关闭的话,则图像会 ...