温馨提示×

linux backlog单位是啥

小樊
48
2026-09-17 13:56:53
栏目: 智能运维

在 Linux 网络编程里,backlog 的单位是“连接数(connections)”,更准确地说,是等待被 accept 的已建立连接(已完成三次握手)的数量上限

不过要注意几个历史细节和内核版本差异:


1. listen(sockfd, backlog) 里的 backlog 是什么

int listen(int sockfd, int backlog);
  • 传统含义
    backlog = 已完成连接(ESTABLISHED)但还没被 accept() 的队列长度上限

  • 内核实际行为(Linux)
    从 Linux 2.2 开始,backlog 同时影响两个队列(简化理解):

    • 半连接队列(SYN_RECV)
    • 全连接队列(ESTABLISHED,等待 accept)

    并不是简单等于某个队列长度


2. Linux 实际怎么用 backlog

在 Linux 中:

  • listen()backlog 会被内核截断为:

    min(backlog, /proc/sys/net/core/somaxconn)
    

    默认 somaxconn = 1284096(取决于发行版)

  • 全连接队列长度 ≈ backlog

  • 半连接队列长度由:

    /proc/sys/net/ipv4/tcp_max_syn_backlog
    

    控制


3. 单位总结

backlog 的单位是:个(连接数)

不是:

  • 字节
  • 时间
  • 包数

4. 举个例子

listen(fd, 50);

意思是:

最多允许约 50 个已经建立好 TCP 连接、但还没被 accept() 的客户端的排队

如果超过:

  • 新连接可能被 丢弃
  • 或客户端收到 RST
  • 或 SYN 被忽略(取决于内核配置)

5. 常见误区

❌ “backlog 是并发连接数”
✅ 不是,只是等待 accept 的队列长度

❌ “backlog 越大越好”
✅ 太大可能拖慢故障发现,一般够用即可(如 128 / 512 / 1024)


如果你是想问:

  • epoll 里的 backlog
  • nginx / redis / golang 的 backlog
  • 为什么压测时连接被拒

可以继续问,我可以结合具体场景讲。

0