温馨提示×

如何修改Linux backlog

小樊
39
2026-08-28 13:38:06
栏目: 智能运维

在 Linux 中,“backlog” 常见于 网络连接(socket listen backlog)内核队列 场景中。下面按最常见情况给你说明如何查看和修改。


一、Socket 监听队列 backlog(最常见)

1️⃣ backlog 是什么?

backloglisten() 系统调用中的参数,表示:

已完成连接(ESTABLISHED)但还未被应用 accept() 的最大队列长度

通常受两个因素影响:

  • 应用层设置的 listen(fd, backlog)
  • 内核参数 net.core.somaxconn

2️⃣ 查看当前系统限制

cat /proc/sys/net/core/somaxconn

常见默认值:

  • Ubuntu / CentOS:128
  • 高并发服务器通常建议调大

3️⃣ 临时修改(重启失效)

sudo sysctl -w net.core.somaxconn=4096

4️⃣ 永久修改(推荐)

编辑:

sudo vi /etc/sysctl.conf

添加或修改:

net.core.somaxconn = 4096

生效:

sudo sysctl -p

✅ 这是修改 Linux backlog 最关键的一步


5️⃣ 应用代码中也需要配合

仅改内核参数 不够,应用本身也要设置 backlog:

C / C++

listen(fd, 4096);

Nginx

listen 80 backlog=4096;

Python

server_socket.listen(4096)

⚠️ 实际生效值是:

min(应用 backlog, net.core.somaxconn)

二、TCP SYN 队列(半连接队列)

如果你关心的是 SYN flood 或握手阶段

查看

cat /proc/sys/net/ipv4/tcp_max_syn_backlog

修改

sudo sysctl -w net.ipv4.tcp_max_syn_backlog=8192

永久:

net.ipv4.tcp_max_syn_backlog = 8192

三、相关重要参数(高并发必调)

net.core.netdev_max_backlog = 16384
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1

四、验证是否生效

ss -lnt

查看 Recv-Q / Send-Q 是否变大


五、常见误区 ❌

误区 说明
只改应用 backlog 会被内核截断
backlog 越大越好 太大会浪费资源
backlog = 并发连接数 仅表示等待 accept 的队列

六、推荐配置(通用服务器)

net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 8192
net.core.netdev_max_backlog = 16384

如果你能说明:

  • Nginx / Redis / 自写服务
  • 出现 “connection refused / timeout”
  • 短连接还是长连接

我可以给你更精确的修改方案

0