「这是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战」。
前言
客户端采用wrk压测工具,服务端安装httpd服务。具体的httpd配置详见历史文章:# 关于Apache HTTP Serve你应该知道的!使用wrk对服务端进行压测,检测wrk的压测性能。
修改 httpd 的最大连接数
我们测试的后端服务采用httpd,为了能够承载更多的客户端连接,我们需要对httpd的默认配置进行修改。
直接将如下代码加到 httpd
的配置文件中
<IfModule mpm_prefork_module>
StartServers 10
MinSpareServers 5
MaxSpareServers 10
ServerLimit 5500
MaxClients 5000
MaxRequestsPerChild 0
</IfModule>
复制代码
wrk
关于wrk
wrk是一款简单的HTTP压测工具,托管在Github上,github.com/wg/wrk,当然国内的码云Gitee上也有其资源,gitee.com/why168/wrk。
wrk 的一个很好的特性就是能用很少的线程压出很大的并发量。原因是它使用了一些操作系统特定的高性能 io 机制, 比如 select, epoll, kqueue 等。其实它是复用了 redis 的 ae 异步事件驱动框架。确切的说 ae 事件驱动框架并不是 redis 发明的,它来至于 Tcl的解释器 jim,这个小巧高效的框架,因为被 redis 采用而更多的被大家所熟知。
依赖
# wrk 依赖gcc
# yum install gcc
# apt-get install build-essential
复制代码
安装
# clone wrk 源码到测试机
git clone https://gitee.com/why168/wrk.git
# 编译
cd wrk
make
# 编译完后当前路径会生成wrk可执行文件
复制代码
测试前解除客户端和服务端的限制
sysctl.conf
# ===向/etc/sysctl.conf中增加以下几行配置===
fs.file-max = 1048576
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_mem = 524288 1048576 1572864
net.ipv4.tcp_rmem = 4096 4096 8388608
net.ipv4.tcp_wmem = 4096 4096 8388608
# TCP连接复用
net.ipv4.tcp_tw_reuse = 1
# TCP连接快速回收
net.ipv4.tcp_tw_recycle = 1
kernel.pid_max=1048576
kernel.threads-max=1048576
vm.max_map_count=1048576
复制代码
端口限制放开
# 打开端口范围
echo 1024 65000 > /proc/sys/net/ipv4/ip_local_port_range
# 修改端口释放等待时间(15-30s,默认为60s)
echo 15 > /proc/sys/net/ipv4/tcp_fin_timeout
复制代码
文件句柄放开
使用命令:ulimit -n 1048576
或:修改配置文件
cat /etc/security/limits.conf
# End of file
* soft nofile 1048576
* hard nofile 1048576
复制代码
执行测试
➜ ok git:(master) ./wrk -t12 -c100 -d30s http://www.baidu.com
Running 30s test @ http://www.baidu.com
12 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 15.24ms 6.29ms 178.82ms 96.92%
Req/Sec 471.00 119.40 595.00 86.44%
30000 requests in 30.10s, 446.41MB read
Socket errors: connect 0, read 88161, write 0, timeout 0
Requests/sec: 996.72
Transfer/sec: 14.83MB
➜ ok git:(master)
复制代码
12 线程 100 个连接(并发)。QPS:996.72。