首先传送门,
zhukovaskychina/X-Nodejsgithub.com项目后期还会更新。
之前上一篇文章已经提到了我实现的一款node.js。
首先先简单的看下效果,
var
我们用ab工具压测,在模仿alinode内置的在线抓取cpuprofiler,这个node.js在指定的日志目录自动生成了cpuprofile文件。
我们用chrome开发者工具打开这个生成的cpuprofile,
可以看到,这种递归的函数非常消耗栈堆。我们换一个方式显示,
我们可以看到fib这个函数占据了将近60%的CPU性能,这个时候CPU负载高的原因就是这个fib函数导致的。而这个时候GC,垃圾回收器占用耗时性能很小。
这块的实现参考了hyj1991同学的v8-profiler-next或者v8-profiler-node8。
我们看下hyj1991同学的代码
Local
这段代码的当然是v8-profiler-next当中的,其核心在于调用了v8-profiler 当中的cpu_profiler对象的API。
cpuprofiler在停止cpu_profile的时候,会把相关的对象返回,也就是这个函数的入参。
Local
在这个代码区域里面,将获得整个cpuprofiler期间的所产生的的functionName,lineNumber,scriptId等等,将这些属性返回到profile_node对象当中,以逃逸对象返回。
最终生成的.cpuprofile是个json文件。在这个文件里面就是把cpuprofile的属性给展现出来。
不过在集成这块的代码的时候,node内部导出这个对象与js导出这个对象,是有差别的,这代码其他地方更多的是在给js对象做绑定属性的操作,这里就不表示了。
现在下面,要来看看hyj1991同学提到的cpu_profile的作用。其实这里给alinode打广告了(本人非阿里员工)。
hyj1991同学所编写的这个手册非常好,把node.js服务端这块的运维说明的非常清楚。
aliyun-node/Node.js-Troubleshooting-Guide
比方说这个例子。我就觉得非常好。
提到线上进程的监控运维,首先第一个我就要说的就是OneAPM的这套东西,感觉很不好。对于这个正则表达式,在代码里面嵌入所谓的探针或者SDK,最多充其量知道这个URL有问题。开发同学怎么可能知道是某个函数有问题?靠猜么?
我觉得alinode在这块做的非常好,这个例子非常有说服力。
我们看看OneAPM的这里面所谓的事务跟踪,能保证OneAPM的SDK不存在性能问题么?
同样的,对于这类问题OOM,某个进程挂了,怎么能知道这个进程挂了的原因么?
hyj1991:Node 案发现场揭秘 —— Coredump 还原线上异常zhuanlan.zhihu.com这个就比市面上的其他APM要强大很多。
#############################################################################################
后面继续更新