好的,下面给你详细介绍 Linux 内核参数 net.core.somaxconn
,它在高并发网络场景下非常关键。
Linux 内核参数 — net.core.somaxconn
1. 参数简介
- 参数名称:
net.core.somaxconn
- 参数类型:整型(int)
- 默认值:128(不同发行版可能略有差异)
- 作用:
控制 TCP 服务端listen()
系统调用中 backlog 队列的最大长度。
2. backlog 队列简介
在 TCP 服务器中,调用 listen(fd, backlog)
后,内核为该 socket 维护两个队列:
- 已完成连接队列(Completed connection queue)
已经完成三次握手,等待应用程序调用accept()
接收的连接。 - 未完成连接队列(SYN queue)
正在进行三次握手尚未完成的连接。
backlog
参数限制的是这两个队列总的最大连接数(实际上有细节差异)。
3. net.core.somaxconn
作用
- 这个参数限制内核允许的 backlog 最大值,即
listen()
中backlog
参数的上限。 - 应用调用
listen(fd, backlog)
时,若backlog > net.core.somaxconn
,则 backlog 会被限制为net.core.somaxconn
。
4. 参数调整场景
适用场景
- 高并发 TCP 服务,如 Web 服务器、反向代理、负载均衡器。
- 连接请求爆发时避免因为 backlog 队列太小导致的
SYN flood
或连接拒绝。 - 避免
accept()
速度跟不上导致连接积压。
调整建议
- 适当增大
net.core.somaxconn
,比如设置为 1024、2048 或更大。 - 配合应用层的
listen()
调用,设置对应的 backlog 参数。
5. 如何查看当前值
sysctl net.core.somaxconn
# 或
cat /proc/sys/net/core/somaxconn
6. 如何临时修改
sudo sysctl -w net.core.somaxconn=1024
或
echo 1024 | sudo tee /proc/sys/net/core/somaxconn
7. 永久修改方法
编辑 /etc/sysctl.conf
(或 /etc/sysctl.d/99-custom.conf
),添加:
net.core.somaxconn=1024
然后执行:
sudo sysctl -p
8. 相关参数
参数名 | 说明 |
---|---|
net.ipv4.tcp_max_syn_backlog | SYN 队列的长度,控制半连接数 |
net.core.netdev_max_backlog | 网络设备接收队列最大长度 |
fs.file-max | 系统最大文件描述符数 |
9. 总结
作用 | 说明 |
---|---|
net.core.somaxconn | 限制 listen() 中 backlog 的最大值 |
适合高并发服务 | 通过加大该值,允许更大连接等待队列,减少拒绝连接 |
调整需配合应用合理设置 | 应用层 listen() backlog 应不超过该值 |
好的!这里给你整理一份Linux TCP 网络调优全攻略,涵盖常见内核参数、说明、调整建议,帮你提升高并发网络环境下的性能与稳定性。
Linux TCP 调优全攻略
1. 基础参数概览
参数 | 作用说明 | 查看命令 | 调整建议 |
---|---|---|---|
net.core.somaxconn | listen() backlog 队列最大长度 | sysctl net.core.somaxconn | 增大到 1024 或更大 |
net.ipv4.tcp_max_syn_backlog | TCP 半连接(SYN 队列)长度 | sysctl net.ipv4.tcp_max_syn_backlog | 1024~4096 |
net.core.netdev_max_backlog | 网络接口接收队列最大长度 | sysctl net.core.netdev_max_backlog | 5000~10000 |
net.ipv4.tcp_tw_reuse | 允许 TIME_WAIT 状态套接字被复用 | sysctl net.ipv4.tcp_tw_reuse | 设置为1启用 |
net.ipv4.tcp_tw_recycle | 快速回收 TIME_WAIT 套接字(已弃用,不推荐) | sysctl net.ipv4.tcp_tw_recycle | 一般设置为0 |
net.ipv4.tcp_fin_timeout | FIN_WAIT_2 状态超时时间 | sysctl net.ipv4.tcp_fin_timeout | 15~30 秒 |
fs.file-max | 系统最大文件描述符数量(影响最大连接数) | cat /proc/sys/fs/file-max | 根据需求增大 |
ulimit -n | 单进程最大打开文件描述符数 | ulimit -n | 调整到数万 |
2. 参数详细说明
2.1 net.core.somaxconn
- 控制
listen()
backlog 的最大长度。应用调用listen(fd, backlog)
时,backlog 会被限制为此值。 - 适合高并发服务,建议调到 1024~65535 之间。
2.2 net.ipv4.tcp_max_syn_backlog
- 控制半连接队列大小,影响 TCP 握手的处理能力。
- 默认 128,调大到 1024 或更高能防止 SYN 洪泛攻击。
2.3 net.core.netdev_max_backlog
- 网络设备接收包的最大队列长度,防止网卡包丢失。
- 如果流量大,建议设置成 5000 或更高。
2.4 TIME_WAIT 相关
net.ipv4.tcp_tw_reuse=1
允许重用 TIME_WAIT 套接字,减少端口耗尽。net.ipv4.tcp_fin_timeout
调整连接关闭等待时间,默认 60 秒,适当降低减少 TIME_WAIT 堆积。
2.5 文件描述符限制
fs.file-max
控制系统级最大打开文件数ulimit -n
控制当前 shell 和进程最大打开文件数,网络服务通常设置 65535 以上
3. 临时调整示例
sudo sysctl -w net.core.somaxconn=1024
sudo sysctl -w net.ipv4.tcp_max_syn_backlog=2048
sudo sysctl -w net.core.netdev_max_backlog=5000
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
sudo sysctl -w net.ipv4.tcp_fin_timeout=30
4. 永久生效配置
编辑 /etc/sysctl.conf
,添加:
net.core.somaxconn=1024
net.ipv4.tcp_max_syn_backlog=2048
net.core.netdev_max_backlog=5000
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_fin_timeout=30
然后执行:
sudo sysctl -p
5. 监控和调试工具
netstat -an | grep TIME_WAIT
:查看 TIME_WAIT 连接数量ss -s
:快速查看 socket 状态汇总iftop
、nload
:流量实时监控tcpdump
:抓包分析网络问题lsof -iTCP -sTCP:LISTEN
:查看监听端口
6. 其他优化建议
- 应用层面:
- 优化
accept()
处理速度,防止连接堆积 - 使用异步 IO、连接池
- 优化
- 硬件层面:
- 网络接口卡支持多队列和 RSS(Receive Side Scaling)
- 增加网卡带宽和内存
- 安全防护:
- 配置防火墙和防护机制防止 SYN 洪泛攻击
7. 总结
优化目标 | 关键参数 | 调整方向 |
---|---|---|
增加监听队列容量 | net.core.somaxconn | 增大为 1024 以上 |
防止半连接队列溢出 | net.ipv4.tcp_max_syn_backlog | 1024 ~ 4096 |
减少丢包、提升网络接收 | net.core.netdev_max_backlog | 5000 ~ 10000 |
减少 TIME_WAIT 端口耗尽 | net.ipv4.tcp_tw_reuse ,tcp_fin_timeout | 启用复用,缩短超时 |
文件描述符限制 | fs.file-max + ulimit -n | 增大到数万 |
发表回复