如何监控Ubuntu backlog的状态变化
导读:监控 Ubuntu backlog 状态变化 一 关键概念与判定依据 backlog 在 Linux 中指监听套接字的**全连接队列(accept 队列)**长度上限,应用调用 listen(backlog 时指定,但上限受内核参数 n...
监控 Ubuntu backlog 状态变化
一 关键概念与判定依据
- backlog 在 Linux 中指监听套接字的**全连接队列(accept 队列)**长度上限,应用调用 listen(backlog) 时指定,但上限受内核参数 net.core.somaxconn 约束,最终生效值为 min(应用 backlog, somaxconn)。队列满后新连接的处理由 net.ipv4.tcp_abort_on_overflow 决定:0 丢弃最后的 ACK(客户端可能长时间等待),1 返回 RST(客户端立即报错)。监控时应同时关注队列使用率与溢出事件。
二 命令行快速观测
- 实时查看各监听端口队列
- 使用 ss 观察队列使用:ss -tnlp | awk ‘$1==“LISTEN”{ print $1,$4,$5,$1,$2,$6} ’ # 关注 Recv-Q(当前排队)与 Send-Q(队列上限)
- 解读要点:对处于 LISTEN 的套接字,Recv-Q 是未被应用 accept 的当前排队连接数;Send-Q 是该套接字允许的最大队列长度(即 min(应用 backlog, somaxconn))。
- 观察全连接队列溢出
- 统计溢出次数:netstat -s | grep -E ‘listen queue|overflow’ 或 cat /proc/net/netstat | awk ‘/TcpExt:/{ print $NF} ’ | tail -1
- 若数值随时间递增,说明队列出现过满。
- 关联具体监听端口
- 当出现溢出时,可用 ss -tnlp 找出 Recv-Q 较大的 LISTEN 端口;同时 netstat -s 的输出可帮助确认溢出趋势。
- 抓包验证握手与丢弃
- 在可疑端口抓包:tcpdump -i any -nn port 80 and ‘tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn’
- 若队列满且 tcp_abort_on_overflow=0,常见现象是服务器对最后的 ACK 不响应(客户端半开连接挂起);若为 1,则会看到服务器返回 RST。
三 持续监控与告警方案
- 轻量脚本 + 系统日志(适合单机)
- 思路:周期性采样 ss 的 Recv-Q/Send-Q,计算使用率;同时读取 netstat -s 的溢出计数;超过阈值时写 syslog 并触发邮件/企业微信/钉钉 Webhook。
- 关键指标与阈值建议:
- 队列使用率 = Recv-Q / Send-Q;建议阈值 ≥ 70% 预警、≥ 90% 严重。
- 溢出计数:只要持续递增即告警。
- 权限:通常需要 sudo 才能读取 ss/netstat 的完整信息。
- Prometheus + Node Exporter + Alertmanager(适合集群)
- 采集:用 node_exporter 的 textfile 收集器暴露自定义指标(脚本输出到 /var/lib/node_exporter/textfile_collector/backlog.prom)。
- 指标示例(Prometheus 格式):
- backlog_usage{ port=“80”,proto=“tcp”} 0.72
- backlog_overflow_total{ port=“80”} 128
- 告警规则示例:
- 高使用率:ALERT BacklogHighUsage IF backlog_usage > 0.9 FOR 1m
- 溢出增长:ALERT BacklogOverflowDetected IF increase(backlog_overflow_total[5m]) > 0
- 可视化:Grafana 绘制每个端口的队列使用率曲线与溢出计数趋势。
四 排查与优化要点
- 定位热点端口与峰值时段
- 用 ss -tnlp 按端口聚合 Recv-Q 最大值;结合业务高峰与压测复现峰值。
- 调整队列上限
- 临时:echo 1024 > /proc/sys/net/core/somaxconn;echo 1024 > /proc/sys/net/ipv4/tcp_max_syn_backlog
- 永久:在 /etc/sysctl.d/99-backlog.conf 写入
- net.core.somaxconn = 1024
- net.ipv4.tcp_max_syn_backlog = 1024
- 执行 sysctl -p 生效。
- 注意:应用层 backlog 也需同步调大,最终上限仍受 somaxconn 约束。
- 溢出处置策略
- 若业务允许快速失败,可将 tcp_abort_on_overflow=1,减少客户端半开等待;否则保持 0 并结合扩容/优化 accept 能力。
- 应用层优化
- 提升 accept 并发(多 worker/多进程/异步 I/O)、降低 accept 延迟、缩短连接空闲时间,避免队列长期占满。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 如何监控Ubuntu backlog的状态变化
本文地址: https://pptw.com/jishu/788181.html
