在 Linux 里说到 backlog,通常有几种常见场景,排查方式不一样。我先按最常见的情况给你分类说明,你可以对号入座。
指 listen() 的 accept queue(全连接队列) 和 syn queue(半连接队列)。
ss -lnt
重点看:
Recv-Q:当前已完成握手、等待 accept 的连接数Send-Q:backlog 设置值(如 listen(fd, 128))示例:
LISTEN 129 128 *:80 *:*
Recv-Q > Send-Q → accept queue 满了
netstat -s | grep -i listen
关注:
listen queue errorstimes the listen queue of a socket overflowed有数值且持续增长 → backlog 太小或进程 accept 太慢
sysctl net.core.somaxconn
sysctl net.ipv4.tcp_max_syn_backlog
somaxconn:限制 listen backlog 上限tcp_max_syn_backlog:半连接队列大小调大示例:
sysctl -w net.core.somaxconn=4096
应用层也要改(如 Nginx):
listen 80 backlog=4096;
listen 80 backlog=1024;
worker_connections 10240;
top
pidstat -p <pid> 1
或:
strace -p <pid> -e accept,epoll_wait
如 Kafka、RabbitMQ、Celery
查看:
# Kafka
kafka-consumer-groups.sh --describe
# RabbitMQ
rabbitmqctl list_queues
如:
iostat -x 1
await、util 高 → IO 积压
✅ ss -lnt 看 Recv-Q
✅ netstat -s 看 overflow
✅ somaxconn 是否太小
✅ 应用是否 accept 慢
✅ 是否需要扩容消费者
如果你能告诉我:
我可以直接给你针对性的排查命令和解决方案。