温馨提示×

怎么设置Linux backlog

小樊
43
2026-08-28 13:27:07
栏目: 智能运维

在 Linux 里,“backlog” 通常出现在 网络编程(TCP 监听队列)内核 / 服务队列 的上下文中。下面按最常见场景给你一个清晰说明,并告诉你怎么设置


一、最常见:TCP 监听的 backlog(socket listen)

1️⃣ backlog 是什么?

backlog 是调用 listen(fd, backlog) 时的参数,表示:

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

而不是半连接(SYN_RECV)的数量(那由内核参数控制)。


2️⃣ 用户态如何设置 backlog

C 示例

listen(server_fd, 1024);

Python 示例

server_socket.listen(1024)

一般建议值

  • 普通服务:128 ~ 1024
  • 高并发服务:1024 ~ 4096

⚠️ 注意:不能无限大,内核会限制


3️⃣ 内核真正允许的最大值(非常关键)

backlog 会被内核参数 somaxconn 限制。

查看当前值

cat /proc/sys/net/core/somaxconn

默认通常是:

128

临时修改

sysctl -w net.core.somaxconn=4096

永久修改

vim /etc/sysctl.conf

添加:

net.core.somaxconn = 4096

然后:

sysctl -p

✅ 实际生效值 = min(listen backlog, somaxconn)


二、半连接队列(SYN 队列)的 backlog

用于 SYN_RECV 状态(TCP 三次握手未完成)

相关内核参数

cat /proc/sys/net/ipv4/tcp_max_syn_backlog

默认通常是:

256 ~ 1024

修改

sysctl -w net.ipv4.tcp_max_syn_backlog=8192

永久:

net.ipv4.tcp_max_syn_backlog = 8192

⚠️ 这个参数 不是 listen() 的 backlog,但会影响高并发连接建立。


三、Nginx / Redis / Java 等常见服务的 backlog

✅ Nginx

listen 80 backlog=4096;

生效条件:

  • somaxconn >= 4096

✅ Redis

tcp-backlog 2048

并确保:

sysctl net.core.somaxconn >= 2048

✅ Java

ServerSocket ss = new ServerSocket();
ss.bind(new InetSocketAddress(8080), 1024);

四、如何确认 backlog 是否生效?

查看 TCP 队列状态

ss -lnt

示例:

LISTEN 0 128 0.0.0.0:80

这里:

  • 128 就是当前监听队列长度

如果小于你设置的值,说明被 somaxconn 限制了。


五、推荐的高并发 Linux backlog 设置(生产环境)

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

应用层:

listen backlog = 1024 ~ 4096

六、常见误区 ❌

❌ backlog 是半连接队列
✅ 错,它是 已完成连接队列

❌ backlog 设得越大越好
✅ 错,合理范围即可,过大浪费资源

❌ 改了应用就生效
✅ 错,必须配合内核参数


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

  • 你用的是 哪种服务(Nginx / Java / C++ / Go)
  • 高并发、短连接还是长连接

我可以给你一套完整参数模板

0