Backlog分为两个关键队列:
net.ipv4.tcp_max_syn_backlog(内核参数)和min(somaxconn, backlog)(应用层listen()函数的backlog参数与系统somaxconn的较小值)共同决定。accept()的连接,其最大值为min(somaxconn, backlog)。somaxconn(全连接队列上限)和tcp_max_syn_backlog(半连接队列上限):sysctl net.core.somaxconn # 查看全连接队列上限
sysctl net.ipv4.tcp_max_syn_backlog # 查看半连接队列上限
/etc/sysctl.conf文件(如net.core.somaxconn=2048、net.ipv4.tcp_max_syn_backlog=4096),然后执行sysctl -p使更改生效。ApacheBench是测试全连接队列是否充足的常用工具,通过模拟大量并发请求,观察是否有“backlog limit exceeded”或“Connection refused”错误。
yum install -y httpd-tools
ab -n 10000 -c 1000 http://127.0.0.1/
apr_socket_recv: Connection refused (111)或backlog limit exceeded,说明全连接队列已满,需增大somaxconn或应用层的backlog参数。Time per request(平均响应时间)和Requests per second(每秒请求数),评估系统在高并发下的性能。通过ss或netstat命令实时查看半连接队列和全连接队列的使用情况,判断是否达到上限。
ss -lnt | grep <port> # 如<port>为80
输出中的Recv-Q表示全连接队列中已接收但未被accept()的连接数,若Recv-Q接近min(somaxconn, backlog),说明全连接队列即将满。netstat -antp | grep SYN_RECV | wc -l # 统计处于SYN_RECV状态的连接数
若SYN_RECV状态的连接数持续增长且接近tcp_max_syn_backlog,说明半连接队列已满,可能需要开启tcp_syncookies(echo 1 > /proc/sys/net/ipv4/tcp_syncookies)。stress-ng可模拟高并发连接,配合ab或siege等工具,进一步验证backlog的稳定性。
yum install -y epel-release
yum install -y stress-ng
stress-ng --hdd 1 --io 1 --cpu 4 --vm 2 --vm-bytes 512M --timeout 60s &
同时运行ab命令进行压力测试,观察系统是否能承受高并发压力。/etc/sysctl.conf中的net.core.somaxconn值(如设置为2048),并重启应用(如Nginx、Apache)使更改生效。/etc/sysctl.conf中的net.ipv4.tcp_max_syn_backlog值(如设置为4096),或开启tcp_syncookies(echo 1 > /proc/sys/net/ipv4/tcp_syncookies)以防止SYN Flood攻击。通过以上步骤,可全面测试CentOS系统的backlog性能,定位队列瓶颈并进行优化,确保系统在高并发场景下的稳定性。