好的,下面给你详细介绍 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_backlogSYN 队列的长度,控制半连接数
net.core.netdev_max_backlog网络设备接收队列最大长度
fs.file-max系统最大文件描述符数

9. 总结

作用说明
net.core.somaxconn限制 listen() 中 backlog 的最大值
适合高并发服务通过加大该值,允许更大连接等待队列,减少拒绝连接
调整需配合应用合理设置应用层 listen() backlog 应不超过该值

好的!这里给你整理一份Linux TCP 网络调优全攻略,涵盖常见内核参数、说明、调整建议,帮你提升高并发网络环境下的性能与稳定性。


Linux TCP 调优全攻略


1. 基础参数概览

参数作用说明查看命令调整建议
net.core.somaxconnlisten() backlog 队列最大长度sysctl net.core.somaxconn增大到 1024 或更大
net.ipv4.tcp_max_syn_backlogTCP 半连接(SYN 队列)长度sysctl net.ipv4.tcp_max_syn_backlog1024~4096
net.core.netdev_max_backlog网络接口接收队列最大长度sysctl net.core.netdev_max_backlog5000~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_timeoutFIN_WAIT_2 状态超时时间sysctl net.ipv4.tcp_fin_timeout15~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 状态汇总
  • iftopnload:流量实时监控
  • tcpdump:抓包分析网络问题
  • lsof -iTCP -sTCP:LISTEN:查看监听端口

6. 其他优化建议

  • 应用层面
    • 优化 accept() 处理速度,防止连接堆积
    • 使用异步 IO、连接池
  • 硬件层面
    • 网络接口卡支持多队列和 RSS(Receive Side Scaling)
    • 增加网卡带宽和内存
  • 安全防护
    • 配置防火墙和防护机制防止 SYN 洪泛攻击

7. 总结

优化目标关键参数调整方向
增加监听队列容量net.core.somaxconn增大为 1024 以上
防止半连接队列溢出net.ipv4.tcp_max_syn_backlog1024 ~ 4096
减少丢包、提升网络接收net.core.netdev_max_backlog5000 ~ 10000
减少 TIME_WAIT 端口耗尽net.ipv4.tcp_tw_reusetcp_fin_timeout启用复用,缩短超时
文件描述符限制fs.file-max + ulimit -n增大到数万