首页/系统/Linux 内核与性能调优速查/net.netfilter.nf_conntrack_buckets 哈希桶
网络栈调优98 条

net.netfilter.nf_conntrack_buckets 哈希桶

连接跟踪表的哈希桶数量,影响查找效率与内存;与 nf_conntrack_max(上限)是两个维度。

参数是什么

net.netfilter.nf_conntrack_buckets 决定连接跟踪表的哈希桶数量:每条表项按哈希落到某个桶里,桶越多单条链越短、查找越快,但占用的内存也越多。它与 nf_conntrack_max(表项数量上限)是两个维度——max 决定能记录多少连接,buckets 决定在这些表项中查找的效率,两者需要匹配,桶太少会出现链过长、查找变慢、软中断占用上升。

基本信息

参数net.netfilter.nf_conntrack_buckets
关联参数nf_conntrack_max(表项上限)、nf_conntrack_count(当前用量)
默认值由内核按内存规模推算,随版本与环境不同
修改方式通常需在模块加载时指定或改启动参数后重启,运行时支持有限
运行统计conntrack -S(需 conntrack-tools)、/proc/net/stat/nf_conntrack
内存开销桶数组与表项都占用内存,规划时要一起估算

典型使用场景

  • 大规模 NAT 网关:连接跟踪查找成为 CPU 热点时评估桶数是否不足
  • 表项数量并不高但 CPU 偏高,怀疑哈希链过长导致查找变慢
  • 扩容 nf_conntrack_max 时同步调整桶数,保持合理的平均链长
  • 排查 conntrack 相关的软中断开销与丢包
  • 云主机或容器宿主上核对连接跟踪的规模配置是否符合业务预期

查看现状

查看现状
sysctl net.netfilter.nf_conntrack_buckets  # 当前桶数(可能提示只读)
cat /proc/sys/net/netfilter/nf_conntrack_count  # 当前表项数
cat /proc/sys/net/netfilter/nf_conntrack_max  # 表项上限
conntrack -S 2>/dev/null | head  # 连接跟踪运行统计,需 conntrack-tools
awk '{print $1, $2}' /proc/net/stat/nf_conntrack | head  # 每 CPU 的插入、查找与失败计数
free -h  # 桶与表项都吃内存,先确认余量

相关接口关系

项目含义关系
nf_conntrack_buckets哈希桶数量多则查找快、内存占用高
nf_conntrack_max表项数量上限决定能同时跟踪多少连接
nf_conntrack_count当前表项数与 max 比较判断是否接近容量
conntrack -S运行统计插入失败、查找失败等直接证据
桶数通常需要在模块加载时确定,运行时写入往往只读或需要重新加载模块。规划时应把桶数与 max 一起考虑,并按内存余量评估总开销,而不是只调其中一项。
不同内核版本对默认桶数的推算策略不同,直接照搬旧文档里的数值容易做出不匹配的配置。核对当前环境时以实际读取到的参数值为准。

易错点

  • 以为运行时改桶数立即生效:多数环境需要重新加载模块或重启,改动可能根本没落地
  • 桶数与 max 不匹配:桶太少造成链过长,查找效率下降、CPU 升高
  • 只看桶数不看表项数:连接泄漏或超时过长的问题不在桶数上,改错方向
  • 忽略内存开销:桶与表项都要占内存,扩容前应确认余量
  • 照搬旧文档数值:默认策略与接口支持度随内核版本变化,需要以当前环境实测为准

数据来源与参考

  • Linux 内核 Documentation/networking/nf_conntrack-sysctl.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