最近公司开发了一套新产品,采用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. 读 CSI讲义 费马小定理

    费马小定理 最近在上计算机安全学选修课.. 读老师博客..现在当是写阅读笔记吧. 这里贴出老师的简书建议先看看链接先..毕竟我这些东西只是搞笑一下的.. 遵循一下这个原则… 观察 找规律 求证 首先是 ...

  2. Chapter 2 Secondary Sorting:Detailed Example

    2.1 Introduction MapReduce framework sorts input to reducers by key, but values of reducers are arbi ...

  3. [T-ARA][TIAMO]

    歌词来源:http://music.163.com/#/song?id=439915067 改了一版格式,先尝试一下,考虑到总不能永远只看着拼音读,所以想把发音按照韩文字来写,以后争取看着韩文字唱. ...

  4. lisp base

    一 .quote lisp 使用s-expr表示数据和代码,通常会将第一项作为函数,而将后续元素当做参数传给第一项进行计算.可以通过quote来进行其他解析,quote可用(‘)表示: ( + 1 1 ...

  5. 转一篇shell中关于各种括号的讲解

    shell中各种括号的作用().(()).[].[[]].{} 一.小括号,圆括号()1.单小括号 ()   ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的 ...

  6. centos虚拟机安装,配置静态ip可以访问网络

    centos安装过程中需要注意几个问题 1.选择安装的软件 默认选择的是mininal,应该选择GNEME Desktop 安装的过程中可以设置network 配置linux网络命令 具体配置 退出键 ...

  7. pop链构造

    class Person { private $name; private $sex; private $age; //__set()方法用来设置私有属性 function __set($proper ...

  8. Kali-linux Gerix Wifi Cracker破解无线网络

    Gerix Wifi Cracker是另一个aircrack图形用户界面的无线网络破解工具.本节将介绍使用该工具破解无线网络及创建假的接入点. 9.3.1 Gerix破解WEP加密的无线网络 在前面介 ...

  9. Kali-linux破解操作系统用户密码

    当忘记操作系统的密码或者攻击某台主机时,需要知道该系统中某个用户的用户名和密码.本节将分别介绍破解Windows和Linux用户密码. 8.6.1 破解Windows用户密码 Windows系统的用户 ...

  10. CS 20_Overview of Tensorflow

    tf.assign(A, new_number): 这个函数的功能主要是把new_number的值向前传递给了A run( fetches, feed_dict=None, options=None, ...