CentOS 上 Backlog 问题定位与处理
一、先判断是哪一种 backlog
auditctl -b 8192(将缓冲提升到约8192个条目,约≈71 MiB内存,按公式8970 字节/条目估算),并在 /etc/audit/audit.rules 顶部加入 -b 8192 永久生效,重启 auditd 后观察是否复现。不建议直接关闭审计,除非合规允许。二、快速定位 TCP 全连接与半连接队列问题
netstat -s | egrep 'listen|LISTEN'times the listen queue of a socket overflowed(全连接队列溢出计数)、SYNs to LISTEN sockets dropped(半连接 SYN 被丢弃计数)。这两项若持续增长,说明队列不足或应用 accept 太慢。ss -lnt | grep :80(看 Send-Q,即该监听套接字当前的上限)listen(fd, backlog) 时,内核实际生效的全连接队列上限为 min(backlog, net.core.somaxconn)。cat /proc/sys/net/ipv4/tcp_max_syn_backlogmin(somaxconn, backlog, tcp_max_syn_backlog) 做2 的幂上取整后再加 1(不同内核版本可能略有差异)。cat /proc/sys/net/ipv4/tcp_abort_on_overflow三、处理与优化步骤(按“先易后难、先治标后治本”的顺序)
accept() 足够快,避免全连接队列被占满。listen backlog 与业务并发匹配(例如将 php-fpm 的 listen.backlog 从 1024 提升到更高值,但仍受内核限制)。sysctl -w net.core.somaxconn=32768(或更高,视内存与负载而定)/etc/sysctl.conf 并执行 sysctl -psysctl -w net.ipv4.tcp_max_syn_backlog=8192net.ipv4.tcp_syncookies=1(仅在溢出时启用,避免常态开启影响性能)net.ipv4.tcp_abort_on_overflow=1;若希望更平滑可保持 0 并配合应用加速 accept()。/etc/sysctl.conf 后 sysctl -p):
net.core.somaxconn = 32768net.ipv4.tcp_max_syn_backlog = 8192net.ipv4.tcp_syncookies = 1net.ipv4.tcp_abort_on_overflow = 1fs.file-max、nofile 限制(避免 “Too many open files”)net.ipv4.tcp_tw_reuse=1、net.ipv4.tcp_fin_timeout 合理设置),缓解 TIME_WAIT 占用对可用端口与连接的影响(仅在确认业务安全可行时调整)。四、验证与回退
ab、wrk、hping3 等进行渐进式压测,观察错误率、连接耗时与队列指标变化。watch -n 1 "ss -s"、ss -lnt | grep :端口、netstat -s | egrep 'listen|LISTEN',确认溢出计数是否下降、队列是否不再打满。somaxconn、tcp_max_syn_backlog 设得过大导致内存与 CPU 压力上升;tcp_syncookies 仅在必要时启用。