温馨提示×

Linux backlog怎么计算

小樊
41
2026-08-28 13:41:08
栏目: 智能运维

在 Linux 里,“backlog” 常见于 网络编程(socket)内核参数调优 场景,主要指 已完成或未完成连接队列的长度。下面按常见场景说明它的“计算方式”和含义。


一、TCP backlog 是什么?

在 TCP 服务器中,内核为每个 listen() 的 socket 维护两个队列:

  1. 半连接队列(SYN Queue)

    • 存放 SYN_RECV 状态的连接
    • 对应 half-open 连接
  2. 全连接队列(Accept Queue)

    • 存放 ESTABLISHED 状态、但还未被 accept() 的连接
    • 对应已完成三次握手的连接

backlog 通常影响的是“全连接队列”长度。


二、backlog 是如何计算的?

1️⃣ 应用层设置

listen(fd, backlog);

这里的 backlog 不是最终队列长度,而是一个“建议值”。


2️⃣ 内核最终队列长度计算(重点)

Linux 2.6.10 之后,全连接队列长度由以下公式计算:

max(backlog, somaxconn)

更准确地说:

全连接队列长度 = min(backlog, somaxconn)

实际是取 backlog 和 somaxconn 的最小值


3️⃣ somaxconn 是什么?

somaxconn 是内核参数,表示 单个 socket 的最大全连接队列长度

查看

cat /proc/sys/net/core/somaxconn

默认一般是:

128

修改

sysctl -w net.core.somaxconn=1024

或永久:

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

三、半连接队列(SYN Queue)长度

半连接队列长度 不受 backlog 直接控制,而主要受:

net.ipv4.tcp_max_syn_backlog

影响。

查看

cat /proc/sys/net/ipv4/tcp_max_syn_backlog

默认常见值:

256 / 512 / 1024

四、如何查看当前队列是否满了?

1️⃣ 使用 ss 查看

ss -lnt

重点看:

Recv-Q
Send-Q

对于 listen socket:

  • Recv-Q:当前全连接队列中的连接数
  • Send-Q:全连接队列最大长度(≈ min(backlog, somaxconn))

示例:

LISTEN 0 128 0.0.0.0:8080

表示:

  • 队列最大 128
  • 当前 0 个等待 accept

2️⃣ 查看溢出情况

netstat -s | grep "listen queue"

或:

ss -tanl

如果有:

listen queue overflows

说明: ✅ backlog / somaxconn 太小
✅ 或 accept 处理太慢


五、总结公式(面试 / 实战常用)

✅ 全连接队列长度

min(listen backlog, net.core.somaxconn)

✅ 半连接队列长度

受 net.ipv4.tcp_max_syn_backlog 影响

六、调优建议(高并发场景)

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

同时应用层:

listen(fd, 32768);

如果你是想问 backlog 在 epoll / Nginx / Redis / MySQL / 容器网络 里怎么算,也可以继续问,我可以结合具体场景详细讲。

0