性能分析

16 2月

服务端的重点不在渲染,而在于高并发性能压测。常用压测工具:apache bench,webbench等,简单易用。

ab -c200 -n1000 http://27.0.0.1:3000/    // -c表示模拟同时200个客户端进行并发请求,-n表示总共执行多少次请求,-t也很常用表示执行多少时间

// 结果
Server Software:        
Server Hostname:        127.0.0.1
Server Port:            3000

Document Path:          /
Document Length:        21 bytes

Concurrency Level:      200
Time taken for tests:   0.351 seconds
Complete requests:      1000
Failed requests:        0
Non-2xx responses:      1000
Total transferred:      176000 bytes
HTML transferred:       21000 bytes
Requests per second:    2850.91 [#/sec] (mean)        // 最重要的就是QPS,每秒服务器能承载的请求量
Time per request:       70.153 [ms] (mean)            // 每次请求的平均耗时
Time per request:       0.351 [ms] (mean, across all concurrent requests)
Transfer rate:          490.00 [Kbytes/sec] received  // 吞吐量,每秒服务器能吞+吐多少数据,吞吐量越高,服务器性能越好
                                                      // 吞吐量取决于网卡带宽,如果吞吐量接近网卡带宽了,那服务器瓶颈可能卡在网卡上

Connection Times (ms)     // 每次处理请求的耗时,可以初步诊断服务器慢在哪里
              min  mean[+/-sd] median   max
Connect:        0    9   3.8      9      17
Processing:    18   57   8.8     58      76
Waiting:        2   39   8.0     39      56
Total:         18   66   9.1     65      86

Percentage of the requests served within a certain time (ms)
  50%     65
  66%     73
  75%     74
  80%     75
  90%     75
  95%     77
  98%     78
  99%     78
 100%     86 (longest request)

具体Node各模块的执行耗时,可以用Node自带的profile查看:

node --prof entry.js   // 启动分析工具,会生成一个log文件,随着服务器运行,这个log文件体积会变大
node --prof-process isolate-0x10280c000-v8.log > a.txt   // 解析这个log文件,输出结果,结果里有JS,C++,GC等执行时间

因为Node内核是Chrome V8引擎,自然也能像浏览器端一样用chrome devtool调试:

node --inspect-brk entry.js    

// 会启动websocket,然后再浏览器端调试node
// Chrome上访问 chrome://inspect/#devices 启动调试
// 启动后,可以在Chrome devtool上单步调试,也能在devtool上看性能profile
// 与上面自带的profile工具分析出的内容是一样的,但看起来更方便,可以截取两段时间的内存快照,分析有无内存泄露

Github上开源包node-clinic也能看各模块各函数的执行耗时,相比上面的自带profile工具和Chrome devtool图形化做的更好,看起来更直观。

服务器瓶颈不仅是网卡,还可能是CPU,内存,硬盘读写等,所以要配合top,iostat等工具。经验上看多数性能瓶颈还是出在Node的CPU利用率上,因为Node可以用Chrome V8引擎执行JS,会有大量的JS计算占据CPU,所以尽可能减少不必要的计算,或将服务阶段的计算提前到启动阶段,或将计算结果缓存起来。

发表评论

邮箱地址不会被公开。 必填项已用*标注