温馨提示×

linux backlog怎么调优

小樊
43
2026-09-08 10:18:24
栏目: 智能运维

在 Linux 中,backlog 通常指两类东西,调优方式不同,先明确一下你指的是哪一种:

  1. TCP 监听队列 backloglisten(fd, backlog)
  2. 内核网络接收/发送队列、连接队列相关参数

下面按最常见的 TCP backlog 调优来讲,也是面试和实战中最常遇到的。


一、TCP 监听 backlog 是什么

listen(sockfd, backlog);

backlog 表示:已完成三次握手、等待 accept 的队列长度上限(不完全准确,见下)。

实际队列由两个部分组成:

队列 含义
半连接队列 (SYN Queue) 收到 SYN,未完成握手
全连接队列 (Accept Queue) 完成握手,等待应用 accept

二、backlog 实际受谁限制(重点)

backlog 不是你设多少就多少

实际全连接队列长度 =

min(backlog, net.core.somaxconn)

1️⃣ 应用层 backlog

listen(fd, 1024);

2️⃣ 内核参数 somaxconn

cat /proc/sys/net/core/somaxconn

默认通常是:

128

⚠️ 这是最常见的瓶颈


三、标准调优步骤(生产推荐)

✅ 1. 调大 somaxconn

# 临时
sysctl -w net.core.somaxconn=4096

# 永久
echo "net.core.somaxconn=4096" >> /etc/sysctl.conf
sysctl -p

✅ 2. 调大 TCP 半连接队列

sysctl -w net.ipv4.tcp_max_syn_backlog=8192

永久:

echo "net.ipv4.tcp_max_syn_backlog=8192" >> /etc/sysctl.conf

✅ 3. 应用层 listen backlog 也要改

例如:

  • Nginx:listen 80 backlog=4096;
  • Redis:tcp-backlog 511
  • 自己写代码:listen(fd, 4096)

应用 backlog ≤ somaxconn 才有效


✅ 4. 启用 SYN Cookie(防 SYN Flood)

sysctl -w net.ipv4.tcp_syncookies=1

四、如何判断是否 backlog 满了

1️⃣ 查看溢出

netstat -s | grep -i listen

nstat | grep -i Listen

关注:

ListenOverflows
ListenDrops

非 0 说明全连接队列满了


2️⃣ ss 查看当前队列

ss -lnt

示例:

State  Recv-Q Send-Q Local Address:Port
LISTEN 0      128    *:80
  • Send-Q = 当前 backlog 上限
  • Recv-Q ≈ 等待 accept 的连接数

五、常见误区

❌ 只改代码 backlog 不生效
✅ 必须同时改 somaxconn

❌ 盲目调非常大
✅ 一般 1024–8192 足够

❌ 忽略应用 accept 速度
✅ backlog 只是缓冲,消费慢照样丢


六、典型场景建议

场景 建议
高并发 Web somaxconn=4096
短连接风暴 syncookies=1
网关 / 代理 tcp_max_syn_backlog=8192
容器环境 注意宿主机也要调

如果你愿意,可以告诉我:

  • 用的是 Nginx / Redis / 自研服务?
  • 短连接还是长连接?
  • 出现的现象是 连接超时 / 丢连接 / 握手慢?

我可以给你一套更针对性的参数

0