centos backlog怎么办
导读:CentOS 出现 backlog 问题的定位与处理 一、先判断是哪一类 backlog 常见有两类: TCP 连接队列:包含“半连接队列”(SYN_RECV)与“全连接队列”(已完成三次握手、等待进程 accept)。全连接队列的实际...
CentOS 出现 backlog 问题的定位与处理
一、先判断是哪一类 backlog
- 常见有两类:
- TCP 连接队列:包含“半连接队列”(SYN_RECV)与“全连接队列”(已完成三次握手、等待进程 accept)。全连接队列的实际上限是应用 listen(backlog) 与内核 net.core.somaxconn 的较小值;半连接队列受 net.ipv4.tcp_max_syn_backlog 等影响。
- 审计日志 backlog:内核审计子系统(auditd)缓冲区溢出,日志出现 “audit: backlog limit exceeded”。该值与内存占用直接相关。
二、TCP 连接队列满载的排查与处理
- 快速判断
- 查看全连接队列使用:ss -lnt | grep :端口,关注 Recv-Q(当前队列长度)与 Send-Q(队列上限)。例如看到 Send-Q 为 128,说明上限仅 128。
- 检查是否发生溢出:watch -n1 “netstat -s | egrep ‘listen queue|overflowed|drop’”,若 “listen queue overflowed” 或 “packet dropped because of full socket buffer” 持续增长,说明队列经常满。
- 观察半连接:ss -s | grep SYN_RECV 或 netstat -an | grep SYN_RECV | wc -l,数量异常升高常见于半连接积压。
- 溢出行为控制:cat /proc/sys/net/ipv4/tcp_abort_on_overflow;为 0 时队列满会丢弃客户端的 ACK(更平滑),为 1 时直接回 RST(便于快速定位问题,但客户端会见到 “connection reset by peer”)。
- 立即缓解
- 提升应用 backlog:例如 Nginx 在 listen 80 backlog=8192;PHP-FPM 设置 listen.backlog=1024(常见默认值为 511)。注意最终上限仍受内核限制。
- 提升内核上限(临时生效):
- echo 16384 > /proc/sys/net/core/somaxconn
- echo 16384 > /proc/sys/net/ipv4/tcp_max_syn_backlog
- echo 32768 > /proc/sys/net/core/netdev_max_backlog
- 持久化(写入 /etc/sysctl.conf 后执行 sysctl -p):
- net.core.somaxconn = 16384
- net.ipv4.tcp_max_syn_backlog = 16384
- net.core.netdev_max_backlog = 32768
- 半连接攻击/突发 SYN 场景:开启 net.ipv4.tcp_syncookies=1 提升抗洪能力(仅在队列溢出风险高时启用)。
- 根本优化
- 加快应用 accept 能力:增加 worker 进程/线程、优化 accept 循环、使用异步 I/O,确保能“消费”队列。
- 限流与削峰:通过 iptables/tc 或前置 HAProxy/Nginx 做连接限速与分发,避免单机瞬时过载。
- 观测与回归:压测验证队列是否仍满,并持续监控 Recv-Q/Send-Q 与溢出计数。
三、审计日志 backlog 超限的处理
- 现象与风险
- 系统日志出现 “audit: backlog limit exceeded”,严重时可导致 SSH 卡死/无法登录、系统无响应。
- 处理步骤
- 查看当前审计状态与缓冲:auditctl -s(关注 backlog_limit、lost 等)。
- 调整缓冲上限(临时):auditctl -b 8192(示例值)。内存估算:单个审计缓冲约 8970 字节,例如 10000 个缓冲约 87 MiB。
- 永久生效:编辑 /etc/audit/audit.rules,在合适位置加入 “-b 8192”(或所需值),然后重启 auditd:service auditd restart。
- 不建议直接禁用 auditd(会降低安全审计能力)。如确需临时处置,可在确保合规的前提下停用,再恢复并优化规则与缓冲。
四、常用参数与推荐起点
| 参数 | 作用 | 建议起点(按并发逐步调大) |
|---|---|---|
| net.core.somaxconn | 全连接队列上限(与应用 backlog 取小) | 16384 |
| net.ipv4.tcp_max_syn_backlog | 半连接队列上限 | 16384 |
| net.core.netdev_max_backlog | 网卡接收队列 | 32768 |
| net.ipv4.tcp_abort_on_overflow | 队列满时是否回 RST | 排查期设 1,稳定期 0 |
| net.ipv4.tcp_syncookies | SYN 洪泛保护 | 1(仅在风险高时启用) |
| audit.rules “-b” | 审计缓冲上限 | 依据内存与丢失情况逐步上调(如 8192) |
- 应用侧配合示例:Nginx listen backlog=8192;PHP-FPM listen.backlog=1024。调大内核与应用的数值后,务必压测并观察队列与溢出指标,避免“设过大却无法被消费”的资源浪费。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: centos backlog怎么办
本文地址: https://pptw.com/jishu/752386.html
