温馨提示×

linux backlog包含什么

小樊
43
2026-10-11 06:46:56
栏目: 智能运维

在 Linux 网络编程和系统管理中,backlog 这个词最常出现在 TCP 监听 socket 的上下文中,也偶尔用于其他队列场景。下面分层次说明。


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

1. 函数原型

int listen(int sockfd, int backlog);

2. backlog 包含什么?

在历史上(和不同内核版本中),backlog 的含义发生过变化,但现代 Linux中:

backlog 是“未完成连接” + “已完成连接”的总和上限(近似)

更准确地说,Linux 内核使用两个队列:

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

  • 存放 SYN_RCVD 状态的 socket
  • 对应:客户端发了 SYN,服务器回了 SYN+ACK,但还没收到 ACK
  • 受 net.ipv4.tcp_max_syn_backlog 影响

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

  • 存放 ESTABLISHED 状态、但尚未被 accept() 的 socket
  • 客户端三次握手已完成
  • 受 listen() 的 backlog 和 somaxconn 限制

3. 实际限制规则(Linux)

实际 accept 队列长度 = min(backlog, net.core.somaxconn)
  • backlog:应用程序设置
  • somaxconn:系统级上限(默认通常 128 或 4096)

4. 总结一句话

Linux 中 listen 的 backlog,主要限制“已完成但未被 accept 的连接数”,并间接影响半连接队列大小


二、backlog 包含的内容(逻辑上)

一个 listen socket 的 backlog 覆盖:

✅ 已收到 SYN,未完成握手
✅ 已完成三次握手,等待 accept()
❌ 已被 accept() 的连接(不再属于 backlog)


三、其他场景中的 backlog

1. UNIX Domain Socket

  • 同样有 listen(fd, backlog)
  • 含义类似 TCP
  • 通常只关注全连接队列

2. 系统队列 / 设备队列

  • 网络接口接收队列(rx backlog)
  • 软中断 backlog(softirq)
  • 这些是内核内部概念,不等同于 listen() 的 backlog

四、常见问题

Q:backlog 设很大就好了吗?

不是:

  • 受 somaxconn 限制
  • 太大浪费内存
  • 连接堆积说明应用处理慢

Q:队列满了会怎样?

  • 客户端可能:
    • 连接超时
    • 收到 RST
  • 服务端:
    • accept() 之前连接被丢弃

五、查看与调优

# 查看系统上限
cat /proc/sys/net/core/somaxconn

# 修改
sysctl -w net.core.somaxconn=1024

# SYN 队列
cat /proc/sys/net/ipv4/tcp_max_syn_backlog

如果你是指:

  • 某个具体函数(如 accept / connect)
  • 某个服务(Nginx / Redis / Kafka)
  • 内核源码层面的队列结构

可以告诉我,我可以更针对性讲解。

0 踩