linux基础第三篇:压测
压测工具有jmeter、ab、wrk、hey
1、jmeter
在linux系统上用jmeter生成的jtl文件,导入到windows系统上相同版本的jmeter,报失败。
2、ab
在windows系统上:
在linux系统上:
centos安装:yum install -y httpd-tools
debian上安装:apt-get install -y apache2-utils
ab -c2000 -n1000000 -k 'http://127.0.0.1:10003/feed/v1/banners'
-c2000表示2000个用户同时操作,即2000个并发。
-n1000000表示总共发起1000000次请求。
-k表示使用http的keep-alive,会在请求头里加"Connection":["Keep-Alive"],如此压力机和被压测服务所在服务器只会建立${-c}个连接。压测结束后,ab会主动断开连接。
-t,用于指定最大压测时间,单位为秒。想要生效的话,必须放在-n前面。如ab -c2000 -t20 -n1000000 -k 'http://127.0.0.1:10003/feed/v1/banners',则压测20s后会停止压测。
输出结果中的Requests per second即为吞吐率,等于Complete requests/Time taken for tests,即总请求数/处理完成这些请求数所花费的时间。
当用openresty(docker方式部署)做反向代理时,压测并发数很大的话,ab会有报错,如下

报Length的错,因为Content-Length响应头的值有变化。ab认为Content-Length值不会变,且以第一次请求的Content-Length响应头的值为基准,不等于这个值的请求,就认为是Length Failed request。加上-l选项可以规避这个问题,但是结果就不一定准了。 -l是专为动态响应数据而设计的,允许Content-Length响应头值变化,不认为是Failed request。上图服务的部署情况是ab、openresty、业务服务都在同一台机器上。
当用nginx做反向代理时,压测并发数很大的话,ab会有报错,如下

在nginx的access.log发现【192.168.1.183 - - [07/Jul/2025:16:52:37 +0800] "GET /feed/v1/banners HTTP/1.0" 499 0 "-" "ApacheBench/2.3" "-"】。nginx的499状态码表示客户端主动断开了连接。在nginx的error.log中发现warn日志【1024 worker_connections are not enough, reusing connections】。上图服务的部署情况是ab在192.168.1.183,nginx和业务服务部署在192.168.1.112上。
解决方案:通过调大worker_processes数或event块中的worker_connections数,来增加nginx的总worker_connections数。
上例2,在压力机上执行sudo ss -antpe | grep 192.168.1.112 | sort -k 4,观察网络连接情况,发现在压测过程中恒有800条State值为ESTAB的记录,如下

但多次执行ss命令,返回的记录中压测机上的端口不一样。

直到压测结束,State变为TIME_WAIT。
如果去掉-k参数,会发现,有连接在频繁地创建和销毁,如下

State值有CLOSE-WAIT、LAST_ACK,说明是nginx主动关闭连接。压力机上不会有TIME_WAIT,不会把端口耗尽。
3、wrk
debian上安装wrk:apt-get install -y wrk

20个线程,100个连接,压测30s。
wrk是C语言开发,上栗中,每个线程处理5个连接。
如果压测过程中有错误,则会在Requests/sec的上面输出Socket errors: connect xxx, read xxx, write xxx, timeout xxx。
4、hey
https://github.com/rakyll/hey
5、httping
浙公网安备 33010602011771号