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