apache 提供的 ab 可以对服务器进行压力测试,
安装 ab: apt-get install apache2-utils
安装完后,ab 在目录 /usr/bin/ 下的。
执行: ab -c 并发数 -n 请求数 请求的URL 如:
ab -c 2000 -n 50000 http://192.168.137.47/ 表示对 http://192.168.137.47/ 进行50000次请求,并发数为 2000
我运行的机器不是在 192.168.137.47 上,运行时报了一个错误: socket: Too many open files
运行: ulimit -n 出现结果 1024,说明最大允许打开的文件描述符的数量为 1024,我们上面并发数为 2000,比1024大,运行下面的命令,设置一个较大的值:
ulimit -n 20000
先运行小一点的压力测试参数,看看正确返回时, ab 给出的测试报告。如: ab -c 200 -n 5000 http://192.168.137.47/
Server Software:        Tengine/2.2.2   # 我用的是 Tengine (https://tengine.taobao.org/ 淘宝对 nginx 的扩展)
Server Hostname:        192.168.137.47
Server Port:            80
Document Path:          /
Document Length:        179 bytes
Concurrency Level:      200         # 命令中 -c 的值
Time taken for tests:   16.161 seconds    # 总共花费的时间
Complete requests:      5000      # 命令中 -n 的值
Failed requests:        0   #失败的请求数
Total transferred:      2110000 bytes    # 总共传输的数据量
HTML transferred:       895000 bytes   # 总共的 HTML 内容的传输量
Requests per second:    309.38 [#/sec] (mean)  # 吞吐率(平均值)
Time per request:       646.447 [ms] (mean)   # 平均一次请求所花费的时间,即用户的等待时间
Time per request:       3.232 [ms] (mean, across all concurrent requests)   # 服务器平均一次请求处理时间,吞吐率的倒数
Transfer rate:          127.50 [Kbytes/sec] received   # 平均每秒网络上的流量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题
Connection Times (ms)
                      min  mean[+/-sd]  median   max
Connect:        0     20 111.8       1            1002
Processing:    4    595 596.6     455         3669
Waiting:         1     593 595.9     452         3608
Total:            4     616 604.5      483         3670
Percentage of the requests served within a certain time (ms)
  50%    483    # 50% 的用户等待时间不超过 483 ms
  66%    778    # 66% 的用户等待时间不超过 778 ms
  75%   1021
  80%   1119
  90%   1484
  95%   1804
  98%   2137
  99%   2337
 100%   3670 (longest request)
当加大参数时,如 ab -c 2000 -n 50000 http://192.168.137.47/
这时出现了: apr_socket_recv: Connection reset by peer (104) 这个错误,网上有人说是 ab 安装的问题,其实是服务器配置的问题,在高并发的情况下,服务器撑不住了。因为我用的是虚拟机,一台真实电脑上,开了4台虚拟机(两台 tomcat 运行 web 服务,一台 nginx 服务器作负载均衡,一台运行压力测试的命令)。需要对 nginx 服务器进行优化:
高并发优化思路:
 
1. 增大 nginx 配置文件中的 worker_connections 数量
2. echo 50000 > /proc/sys/net/core/somaxconn # 最大连接数
3. echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle # 加快 tcp 连接的回收
4. echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse # 空的 tcp 允许回收
5. echo 0 > /proc/sys/net/ipv4/tcp_syncookies # 不做洪水抵御
6. 增大 nginx 配置文件中的 worker_rlimit_nofile 的值,比如: 10000
7. ulimit -n 20000
再次运行 ab -c 2000 -n 50000 http://192.168.137.47/, 发现能正常返回报告了,因为是单台机器上装的虚拟机,当并发达到一定数量时,不管怎么调,最后总会出错。
