温馨提示×

什么是Linux backlog

小樊
41
2026-07-06 23:43:52
栏目: 智能运维

在 Linux 中,backlog 通常指 网络连接队列的长度,尤其是在 TCP 服务端监听 socket 中。它决定了内核允许多少个尚未被 accept 的连接排队等待

下面分层解释,避免混淆。


一、backlog 是什么?

在 Linux 网络编程中,当你创建一个 TCP 服务时,通常会调用:

listen(fd, backlog);

这里的 backlog 表示:

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


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

Linux 内核中,TCP 实际上维护 两个队列

1️⃣ 半连接队列(SYN Queue)

  • 存放 SYN_RECV 状态的连接
  • 对应 半开连接(未完成三次握手)
  • /proc/sys/net/ipv4/tcp_max_syn_backlog 影响

2️⃣ 全连接队列(Accept Queue)

  • 存放 ESTABLISHED 状态
  • 已经完成三次握手
  • 等待应用程序调用 accept()
  • listen() 中的 backlog 主要限制的是这个队列

backlog ≈ 全连接队列长度上限


三、backlog 的真实含义(Linux 细节)

Linux 2.2+ 中:

listen()backlog 不是精确值

实际队列长度 =

min(backlog, net.core.somaxconn)

相关内核参数

cat /proc/sys/net/core/somaxconn

默认通常是:

128

意思是:

  • 即使你写 listen(fd, 1024)
  • 实际队列上限仍是 somaxconn

想真正提高 backlog,必须同时调大 somaxconn


四、backlog 满了会发生什么?

当全连接队列满了:

  • 新的 TCP 握手完成连接 会被丢弃
  • 客户端可能:
    • 超时
    • 重传
    • 连接失败

表现:

  • accept() 来不及处理
  • 高并发时连接失败率上升

五、常见误区

❌ 误区 1:backlog 是半连接队列

✅ 错,那是 tcp_max_syn_backlog

❌ 误区 2:backlog 越大越好

✅ 错,太大:

  • 占用内核内存
  • 掩盖程序性能问题

❌ 误区 3:backlog 是并发连接数

✅ 错,它只是 等待 accept 的连接数


六、如何调优 backlog(实战)

1️⃣ 程序中

listen(fd, 1024);

2️⃣ 内核参数

sysctl -w net.core.somaxconn=1024
sysctl -w net.ipv4.tcp_max_syn_backlog=2048

永久生效:

/etc/sysctl.conf
net.core.somaxconn = 1024
net.ipv4.tcp_max_syn_backlog = 2048

七、如何查看是否丢连接?

netstat -s | grep -i listen

或:

ss -lnt

关注:

  • Recv-Q
  • Send-Q

八、一句话总结

Linux backlog 是 TCP 全连接队列的长度上限,限制已完成三次握手、等待 accept 的连接数量,不是并发连接数,也不是半连接数。

如果你愿意,我可以:

  • 画一张 TCP 接收队列示意图
  • 结合 Nginx / Redis / Java / Go 讲 backlog
  • 帮你排查 accept queue overflow 问题

0