# 性能工具:HTTP服务的性能测试

想要做性能优化,首先要做性能检测。

# 压力测试

  • ab:Apache HTTP server benchmarking tool,ab是apache自带的压力测试工具。ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试。比如nginx、tomcat、IIS等。
  • webbench:Webbench是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力。

# 找到性能瓶颈所在地

  • top:Linux top命令用于实时显示 process 的动态。可以获取CPU,内存性能等。
  • iostat:Linux系统中的iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。

# 总结

通过压力测试配合Linux相关命令可以找得到服务器的性能瓶颈大概所在地。从而进行下一步优化。

此外除了CPU,内存,磁盘等性能问题。当使用NodeJS作为BFF层,后台服务器也可能存在性能瓶颈。

实际工作当中,性能瓶颈一般主要在于NodeJS,CPU计算能力 上。例如:字符串拼接,javascript运算等。

一般当CPU占用率达到100%,机器负载达到极限。代表NodeJS计算性能达到瓶颈。

如果是 NodeJS计算性能 达到瓶颈,很大概率是某段代码存在性能问题,浪费了大量性能。

# Apache HTTP server benchmarking tool

# 简单测试

输入命令

ab -n 100000 -c 500 `127.0.0.1/test`

其中-n表示请求数,-c表示并发数

一次 500 个并发,总请求量为 100000,向指定机器 IP 和页面的 URL 发送请求

This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 10.51.170.39 (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Completed 100000 requests
Finished 100000 requests

Server Software:                         //测试服务端类型
Server Hostname:        127.0.0.1     //测试服务器 HOST
Server Port:            80               //测试服务端端口号

Document Path:          /test/                    //The request URI parsed from the command line string.
Document Length:        62346 bytes               //This is the size in bytes of the first successfully returned document. If the document length changes during testing, the response is considered an error.

Concurrency Level:      500                       //并发请求数
Time taken for tests:   158.969 seconds           //这是从创建第一个套接字连接到接收到最后一个响应的时间。
Complete requests:      100000                    //完成的请求数
Failed requests:        0                         //失败的请求数
Total transferred:      6266233588 bytes          //从服务器接收的字节总数。 此数字本质上是通过网络发送的字节数。整个场景中的网络传输量
HTML transferred:       6236217388 bytes          //从服务器接收的文档字节总数。 此数字不包括HTTP标头中接收的字节 整个场景中的HTML内容传输量
Requests per second:    629.05 [#/sec] (mean)     //这是每秒的请求数。 该值是请求数除以总时间所得到的结果
Time per request:       794.847 [ms] (mean)       //每个请求花费的平均时间。concurrency * timetaken * 1000 / done
Time per request:       1.590 [ms] (mean, across all concurrent requests) //每个请求花费的平均时间。 timetaken * 1000 / done
Transfer rate:          38494.01 [Kbytes/sec] received            //平均每秒网络上的流量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题 totalread / 1024 / timetaken

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   2.1      0      34
Processing:   296  793 151.5    809    2962
Waiting:      232  690 153.2    713    2724
Total:        296  793 152.1    809    2992

//整个场景中所有请求的响应情况。在场景中每个请求都有一个响应时间,其中 50%的用户响应时间小于 809 毫秒,66%的用户响应时间小于 854 毫秒,最大的响应时间小于 2992 毫秒。对于并发请求,cpu 实际上并不是同时处理的,而是按照每个请求获得的时间片逐个轮转处理的,所以基本上第一个 Time per request 时间约等于第二个 Time per request 时间乘以并发请求数。
Percentage of the requests served within a certain time (ms)
  50%    809
  66%    854
  75%    881
  80%    899
  90%    947
  95%    998
  98%   1075
  99%   1146
 100%   2992 (longest request)

# 主要关注性能指标

Requests per second: 629.05 [#/sec] (mean):这是每秒的请求数。服务器每秒处理的并发量。 该值是请求数除以总时间所得到的结果。后面括号中的 mean 表示这是一个平均值

Time per request: 794.847 [ms] (mean):每个请求花费的平均时间(包含并发数)。concurrency * timetaken * 1000 / done

Time per request: 1.590 [ms] (mean, across all concurrent requests:每个请求花费的平均时间。 timetaken * 1000 / done

Transfer rate: 38494.01 [Kbytes/sec] received:吞吐量。服务器每秒可以处理的数据流量。

# 参考

更新时间: 6/29/2020, 6:30:01 PM