• 关于NODEJS性能测试和优缺点总结


        最近公司开发了一套新产品,采用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密集型的应用,如计算圆周率,视频解码等业务场景较多的。

  • 相关阅读:
    Individual Reading Assignment
    Individual P1: Summary
    Individual P1: Preparation
    M1m2分析报告
    第二次阅读作业--12061161 赵梓皓
    代码互审报告
    结对编程————电梯整理报告
    读书问题之《编程之美》 -----12061161 赵梓皓
    SE Class's Individual Project--12061161 赵梓皓
    博客测试
  • 原文地址:https://www.cnblogs.com/fishbook/p/9359113.html
Copyright © 2020-2023  润新知