在 Linux 网络编程和系统中,backlog 通常指 listen() 系统调用中的 backlog 参数,以及与之相关的内核队列长度。它会影响 TCP 连接建立过程中半连接和全连接队列的大小,从而影响服务的并发连接能力和在高并发下的表现。
下面从多个层面说明什么会影响 Linux 的 backlog。
int listen(int sockfd, int backlog);
backlog 在历史上表示:
现代 Linux 中更精确地说:
net.ipv4.tcp_max_syn_backlog 控制listen(backlog) 参数应用层设置的 backlog:
listen(sockfd, 128);
⚠️ 它不会单独生效,而是受内核参数限制。
net.core.somaxconn这是全连接队列的最大值:
cat /proc/sys/net/core/somaxconn
# 常见默认 128
实际 accept 队列长度 = min(backlog, somaxconn)
✅ 如果你设置:
listen(sockfd, 100000);
但 somaxconn=128,那么队列上限仍是 128。
net.ipv4.tcp_max_syn_backlog控制 SYN 队列(半连接):
cat /proc/sys/net/ipv4/tcp_max_syn_backlog
# 常见默认 1024
影响:
net.ipv4.tcp_syncookiescat /proc/sys/net/ipv4/tcp_syncookies
1:启用 SYN Cookie✅ 防御 SYN Flood
❌ 可能影响某些 TCP 特性
accept()即使 backlog 很大:
accept() 慢表现:
ESTABLISHED 但无响应ulimit -n
backlog 再大,也受:
每个连接占用:
大量 backlog 会消耗内存。
原因:
somaxconn=128
解决:
sysctl -w net.core.somaxconn=65535
SYN_RCVD可能:
tcp_max_syn_backlog 太小说明:
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_syncookies = 1
应用层:
listen(sockfd, 65535);
并确保:
Linux backlog 实际大小 = min(listen backlog, somaxconn),并受半连接队列、accept 速度、fd 和内存共同影响。
如果你愿意,我可以: