这些参数管什么
TCP 内核参数集中在 net.ipv4.*,用来控制端口复用、连接队列、keepalive 与本地端口范围。它们不是「越大越好」的开关,而是针对具体瓶颈的调节旋钮:先看监控(重传率、队列溢出、TIME_WAIT 数量)再动手,改完必须持久化,否则重启就回到默认值。
基本信息
| 适用平台 | Linux(各发行版同源,默认值略有差异) |
|---|---|
| 生效方式 | sysctl -w 临时生效;写入 /etc/sysctl.d/*.conf 持久 |
| 生效范围 | 当前网络命名空间,容器内需单独设置 |
| 查看 | sysctl net.ipv4.tcp_tw_reuse |
| 重载 | sysctl -p /etc/sysctl.d/99-tcp.conf |
高频参数
| 参数 | 建议值 | 作用 |
|---|---|---|
| net.ipv4.tcp_tw_reuse | 1 | 客户端侧安全复用 TIME_WAIT 四元组 |
| net.ipv4.tcp_fin_timeout | 15–30 | FIN_WAIT_2 兜底超时(秒) |
| net.ipv4.tcp_keepalive_time | 600 | 空闲多久开始探测 |
| net.ipv4.tcp_keepalive_intvl | 30 | 探测间隔(秒) |
| net.ipv4.tcp_keepalive_probes | 6 | 探测失败几次后判定断开 |
| net.core.somaxconn | 65535 | 全连接队列上限,需与应用 backlog 匹配 |
| net.ipv4.tcp_max_syn_backlog | 65535 | 半连接队列上限,抗 SYN 洪泛 |
| net.ipv4.ip_local_port_range | 10000 65535 | 本机可用源端口范围 |
应用与核对
应用与核对
sysctl -w net.ipv4.tcp_tw_reuse=1 # 临时生效,仅用于试验
# 持久化:写入 /etc/sysctl.d/99-tcp.conf 后执行
sysctl -p /etc/sysctl.d/99-tcp.conf
sysctl net.ipv4.tcp_tw_reuse net.core.somaxconn # 核对实际生效值
ss -s # 看 TIME_WAIT 与连接总数分布
nstat -az | grep -E 'ListenOverflow|Retrans' # 队列溢出与重传计数什么时候该调
- 主动发起大量短连接(代理、压测机)时关注 tcp_tw_reuse 与本地端口范围
- 高并发接入的服务端,被日志里的 listen queue overflow 提示逼着调大队列上限
- 长连接常被中间设备静默回收,缩短 keepalive 时间让它更早发现死连接
- MTU 黑洞导致大包卡死时,用 tcp_mtu_probing 自动探测可行 MTU
- 出现 connect: Cannot assign requested address 时,先扩本地端口范围
先采集再调
- 重传率:nstat 或 ss -ti 里的 retrans 计数
- 队列溢出:netstat -s 中的 listen queue overflow
- TIME_WAIT 数量与源端口分布,判断是端口耗尽还是连接泄漏
- 应用侧连接池与 backlog 配置,内核队列与应用设置必须匹配
参数不是越多越好:没有监控数据就照抄网上配置,往往把「连接失败」换成「内存暴涨」或「端口耗尽」,问题类型变了但没消失。
风险与回退
- 一次只改一到两个参数,观察至少一个完整业务周期再动下一个
- 调节前把当前取值存档(sysctl -a 输出即可),便于一键回退
- 避开业务高峰调参,出问题时要留有观察与回滚窗口
- 参数改错影响连接时,最快的止损是恢复原值并重启相关服务