最近在压测TCP长连接其中遇到了一些问题:
1、TCP长连接大家知道在建立连接的过程中是一个标准的三次握手协议,而在进行整个握手协议的过程中客户端发出的请求会经过两个状态①、半连接状态 ②、全连接状态 我们可以通过三次握手协议的示意图来进一步了解这两个状态队列。
- 半连接和全连接指标可以通过命令查询:
- 半连接上限指标:cat /proc/sys/net/ipv4/tcp_max_syn_backlog
- 全连接上限指标:cat /proc/sys/net/core/somaxconn
- 其中还有一个参数:net.ipv4.ip_local_port_range = 10000 65535 ipv4可以使用的端口范围
- 修改的时候注意切换用户为root用户
修改完之后执行命令:/sbin/sysctl -p 刷新一下文件生效
2、由于要建立大量连接,再linux的/etc/sysctl.conf 文件中有几个有关TCP长连接的参数如: - net.ipv4.tcp_tw_reuse = 1表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭; - net.ipv4.tcp_tw_recycle = 1表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。 - 修改完毕之后,需要执行命令: sysctl -p 使参数生效。
3、当进行TCP连接压测的时候被压测的服务端(博主压测的时候场景为:客户端-Netty内核-服务端)主要是客户端-内核创建连接的过程当两台客户端施加压力进行测试的时候发现连接数达到6w左右的时候Netty服务日志出现了报错:“too many open files (Socket creation faild)”此时修改了一下linux内核相关配置:
突破局部文件句柄限制
①、先查看一下单个进程能够支持的最大句柄数:ulimit -n 一般默认的大小1024
②、修改该参数:vi /etc/security/limits.conf 编辑这个文件
修改文件中参数:没有增加有了修改
- *hard nofile 1000000
- *soft nofile 1000000
- 其中*代表当前用户 root代表系统用户
- hard 和soft代表限制和告警限制,当配置完之后可能还会存在限制,需要再看一下全局文件句柄
突破全局文件句柄限制
①、通过这个命令查看全局文件句柄限制 cat /proc/sys/fs/file-max 注意:局部文件句柄限制不能超过全局文件句柄数的
②、需要修改的话,切换到root用户,编辑文件vi /etc/sysctl.conf 在文件的末尾加上 fs.file-max=1000000
参考连接:单机连接调优