温馨提示×

linux backlog作用是什么

小樊
36
2026-10-14 05:04:01
栏目: 智能运维

在 Linux 网络编程和系统管理中,backlog 最常见的含义是 listen() 系统调用中的连接队列长度参数,它的作用主要涉及 TCP 连接建立过程中的排队机制。

下面分点说明:


1. backlog 的基本作用

在服务器端调用:

listen(sockfd, backlog);

backlog 用来指定 内核为该 socket 维护的“未完成连接”和“已完成连接”队列的总长度上限(历史含义),用来控制:

  • 能同时容纳多少客户端发起连接
  • 防止瞬间大量连接压垮系统

2. TCP 三次握手与 backlog 的关系

TCP 建立连接的过程:

  1. 客户端发送 SYN
  2. 服务器收到后回复 SYN+ACK
  3. 客户端回复 ACK

在这个过程中,内核通常维护两个队列(不同内核版本实现不同):

早期模型(经典解释)

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

backlog 曾被认为是两者之和。

现代 Linux(2.2+)

  • backlog 主要限制全连接队列(Accept Queue)
  • 半连接队列由:
    /proc/sys/net/ipv4/tcp_max_syn_backlog
    
    控制

3. 队列满了会发生什么?

全连接队列满

  • 客户端三次握手已完成
  • 但服务器还没 accept()
  • 新连接 不会被立即拒绝
  • 客户端可能认为连接成功,但服务器不处理

半连接队列满

  • 新 SYN 被丢弃
  • 客户端表现为连接超时或重传

4. 实际开发中的影响

高并发服务器

  • backlog 太小:
    • 瞬时大量连接会丢
  • backlog 太大:
    • 占用更多内核内存
    • 延迟问题被“掩盖”

常见设置:

listen(sockfd, 128);  // 或 512

Web 服务器(Nginx / Redis)常设为:

listen 128;  // Nginx

5. 相关内核参数

# 半连接队列上限
net.ipv4.tcp_max_syn_backlog

# 全连接队列是否忽略 backlog
net.core.somaxconn

# 端口范围
net.ipv4.ip_local_port_range

backlog 实际生效值:

min(backlog, somaxconn)

6. 非网络场景中的 backlog(补充)

在 Linux 其他语境下,“backlog”也可能指:

  • 打印队列积压(print backlog)
  • 任务队列积压(job backlog)
  • 系统未处理事件数量

但在 Linux 网络编程中,90% 情况指 listen backlog。


一句话总结

Linux 中的 backlog 用来限制服务器在 accept 之前,内核能临时容纳的已完成 TCP 连接数量,是保护服务器、应对并发连接的重要措施。

如果你愿意,我也可以结合 Nginx / Redis / 自写 C 服务 给你具体示例。

0 踩