概述
Nginx 默认安装下, 无论怎么压测, 其 CPU 利用率都无法直接拉满, 其利用率最大为 45% 左右, 本文便是从实践出发, 为解决这个疑问而来。
压测工具 wrk 采用多线程 + 网络异步 IO 模型, 网络异步 IO 可以使得系统使用很少的线程模拟大量的网络连接以增大并发量; 运行 wrk 的机器必须有足够数量的可用临时端口,并且应该快速回收关闭的套接字。为了处理初始连接突发,服务器的 listen backlog 应该大于正在测试的并发连接数
1、部署环境介绍
CentOS Linux release 7.9.2009 (5.4.186-1.el7.elrepo.x86_64)
nginx version: 1.20.2
wrk version: 4.2.0
CPU: Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GHz
KVM 虚机配置: 20 vCPU 、8G RAM
请求页面为 Nginx 默认页面: /usr/share/nginx/html/index.html
部署
1、nginx 安装、调整内核参数
yum install nginx
systemctl stop firewalld.service
cat > /etc/sysctl.conf << EOF
net.ipv4.tcp_max_syn_backlog = 1024
net.core.somaxconn = 1024
EOF
sysctl -p
2、wrk 编译安装
git clone https://github.com/wg/wrk.git
cd wrk && make
cp wrk /usr/bin/wrk && chmod +x /usr/bin/wrk
3、Nginx 主要配置项 /etc/nginx/nginx.conf
# 配置 worker 进程数、与 vCPU 数一致, 并进行自动绑定
worker_processes auto;
worker_cpu_affinity auto;
events {
use epoll;
worker_connections 1024;
}
http {
...
sendfile on;
tcp_nopush on; # 必须在 sendfile 开启模式才有效, 可提高一倍的并发量
access_log off;
...
server {
listen 80 backlog=1024;
...
}
}
# sendfile on:是否开启高效文件传输模式, 对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载
验证
1、启动 20 个线程, 保持 800 个 http 连接, 持续压测时间 60s
wrk -t 20 -c 800 -d 60s --latency http://192.168.31.11
> Running 1m test @ http://192.168.31.11
> 20 threads and 800 connections
> Thread Stats Avg Stdev Max +/- Stdev
> Latency 1.59ms 0.93ms 40.13ms 46.35%
> Req/Sec 25.25k 17.32k 83.60k 85.12%
> Latency Distribution
> 50% 1.64ms
> 75% 2.53ms
> 90% 2.81ms
> 99% 3.42ms
> 30180907 requests in 1.00m, 23.89GB read
> Requests/sec: 502179.99
> Transfer/sec: 407.08MB
// 结论说明:
// 单个线程 QPS 平均大小 25.25k, 50% 的请求在 1.64 毫秒内完成
// 可达到每秒 50w 请求, 带宽 3.3Gbps, CPU 利用率 97.2%
// 实时查看网络 pps、bandwidth
sar -n DEV 1
> 10:33:36 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
> 10:33:37 AM eth0 508080.22 508068.13 51972.99 451661.46 0.00 0.00 0.00
本文暂时没有评论,来添加一个吧(●'◡'●)