前言
客户端采用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。