1、修改服务端最大连接数
1.1、修改 httpd 的最大连接数
直接将如下代码加到 httpd
的配置文件中
<IfModule mpm_prefork_module>
StartServers 10
MinSpareServers 5
MaxSpareServers 10
ServerLimit 5500
MaxClients 5000
MaxRequestsPerChild 0
</IfModule>
1.2、修改haproxy的最大连接数
打开haprox.cfg
,修改以下配置项
maxconn 500000
fullconn 500000
1.3、修改Nginx最大连接数配置
# worker_processes auto; # worker进程数自动
worker_processes 16; # worker进程数定为16
events {
worker_connections 1024; # 单进程最大连接数
}
Nginx的最大连接数算法:worker_processes * worker_connections = 16,384
1.4、修改Caddy的连接数
如果你有自己的Caddyfile,那么你需要修改max_conns_per_host这个字段的值。
如果你使用默认Caddy配置,因为Caddy默认是不限制连接数的,所以你也不需要修改什么。
另:
Caddy
的默认项目路径在/usr/share/caddy/
。
2、wrk的使用
2.1、依赖
# wrk 依赖gcc
# yum install gcc
# apt-get install build-essential
2.2、安装
# clone wrk 源码到测试机
git clone https://gitee.com/why168/wrk.git
# 编译
cd wrk
make
# 编译完后当前路径会生成wrk可执行文件
2.3、测试前解除客户端和服务端的限制
2.3.1、在/etc/sysctl.conf加入以下内容
# 系统最大文件打开数
fs.file-max = 20000000
# 单个用户进程最大文件打开数
fs.nr_open = 20000000
# 全连接队列长度,默认128
net.core.somaxconn = 10240
# 半连接队列长度,当使用sysncookies无效,默认128
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_syncookies = 0
# 网卡数据包队列长度
net.core.netdev_max_backlog = 41960
# time-wait 最大队列长度
net.ipv4.tcp_max_tw_buckets = 300000
# time-wait 是否重新用于新链接以及快速回收
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
# tcp报文探测时间间隔, 单位s
net.ipv4.tcp_keepalive_intvl = 30
# tcp连接多少秒后没有数据报文时启动探测报文
net.ipv4.tcp_keepalive_time = 900
# 探测次数
net.ipv4.tcp_keepalive_probes = 3
# 保持fin-wait-2 状态多少秒
net.ipv4.tcp_fin_timeout = 15
# 最大孤儿socket数量,一个孤儿socket占用64KB,当socket主动close掉,处于fin-wait1, last-ack
net.ipv4.tcp_max_orphans = 131072
# 每个套接字所允许得最大缓存区大小
net.core.optmem_max = 819200
# 默认tcp数据接受窗口大小
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# tcp栈内存使用第一个值内存下限, 第二个值缓存区应用压力上限, 第三个值内存上限, 单位为page,通常为4kb
net.ipv4.tcp_mem = 786432 4194304 8388608
# 读, 第一个值为socket缓存区分配最小字节, 第二个,第三个分别被rmem_default, rmem_max覆盖
net.ipv4.tcp_rmem = 4096 4096 4206592
# 写, 第一个值为socket缓存区分配最小字节, 第二个,第三个分别被wmem_default, wmem_max覆盖
net.ipv4.tcp_wmem = 4096 4096 4206592
2.3.2、端口限制放开
# 打开端口范围
echo 1024 65000 > /proc/sys/net/ipv4/ip_local_port_range
# 修改端口释放等待时间(15-30s,默认为60s)
echo 15 > /proc/sys/net/ipv4/tcp_fin_timeout
2.3.3、文件句柄放开
使用命令:ulimit -n 1048576
或:在/etc/security/limits.conf加入以下内容
# End of file
root soft nofile 1048576
root hard nofile 1048576
* soft nofile 1048576
* hard nofile 1048576
2.3.4、使配置生效
sysctl -p
2.4、执行测试
➜ 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。
2.5、建议
建议单客户端最大连接数参数设置为:50000。
评论区