最近公司开发了一套新产品,采用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. MySQL 数据库--SQL语句优化

    explain查询和分析sql 开发中,为满足一业务功能,使用mysql书写sql时,一条sql往往有多种写法,那么我们就需要选择执行效率比较高的sql. 因此要比较分析sql的执行过程,且同一条sq ...

  2. Python 处理脚本的命令行参数-getopt

    # -*- coding:utf-8 -*- import sys def test(): """ 参数列表:sys.argv 参数个数:len(sys.argv) 脚本 ...

  3. TCP/IP 协议图

  4. css3 圣诞红包雨效果

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  5. JavaScript的事件的处理函数(鼠标,键盘,HTML)

    事件处理函数概述 JavaScript 可以处理的事件类型为:鼠标事件.键盘事件.HTML 事件 所有的事件处理函数都会都有两个部分组成,on + 事件名称,例如 click 事件的事件处理函数就是: ...

  6. langularJs的MVC模式

    1.数据的挂载 在函数中设置数据 function Aaa($scope){ $scope.name = 'hello'; $scope.age = '20'; } 2.ng-controller 这 ...

  7. webview综述

    nWebView 是webkit最核心的一个view,WebView管理WebFrameView和WebFrame之间的交互,一个WebView对象绑定一个window,并且要求MainFrame加载 ...

  8. mongod入门实战

    mongod-入门 摘要: 本篇文档,带你快速启动一个mongod,到搭建主从+复制集模式的入门. 内容包括:单实例安装,复制集构建,分片构建,分片及复制集整合. 软件相关信息介绍 MongoDB 是 ...

  9. 6、RabbitMQ-路由模式

    Exchange(交换机 转换器) Exchange分发消息时根据类型的不同分发策略有区别, 目前共四种类型:direct.fanout.topic.headers .   一方面是接受生产者的消息, ...

  10. 20165302 预备作业3 Linux安装及学习

    linux系统安装 我在安装VirtualBox时出现了一些小问题,如图 我的电脑只能设置32-bit的Ubuntu版本,但教程上说要选用64-bit的,我通过百度查询得知要进行BIOS设置,设置好后 ...