如何优化 Linux 内核参数 tcp_conntrack 防止高并发下连接丢失

文章导读
优化 Linux 内核参数 tcp_conntrack(实际为 net.netfilter.nf_conntrack 系列)防止高并发连接丢失,核心在于增大连接跟踪表最大条目数 net.netfilter.nf_conntrack_max,默认值通常较小(如 65536),高并发下易满导致丢包。建议根据内存大小调整至 100 万及以上,同时调整 hash 表大小 net.netfilter.nf_
📋 目录
  1. Linux 内核参数对容器网络的影响:conntrack、tcp_tw_reuse 等调优实测
  2. Linux 内核参数调优实战:生产环境性能翻倍
  3. Linux 系统常用内核网络参数介绍与常见问题处理
  4. FAQ
A A

优化 Linux 内核参数 tcp_conntrack(实际为 net.netfilter.nf_conntrack 系列)防止高并发连接丢失,核心在于增大连接跟踪表最大条目数 net.netfilter.nf_conntrack_max,默认值通常较小(如 65536),高并发下易满导致丢包。建议根据内存大小调整至 100 万及以上,同时调整 hash 表大小 net.netfilter.nf_conntrack_buckets 以减少冲突。此外,需缩短超时时间 net.netfilter.nf_conntrack_tcp_timeout_* 加速条目回收,并监控 /proc/sys/net/netfilter/nf_conntrack_count 确保使用率低于 80%。在容器或 NAT 网关场景下,此调优尤为关键,可避免内核静默丢弃新连接请求,确保业务连续性。

Linux 内核参数对容器网络的影响:conntrack、tcp_tw_reuse 等调优实测

容器网络本质上依托 Linux 内核网络栈实现:无论是 Docker 的 bridge 网络、host 网络,还是 K8s 的 CNI 网络,底层都依赖内核的 netfilter、TCP/IP 协议栈、连接跟踪模块。在高并发短连接、大规模 Pod 集群场景下,默认内核参数往往成为瓶颈:conntrack 表满,内核静默丢包,出现“连接不上”TIME-WAIT 连接堆积,端口耗尽,报错"cannot assign requested address"连接超时、延迟高、吞吐上不去 很多运维同学只优化应用层,却忽略内核层配置,导致集群网络性能始终无法突破。本文将系统讲解 conntrack、tcp_tw_reuse、tcp_timestamps 等关键内核参数,结合实测数据,给出生产级调优方案。一、容器网络与 Linux 内核的关系 1.1 容器网络底层依赖 容器并非独立虚拟机,而是共享宿主机内核。容器网络的流量转发、NAT、连接跟踪、连接跟踪、TCP 参数,全部由宿主机内核管控。核心依赖模块:netfilter:实现端口映射、SNAT/DNAT、防火墙规则 nf_conntrack:连接跟踪,记录所有网络连接状态 TCP 协议栈:控制连接建立、关闭、超时、复用 网卡队列、sysctl 系统参数:全局网络管控

Linux 内核参数调优实战:生产环境性能翻倍

