温馨提示×

linux backlog有什么用

小樊
43
2026-09-20 17:14:21
栏目: 智能运维

在 Linux 网络编程里,backlog 主要和 TCP 监听 socket(listen()) 有关,用来控制等待被 accept 的连接队列长度。


一、backlog 是干什么的?

当你写服务器程序时,通常会:

socket()
bind()
listen(sockfd, backlog)
accept()

listen() 的第二个参数 backlog 表示:

内核中,已经完成 TCP 三次握手、但还没被用户程序 accept() 的连接,最多可以排队多少个


二、TCP 连接的两个队列(重要)

Linux 内核其实维护 两个队列:

  1. 半连接队列(SYN Queue)
    • 收到 SYN,但还没完成三次握手
  2. 全连接队列(Accept Queue)
    • 三次握手完成,等待 accept()

backlog 主要影响的是“全连接队列”长度(不同内核版本略有差异)


三、backlog 的实际作用

✅ 1. 防止瞬间大量连接把服务器打垮

  • 连接先排队
  • 服务器慢慢 accept()

✅ 2. 控制并发连接缓冲区

  • backlog 太小:新连接直接被拒绝(返回 ECONNREFUSED)
  • backlog 太大:占用内核内存

四、backlog 不是“最大连接数”

常见误解:

❌ backlog = 最大同时连接数
✅ backlog = 等待 accept 的已完成连接数

真正能连多少客户端,取决于:

  • accept() 的速度
  • 文件描述符上限
  • 系统资源

五、Linux 中 backlog 的真实长度

在 Linux 中:

实际长度 = min(backlog, /proc/sys/net/core/somaxconn)

例如:

cat /proc/sys/net/core/somaxconn
128

你写:

listen(sockfd, 1000);

实际还是 128

修改方法:

sysctl -w net.core.somaxconn=1024

六、backlog 太小会怎样?

  • 客户端可能收到:
    • Connection refused
    • 或连接超时
  • 高并发场景(秒杀、推送)容易出问题

七、常见建议值

场景 建议
普通服务 128–512
高并发 1024+
Web 服务器 和 somaxconn 一致

八、一句话总结

Linux 的 backlog 用来限制“已经完成三次握手、但还没被 accept 的 TCP 连接”的排队数量,是保护服务器、控制连接节奏的重要参数。

如果你愿意,我也可以结合 源码 / ss 命令 / 压测示例 给你讲得更底层一点。

0 踩