温馨提示×

linux backlog是什么队列

小樊
43
2026-10-08 07:30:31
栏目: 智能运维

在 Linux 网络编程和系统内核中,**backlog(积压队列)**通常指的是 TCP 监听套接字(listen socket)上用于暂存连接请求的队列。它不是一个单一的队列,而通常包含两个逻辑队列(根据内核版本和实现有所不同)。


一、backlog 出现在哪里?

在服务器端使用 TCP 时,典型流程是:

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

其中 listen() 的第二个参数 backlog 就是“积压队列长度”。


二、backlog 到底是什么队列?

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

  • 存放 已收到 SYN,但还未完成三次握手 的连接
  • 对应状态:SYN_RCVD
  • 受内核参数影响:
    /proc/sys/net/ipv4/tcp_max_syn_backlog
    

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

  • 存放 已完成三次握手,但还未被 accept() 取走 的连接
  • 对应状态:ESTABLISHED
  • listen(fd, backlog) 主要限制的是这个队列

✅ backlog 实际限制的是“全连接队列”长度(Linux 2.2+)


三、backlog 的真实含义(Linux 具体行为)

在 Linux 中:

listen(sockfd, backlog)

实际队列长度是:

min(backlog, /proc/sys/net/core/somaxconn)
  • somaxconn 默认通常是 128
  • 即使你写 listen(fd, 1024),也可能被截断为 128

查看:

cat /proc/sys/net/core/somaxconn

修改:

sysctl -w net.core.somaxconn=1024

四、连接处理流程示意

客户端 SYN
   ↓
[半连接队列]
   ↓ 三次握手完成
[全连接队列]
   ↓ accept()
应用程序

如果:

  • 半连接队列满 → 丢弃 SYN(或重试)
  • 全连接队列满 → 客户端可能收到 connection refused 或超时

五、backlog 设置多大合适?

场景 建议
普通 Web 服务 128–512
高并发短连接 1024+
容器 / 微服务 配合 somaxconn
突发流量 增大 backlog

⚠️ 注意:

  • backlog 不是越大越好
  • 太大可能掩盖 accept() 处理慢的问题

六、常见误区

❌ backlog 是“最大连接数”
✅ 不是,是“待 accept 的连接数”

❌ backlog 包含半连接
✅ 主要是全连接(历史实现有差异)

❌ 改了 listen 就够
✅ 还要改 somaxconn


如果你愿意,我也可以:

  • 画一张 连接队列流程图
  • 讲 Nginx / Redis / Java Netty 的 backlog
  • 分析 队列满了的抓包现象

你现在是在学网络编程,还是排查性能问题?

0 踩