ubuntu backlog如何查看
小樊
48
2025-11-23 16:22:02
Ubuntu 中 Backlog 的查看方法
一、概念与判断要点
- 在网络语境下,backlog通常指 TCP 的半连接队列(SYN 队列) 与 全连接队列(Accept 队列)。内核参数 net.ipv4.tcp_max_syn_backlog 影响半连接队列长度,net.core.somaxconn 影响全连接队列上限(实际生效值还会受应用 listen(backlog) 与内核上限共同约束)。在监听套接字上,使用 ss -lnt 时:Recv-Q 表示当前未被应用 accept 的连接数(即全连接队列当前使用量),Send-Q 表示该监听套接字的 listen backlog 上限(应用设置值,受 somaxconn 限制)。
二、快速查看命令
- 查看各监听端口的 backlog 使用与上限
- 推荐:ss -lntp
- 关注列:Recv-Q(未被 accept 的连接数)、Send-Q(该监听的 backlog 上限)、State(应为 LISTEN)、PID/Program name(定位进程)。
- 示例:ss -lntp | egrep ‘(:80|:443|:8080)’
- 兼容:netstat -lntp(若系统仍提供 netstat)
- 查看内核队列相关参数
- 当前生效值:
- sysctl net.core.somaxconn
- sysctl net.ipv4.tcp_max_syn_backlog
- 运行时临时调整(示例):
- sudo sysctl -w net.core.somaxconn=4096
- sudo sysctl -w net.ipv4.tcp_max_syn_backlog=4096
- 查看队列统计与线索
- ss -s(总体套接字/队列摘要)
- dmesg | grep -i backlog(内核日志中相关线索)
- 针对某服务:journalctl -u <service_name> | grep -i backlog(服务日志)
- 抓包定位握手与排队问题
- sudo tcpdump -i any -nn port 80 or port 443
- 说明
- 需要 sudo/root 才能查看完整进程信息与部分内核统计。
三、读懂输出与常见排查
- 如何判断队列是否堆积
- 在 LISTEN 行看到 Recv-Q 持续大于 0 且接近或等于该行的 Send-Q,说明全连接队列经常打满,应用 accept 速度跟不上连接到达速度。
- 若新连接建立明显变慢或偶发失败,同时 Recv-Q 高企,优先检查应用 accept 路径(工作线程不足、阻塞等)。
- 如何判断是否发生半连接拥塞
- 内核统计与抓包结合:若 net.ipv4.tcp_max_syn_backlog 偏小、SYN 重传增多、tcpdump 看到大量 SYN 而无后续,可能是半连接队列溢出。
- 调整与验证
- 适当提升 net.core.somaxconn 与 net.ipv4.tcp_max_syn_backlog,并确保应用 listen(backlog) 参数与之匹配;调整后再次用 ss -lntp 观察 Send-Q 与 Recv-Q 的变化。
四、非网络场景的 backlog 含义
- 若你指的是“任务/进程/日志”的积压而非网络队列,可用相应工具查看:
- 进程/线程负载:top、htop、ps -eLf
- 打开文件描述符数量:lsof | wc -l
- 系统日志条目数量:journalctl --count
- 这些指标可帮助你判断是否存在“处理不过来”的积压,但它们与 TCP backlog 概念不同。