TCP/IP 内核参数是影响网络性能的核心因素——无论是高并发服务(如 Web、数据库、API 网关),还是低延迟场景(如游戏、实时通信),不合理的内核参数配置,都可能导致连接超时、丢包、延迟过高、端口耗尽等问题。
调优前提:先搞懂 TCP/IP 内核参数的核心作用
TCP/IP 内核参数主要存储在 /etc/sysctl.conf 文件中(或 /etc/sysctl.d/ 目录下的自定义配置文件),通过 sysctl -p 命令生效,无需重启系统(部分参数需重启服务)。
调优的核心原则:按需配置,贴合业务场景——高并发场景侧重“连接数、端口复用”,低延迟场景侧重“超时时间、缓存大小”,避免盲目复制网上的“调优模板”(不同业务、不同服务器配置,最优参数差异极大)。
核心调优方向:连接管理、超时控制、缓存优化、拥塞控制、端口复用,这5个方向几乎覆盖了所有常见网络性能问题。
核心 TCP/IP 内核参数调优(分场景详解)
以下参数按“使用频率+影响程度”排序,每个参数均说明“作用、默认值、调优建议、适用场景”,避免只给参数不给原理,让你知其然也知其所以然。
(一)连接管理参数(高并发场景必调)
核心解决:端口耗尽、连接队列满、TIME_WAIT 过多导致的无法建立新连接问题,适用于 Web 服务器、API 网关、高并发接口服务。
1. net.core.somaxconn
- 作用:限制 TCP 监听队列的最大长度,当请求量过大时,队列满会导致新连接被拒绝(报错“connection refused”)。
- 默认值:128(CentOS 7+ 默认值,Ubuntu 略高,但仍不足以支撑高并发)。
- 调优建议:根据并发量调整,一般设置为 1024~4096,高并发场景可设为 8192。
net.core.somaxconn = 4096
- 注意:需配合应用程序的监听队列设置(如 Nginx 的 backlog 参数),否则内核参数调优无效。
2. net.ipv4.tcp_max_syn_backlog
- 作用:TCP 三次握手时,SYN 队列的最大长度,解决“SYN 洪水攻击”或高并发下的连接建立缓慢问题。
- 默认值:128(CentOS 7+)。
- 调优建议:与 somaxconn 配合,设置为 2048~8192,高并发场景设为 8192。
net.ipv4.tcp_max_syn_backlog = 8192
3. net.ipv4.tcp_tw_reuse & net.ipv4.tcp_tw_recycle
- 作用:解决 TIME_WAIT 状态连接过多的问题(TIME_WAIT 是 TCP 连接关闭后,等待 2MSL 时间释放的状态,默认会占用端口,导致端口耗尽)。
- 两者区别:
- 默认值:均为 0(关闭)。
- 调优建议:
4. net.ipv4.tcp_max_tw_buckets
- 作用:限制系统中 TIME_WAIT 状态的最大连接数,超过该值后,新的 TIME_WAIT 连接会被直接释放(避免端口耗尽)。
- 默认值:180000(CentOS 7+)。
- 调优建议:根据服务器内存调整,内存 8G 可设为 50000~100000,内存 16G+ 可设为 100000~200000。
net.ipv4.tcp_max_tw_buckets = 100000
5. net.ipv4.ip_local_port_range
- 作用:指定本地 TCP/UDP 端口的可用范围,解决“端口耗尽”问题(高并发场景下,客户端连接会占用大量端口,默认范围过小易耗尽)。
- 默认值:32768 61000(仅 28233 个可用端口)。
- 调优建议:扩大端口范围,设置为 1024 65535(需注意:1024 以下为特权端口,普通用户无法使用,不影响)。
net.ipv4.ip_local_port_range = 1024 65535
(二)超时控制参数(低延迟、高可用场景必调)
核心解决:连接超时、断连频繁、重试过多导致的延迟问题,适用于实时通信、游戏、数据库连接等对延迟敏感的场景。
1. net.ipv4.tcp_syn_retries
- 作用:TCP 三次握手时,客户端发送 SYN 包后,若未收到 ACK 响应,重试的次数。
- 默认值:6(重试 6 次,总耗时约 3 分钟,过长会导致连接建立延迟)。
- 调优建议:降低重试次数,设置为 2~3 次(总耗时约 30 秒,减少延迟)。
net.ipv4.tcp_syn_retries = 3
2. net.ipv4.tcp_synack_retries
- 作用:TCP 三次握手时,服务器收到 SYN 包后,发送 SYN+ACK 包,若未收到客户端 ACK 响应,重试的次数。
- 默认值:5(重试 5 次,耗时较长)。
- 调优建议:设置为 2~3 次,与 syn_retries 保持一致。
-net.ipv4.tcp_synack_retries = 3
3. net.ipv4.tcp_fin_timeout
- 作用:TCP 四次挥手时,服务器主动关闭连接(发送 FIN 包)后,等待客户端 FIN 包的超时时间。
- 默认值:60 秒(过长会导致连接占用资源过久)。
- 调优建议:设置为 15~30 秒,快速释放连接资源。
- 配置:net.ipv4.tcp_fin_timeout = 30
4. net.ipv4.tcp_keepalive_time & tcp_keepalive_intvl & tcp_keepalive_probes
- 作用:TCP 保活机制,检测长时间空闲的连接,避免连接“假死”(如客户端异常断开,服务器仍维持连接,占用资源)。
- 三个参数配合使用:
tcp_keepalive_time:连接空闲多久后,开始发送保活探测包(默认 7200 秒 = 2 小时)。
tcp_keepalive_intvl:保活探测包的发送间隔(默认 75 秒)。
tcp_keepalive_probes:发送保活探测包的次数,若均未收到响应,关闭连接(默认 9 次)。
- 调优建议(低延迟场景):
net.ipv4.tcp_keepalive_time = 600(10 分钟空闲开始探测)net.ipv4.tcp_keepalive_intvl = 30(每 30 秒探测一次)net.ipv4.tcp_keepalive_probes = 3(探测 3 次无响应则关闭)
(三)缓存与拥塞控制参数(提升吞吐量)
核心解决:数据传输效率低、拥塞导致的丢包问题,适用于大文件传输、高吞吐量服务(如文件服务器、视频流服务)。
1. net.core.wmem_default & net.core.wmem_max
- 作用:TCP 发送缓冲区(write buffer)的默认大小和最大大小,缓冲区越大,数据传输效率越高(减少频繁发送小包)。
- 默认值:wmem_default = 212992,wmem_max = 1048576(约 1MB)。
- 调优建议:根据服务器内存调整,内存 8G 可设为:
net.core.wmem_default = 4194304net.core.wmem_max = 16777216
2. net.core.rmem_default & net.core.rmem_max
- 作用:TCP 接收缓冲区(read buffer)的默认大小和最大大小,与发送缓冲区对应,提升数据接收效率。
- 默认值:rmem_default = 212992,rmem_max = 1048576。
- 调优建议:与发送缓冲区保持一致或略大:
net.core.rmem_default = 4194304net.core.rmem_max = 16777216
3. net.ipv4.tcp_congestion_control
- 作用:指定 TCP 拥塞控制算法,不同算法适用于不同场景,直接影响数据传输的稳定性和吞吐量。
- 常见算法及适用场景:
cubic(默认):适用于高带宽、长延迟网络(如公网服务),吞吐量高,稳定性好。
reno:适用于低延迟、低带宽网络(如内网服务),快速响应拥塞,减少丢包。
bbr:Google 推出的拥塞控制算法,适用于高带宽、长延迟场景(如 CDN、视频流),吞吐量优于 cubic。
- 调优建议:公网高并发服务推荐用 bbr(需内核支持,CentOS 7 需升级内核,CentOS 8、Ubuntu 20.04+ 默认支持)。
-net.ipv4.tcp_congestion_control = bbr
行 sysctl net.ipv4.tcp_congestion_control,输出 bbr 即生效。
(四)其他关键参数(补充优化)
1. net.ipv4.tcp_syncookies
- 作用:开启 SYN cookies,防止 SYN 洪水攻击(当 SYN 队列满时,通过 cookies 机制临时保存连接请求,避免连接被拒绝)。
- 默认值:1(开启),建议保持开启,无需修改。
net.ipv4.tcp_syncookies = 1
2. net.core.netdev_max_backlog
- 作用:网络设备接收队列的最大长度,当网络流量过大时,避免数据包被丢弃(解决“丢包”问题)。
- 默认值:1000,高流量场景建议设为 4096。
net.core.netdev_max_backlog = 4096
留言互动:你在 TCP/IP 调优中遇到过哪些坑?评论区分享你的经验和解决方案!