默认配置跑个开发环境还行,生产环境就是在给自己挖坑。把这次调优过程记录一下,都是踩过的坑。上周线上服务扛不住流量,运维群里一顿排查,最后发现是内核参数没调。默认配置跑个开发环境还行,生产环境就是在给自己挖坑。把这次调优过程记录一下,都是踩过的坑。我们有台服务器,配置不差:64G 内存 万兆网卡 但是一到高峰期,CPU 才 30%,连接数就上不去了,大量请求超时。看了一圈监控,发现是网络瓶颈,但网卡带宽明明还有余量。现象 # 查看连接状态 ss -s Total: 52341 TCP: 48234 (estab 12000, closed 35000, orphaned 0, timewait 34500) # 发现大量 TIME_WAITss -ant | awk '{print $1}'| sort| uniq-c | sort-rn 34523 TIME-WAIT 12034 ESTAB 1234 SYN-RECV 423 LISTEN 3 万多个 TIME_WAIT,正常吗?短连接场景下其实很常见,但这么多确实有问题。根因分析 展开 # 查看当前内核参数 sysctl net.ipv4.tcp_max_tw_buckets # 输出:net.ipv4.tcp_max_tw_buckets = 180000sysctl net.core.somaxconn # 输出:net.core.somaxconn = 128sysctl net.ipv4.tcp_max_syn_backlog # 输出:net.ipv4.tcp_max_syn_backlog = 1024 问题找到了:somaxconn 才 128,这是监听队列的最大长度 tcp_max_syn_backlog 才 1024,SYN 队列太小 高并发下,新连接进来排队都排不下,直接被丢弃了。调优方案 一、网络连接相关 展开 # /etc/sysctl.conf# 1. 监听队列最大长度 (默认 128 太小)net.core.somaxconn = 65535 # 2. SYN 队列长度 net.ipv4.tcp_max_syn_backlog = 65535 # 3. 允许的最大跟踪连接条目 net.netfilter.nf_conntrack_max = 1000000 # 4. TIME_WAIT 状态的 socket 数量 (按需调整)net.ipv4.tcp_max_tw_buckets = 200000 # 5. TIME_WAIT 复用 (仅限客户端发起连接时)net.ipv4.tcp_tw_reuse = 1 # 6. 开启 SYN cookies 防护 net.ipv4.tcp_syncookies = 1 # 7. 减少 FIN_WAIT2 状态时间 net.ipv4.tcp_fin_timeout = 30 二、TCP 缓冲区相关 代码语言:Bash # 接收缓冲区 (最小、默认、最大) 单位字节 net.ipv4.tcp_rmem = 4096 87380 16777216 # 发送缓冲区 net.ipv4.tcp_wmem = 4096 65536 16777216 # 系统级别的内存页面分配 net.ipv4.tcp_mem = 786432 1048576 1572864 # 单个 socket 最大缓冲区 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216

Linux 系统常用内核网络参数介绍与常见问题处理

和 /etc/sysctl.conf 都支持在实例运行时修改内核参数,不同之处如下:/proc/sys/ 是一个虚拟文件系统,提供了访问内核参数的方法,该目录下的 net 中存放了当前系统中已开启的所有网络内核参数,可以在系统运行时进行修改,但 重启实例后就会失效 ,一般用于临时性验证修改的效果。/etc/sysctl.conf 是一个配置文件,您可以通过修改 /etc/sysctl.conf 文件来修改内核参数的默认值,实例重启后不会失效。/proc/sys/ 目录下文件与 /etc/sysctl.conf 配置文件中参数的完整名称相关,如 net.ipv4.tcp_tw_recycle 参数,对应的文件是 /proc/sys/net/ipv4/tcp_tw_recycle 文件,文件的内容就是参数值。说明 linux 从 4.12 内核版本开始移除了 tcp_tw_recycle 配置,即移除 sysctl.conf 中关于 net.ipv4.tcp_tw_recycle 的配置内容,当您的系统内核低于 4.12 版本才可以使用 net.ipv4.tcp_tw_recycle 参数。通过/proc/sys/目录查看和修改内核参数 通过/etc/sysctl.conf 文件查看和修改内核参数

如何优化 Linux 内核参数 tcp_conntrack 防止高并发下连接丢失

FAQ

问:如何查看当前 conntrack 表的使用情况?

答:可以通过 cat /proc/sys/net/netfilter/nf_conntrack_count 查看当前连接跟踪条目数,对比 net.netfilter.nf_conntrack_max 了解使用率。

问:conntrack 表满会有什么现象?

如何优化 Linux 内核参数 tcp_conntrack 防止高并发下连接丢失

答:内核会静默丢包,表现为新连接建立失败,出现连接超时或 Connection refused,但服务端 CPU 和内存可能正常。

问:增大 conntrack_max 会对性能有影响吗?

答:会增加内存消耗,每个条目约占用 300 多字节,过大可能导致内存压力,需根据物理内存合理设置。