linux调优以满足100万并发连接的要求

首先需要借助工具测试操作系统是否支持100万个连接。

工具地址:https://github.com/ideawu/c1000k

以下命令是CentOS 7.4

安装

wget --no-check-certificate https://github.com/ideawu/c1000k/archive/master.zip
unzip master.zip
cd c1000k-master
make

首次检测结果

编译完成后,执行命令进行检测

# 启动服务器,监听端口7000〜7099
./server 7000
# 运行客户端
./client 127.0.0.1 7000

执行结果如下:

.....
server listen on port: 7096
server listen on port: 7097
server listen on port: 7098
server listen on port: 7099
connections: 921
error: Too many open files

提示error: Too many open files,说明服务器只能接受921个连接,达到最大打开文件数限制。

最大打开文件数

查看系统最大打开文件描述符数

[root@host176 ~]# cat /proc/sys/fs/file-max
6553600

所有进程打开的文件描述符数不能超过/proc/sys/fs/file-max

如果机器中这个数字比较小,那就需要修改/etc/sysctl.conf

fs.file-max = 1020000

优化进程限制

[root@host176 c1000k-master]# ulimit -n
1024

这是一个进程可以打开的文件数限制

默认是 1024,是一个很低的数值。因为每一个用户请求都会对应着一个文件句柄,而压力测试会产生大量的请求,所以我们需要增大这个数值,把它改为百万级别。

可以修改配置文件 /etc/security/limits.conf 来永久生效:

* hard nofile 1024000
* soft nofile 1024000

重新登录后生效

如果不生效,修改/etc/ssh/sshd_config
确保UsePAM 开启

UsePAM yes

如果还是不行

  1. 检查下/etc/pam.d/sshd 有没这个文件以及文件内容
  2. 检查/etc/security/limits.d/下的XX-nproc.conf或者/etc 下某个关键文件配置,是不是被维护写死,这些高优先级的配置会覆盖limits.conf 配置的进程打开的文件数限制

继续验证

优化完ulimit后继续验证

....
connections: 129999, fd: 130001
connections: 130573
error: Connection timed out

连接数在建立130573之后,此时报错Connection timed out

通过sysctl -a查询内核参数,发现net.nf_conntrack_max=131072 ,和总的连接数比较相近,猜测可能是造成瓶颈的原因

net.nf_conntrack_max介绍:
一般宿主机都会启用防火墙,所以防火墙会记录每一条tcp连接记录,所以如果当虚拟机建立的tcp数量超过宿主机的防火最大记录数,则会drop掉后来的tcp

最终验证

知道原因后,将连接改为200w+以满足单机100w长连接
修改/etc/sysctl.conf

net.nf_conntrack_max=2048576

使配置生效

sysctl -f /etc/sysctl.conf 

最终结果:

connections: 1015999, fd: 1016001
connections: 1016999, fd: 1017001
connections: 1017999, fd: 1018001
connections: 1018999, fd: 1019001
connections: 1019999, fd: 1020001
connections: 1020999, fd: 1021001
connections: 1021999, fd: 1022001
connections: 1022999, fd: 1023001
connections: 1023997
error: Too many open files

支持1023997个连接

猜你喜欢

转载自blog.csdn.net/qq_33873431/article/details/114091062
今日推荐