性能调优
Node.js
调试方面需要掌握的基本技能,下面说一下性能调优相关的技巧。
Node.js相比Java、PHP这些老牌语言,基础设施还是有所欠缺的:比如性能分析和监控工具等,加上它的单线程运行特性,在大型应用中,很容易让系统的CPU、内存或者事件队列太满达到瓶颈,从而导致程序崩溃。一旦发现程序警报CPU负载过高,或者内存飙高时,我们该如何排查Node.js代码存在的问题呢?首先先分析一下问题。
内存持高存在的因素:
- 缓存,很多人在code的时候把内存当缓存用,e.g. 使用js对象储存用户的session信息
- 闭包,作用域长时间不能被释放掉
- 生产者和消费者存在速度延迟,e.g. 数据库忙不过来,query队列堆积
CPU负载过高可能因素:
- 垃圾回收频率过高、量太大,这一般是因为内存或者缓存暴涨导致的
- 密集型的长循环计算,e.g. 大量遍历文件夹、大量计算等
- 客户端并发数太大,e.g. 利用node作为socket服务端时,客户端连接数太大时,心跳处理也属于一次网络io,最终libuv转换成事件,严重影响业务消息发送
这些问题都是让人头疼的,一个项目几十上百个文件,收到这些警报如果没有经验,根本无从下手排查。
最直接的手段就是分析 GC 日志,因为程序的一举一动都会反馈到 GC 上,而上述问题也会一一指向 GC,如:
内存暴涨,尤其是 Old Space 内存的暴涨,会直接导致 GC 的次数和时间增长
缓存增加,导致 GC 的时间增加,无用遍历过多
密集型计算,导致 GC Now Space次数增加
ps:
阿里出了一套调优工具alinode,看起来比较不错,感兴趣的童鞋可以试试,顺便反馈一下情况。