温馨提示×

怎样修改Linux backlog

小樊
46
2026-07-06 23:45:52
栏目: 智能运维

在 Linux 中,“backlog” 通常指 TCP 监听队列(listen backlog),也就是 listen() 系统调用中的 backlog 参数,以及内核中与之相关的队列长度。下面分几种常见场景说明如何修改与优化。


一、什么是 backlog

int listen(int sockfd, int backlog);

backlog 表示:

  • 已完成连接(ESTABLISHED)但还未被 accept() 的队列长度上限
  • 实际受内核参数限制,不完全等于你设置的值

二、修改应用程序中的 backlog

1️⃣ 修改代码中的 backlog 值

例如在 C 程序中:

listen(server_fd, 1024);

注意:

  • 即使你设置成 5000,内核也可能限制它

三、修改 Linux 内核 backlog 限制(关键)

Linux 有两个重要内核参数:

1️⃣ net.core.somaxconn

控制 listen() 的 backlog 上限

查看:

cat /proc/sys/net/core/somaxconn

默认通常是:

128

临时修改:

sysctl -w net.core.somaxconn=4096

永久修改:

echo "net.core.somaxconn = 4096" >> /etc/sysctl.conf
sysctl -p

2️⃣ net.ipv4.tcp_max_syn_backlog

控制半连接(SYN_RECV)队列长度

查看:

cat /proc/sys/net/ipv4/tcp_max_syn_backlog

修改:

sysctl -w net.ipv4.tcp_max_syn_backlog=8192

永久生效:

echo "net.ipv4.tcp_max_syn_backlog = 8192" >> /etc/sysctl.conf
sysctl -p

四、backlog 实际生效规则(非常重要)

Linux 中 最终 backlog = min(应用 backlog, somaxconn)

例如:

listen(sock, 5000)
somaxconn = 4096

✅ 实际生效的是 4096


五、其他相关参数(高并发场景)

1️⃣ TIME_WAIT 优化(短连接多时)

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0   # 不推荐开启(NAT 问题)

2️⃣ 端口范围

net.ipv4.ip_local_port_range = 1024 65535

3️⃣ TCP 队列满时的行为

net.ipv4.tcp_abort_on_overflow = 0
  • 0:丢包重试
  • 1:直接返回 RST(调试时有用)

六、如何确认是否生效

查看监听队列溢出

netstat -s | grep -i listen

或:

ss -lnt

关注:

  • Recv-Q
  • Send-Q

如果 Recv-Q 经常接近 backlog,说明队列不够或 accept 不及时。


七、常见场景建议值(参考)

场景 somaxconn tcp_max_syn_backlog
普通 Web 1024 2048
高并发 API 4096 8192
网关 / 反向代理 8192 16384

八、总结一句话

修改 backlog 不只是改代码,还要调 somaxconntcp_max_syn_backlog

如果你愿意,可以告诉我:

  • 用的是 Nginx / Redis / 自写服务
  • 并发量大概多少
  • 短连接还是长连接

我可以给你一套更精确的参数配置。

0