在CentOS系统中,“backlog”问题主要涉及TCP连接队列溢出(全连接队列、半连接队列)、审计服务日志缓冲区溢出、系统日志过大等场景,以下是针对性修复方案:
全连接队列(Listen Queue)用于存放已完成三次握手但未被应用进程accept()的连接,溢出时客户端会收到“Connection refused”或“Connection reset by peer”错误。
1. 确认溢出
netstat -s | grep "listen"查看“listen queue overflow”次数(若数值持续增加,说明溢出)。ss -lnt查看监听端口的Send-Q(队列中未被accept()的字节数),若Send-Q接近Recv-Q(已接收的字节数),则队列已满。2. 修复步骤
backlog参数:修改服务配置(如Nginx、Tomcat),增大listen指令的backlog值(如backlog=2048),确保应用能接收更多等待连接。somaxconn参数:somaxconn是OS限制的全连接队列最大值,需≥应用层的backlog值。
echo 2048 > /proc/sys/net/core/somaxconn/etc/sysctl.conf中添加net.core.somaxconn=2048,执行sysctl -p使配置生效。半连接队列(SYN_RECV队列)存放已收到SYN包但未完成三次握手的连接,溢出时内核会丢弃新SYN包,客户端收到“Connection timed out”。
1. 确认溢出
netstat -s | grep "SYNs to LISTEN"查看半连接队列溢出次数(数值持续增加则溢出)。netstat -antp | grep SYN_RECV | wc -l统计当前SYN_RECV状态的连接数(正常应为0或很小)。2. 修复步骤
tcp_max_syn_backlog参数(默认1024),建议设为4096或更高。
echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog/etc/sysctl.conf中添加net.ipv4.tcp_max_syn_backlog=4096,执行sysctl -p。echo 1 > /proc/sys/net/ipv4/tcp_syncookies/etc/sysctl.conf中添加net.ipv4.tcp_syncookies=1,执行sysctl -p。当审计日志产生速率超过缓冲区处理能力时,会出现“backlog limit exceeded”错误,导致审计事件丢失。
1. 确认溢出
journalctl -xe或/var/log/messages),搜索“audit: backlog limit exceeded”。ausearch -m AVCS -ts recent查看审计缓存状态(若cache_size接近backlog限制,则溢出)。2. 修复步骤
auditctl -b 8192(将缓冲区大小设为8192KB)。/etc/audit/audit.rules,添加-b 8192(删除原有-b参数,避免冲突),重启审计服务:systemctl restart auditd。系统日志(如/var/log/messages、journalctl日志)过大时,会导致磁盘空间耗尽,间接影响系统性能(如无法写入新的backlog信息)。
1. 确认日志大小
journalctl --disk-usage查看日志占用磁盘空间。du -sh /var/log/*查看/var/log目录下各日志文件大小。2. 清理日志
sudo journalctl --vacuum-size=100M)或最近2周日志(sudo journalctl --vacuum-time=2weeks)。sudo rm -f /var/log/messages*),或压缩日志(sudo gzip /var/log/messages*)。netdev_max_backlog是内核从网卡接收数据包后,交由协议栈处理的缓冲队列,溢出时会导致数据包丢失(可通过/proc/net/softnet_stat查看丢包数)。
1. 确认溢出
cat /proc/net/softnet_stat,每行代表一个CPU核的状态,第二列数字表示因netdev_max_backlog溢出丢弃的数据包数(若数值持续增加,则溢出)。2. 修复步骤
netdev_max_backlog参数(默认1000),建议设为2000或更高(根据网络流量调整)。
echo 2000 > /proc/sys/net/core/netdev_max_backlog/etc/sysctl.conf中添加net.core.netdev_max_backlog=2000,执行sysctl -p。当系统处理的连接数超过nf_conntrack_max限制时,会导致新连接被丢弃(常见于高并发场景)。
1. 确认溢出
cat /proc/sys/net/netfilter/nf_conntrack_count。cat /proc/sys/net/netfilter/nf_conntrack_max。count接近max,则需调整。2. 修复步骤
nf_conntrack_max(根据内存计算,公式:CONNTRACK_MAX = RAMSIZE(in bytes)/16384/(ARCH/32),如32G内存设为1048576)。
echo 1048576 > /proc/sys/net/netfilter/nf_conntrack_max/etc/sysctl.conf中添加net.netfilter.nf_conntrack_max=1048576,执行sysctl -p。echo 3600 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established/etc/sysctl.conf中添加net.netfilter.nf_conntrack_tcp_timeout_established=3600,执行sysctl -p。netstat -s、ss -lnt、/proc/net/softnet_stat等命令定期检查队列状态,及时发现溢出趋势。logrotate工具,自动清理旧日志,避免日志占用过多磁盘空间。