nf_conntrack内核模块常见问题

本文详细介绍了nf_conntrack内核模块常见的问题“fallingbacktovmalloc”,涉及排查步骤,如启用模块、检查配置,以及三种解决办法:减小nf_conntrack_buckets值、增大m.min_free_kbytes并解释风险,以及Linux社区的官方回应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

内核报错 falling back to vmalloc


排查步骤


前置条件:启用nf_conntrack内核模块

检查nf_conntrack内核模块是否启用

# 检查当前系统是否已经安装了 nf_conntrack 内核模块
lsmod | grep nf_conntrack

image.png
image.png
如果输出中没有nf_conntrack,则未启用该模块

# 低版本内核启用内核模块
modprobe nf_conntrack_ipv4

# 高版本内核nf_conntrack_ipv4被nf_conntrack替换了
modprobe nf_conntrack

检查nf_conntrack配置

参数默认值解释
net.netfilter.nf_conntrack_buckets65536网络连接跟踪表(conntrack table)的桶(bucket)数量
net.netfilter.nf_conntrack_max262144连接跟踪表中可以存储的最大连接跟踪条目数
net.nf_conntrack_max262144网络连接跟踪表(conntrack table)的最大连接数
# 检查nf_conntrack配置
sysctl -a | grep -i nf_conntrack

# 查看网络连接跟踪表(conntrack table)的桶(bucket)数量
# 查看连接跟踪表中可以存储的最大连接跟踪条目数
# 查看网络连接跟踪表(conntrack table)的最大连接数
sysctl -a|grep -E "net.netfilter.nf_conntrack_buckets|net.netfilter.nf_conntrack_max|net.nf_conntrack_max"

image.png

# 查看连接跟踪模块(nf_conntrack)中的哈希表大小
# net.netfilter.nf_conntrack_buckets 参数是 hashsize 参数的一个别名
## 较大的哈希表大小可以支持更多的连接跟踪,但也会占用更多的内存
cat /sys/module/nf_conntrack/parameters/hashsize

# 通常和net.netfilter.nf_conntrack_buckets的值是一样的

image.png


解决办法1:半数减少nf_conntrack buckets的值

https://blog.youkuaiyun.com/whatday/article/details/107552387

出现报错localhost kernel: nf_conntrack: falling back to vmalloc.说明nf_conntrack buckets设置过大,按半数减小,进行测试

# 修改连接跟踪模块(nf_conntrack)中的哈希表大小
echo 3072200 > /sys/module/nf_conntrack/parameters/hashsize

# 修改连接跟踪表中可以存储的最大连接跟踪条目数
sysctl -w net.netfilter.nf_conntrack_max=2097152

# 修改网络连接跟踪表(conntrack table)的最大连接数
sysctl -w net.nf_conntrack_max=2097152

image.png

如果仍然报错误falling back to vmalloc,继续按半数减小,进行测试。


解决办法2:加倍调大vm.min_free_kbytes值

https://access.redhat.com/solutions/6958239
红帽和Oracle官方建议:
vm.min_free_kbytes该参数是:内核操作保留的最少可用RAM,该值不应超过系统内存的 0.4%2GB,一般调试方法是加倍 vm.min_free_kbytes 的值。

vm.min_free_kbytes

关键是在于调整内存的内核参数的时候!调大的风险远大于调小的风险!如果有人想将 vm.min_free_kbytes 调大,千万要注意当前的水位,如果一旦调大 vm.min_free_kbytes 立刻触发directreclaim,可能会导致机器hang住,ping的通,ssh不上,影响业务!hang住的原因是当 vm.min_free_kbytes 是512M的时候,此时 free只有1G,此时正常运行,此时如果调大vm.min_free_kbytes 到5G,将会direct reclaim失败。


解决办法3:Linux社区权威答复-忽略告警

该告警并无实质性影响,RHEL8中已经删除该告警
image.png

这是Linux内核社区 关于消除该告警的补丁邮件
https://lore.kernel.org/lkml/55A8C428.1000005@gmx.de/T/

image.png

<think>好的,我现在需要帮助用户在Linux系统中使用modprobe加载nf_conntracknf_nat内核模块。首先,我得回顾一下相关的知识,确保自己对这些模块和modprobe命令的理解正确。 首先,我记得nf_conntrack模块是用于连接跟踪的,它维护一个连接状态表,供其他模块如防火墙或NAT使用。而nf_nat模块则负责网络地址转换,通常在需要NAT功能时使用。这两个模块通常是相互依赖的,加载顺序可能有讲究。 接下来,用户的问题是关于如何通过命令行加载这两个模块。根据之前的引用内容,用户可能之前尝试过移除这些模块,现在需要重新加载。modprobe命令是用来加载内核模块的,它会自动处理依赖关系,所以可能需要先加载依赖的模块。 根据引用[1],用户之前卸载了xt_NOTRACK、nf_conntrack_netbios_ns、nf_conntrack_ipv4、xt_state和nf_conntrack模块。因此,重新加载的时候,可能需要先加载基础模块,比如nf_conntrack,然后再加载依赖它的模块,比如nf_nat。 不过,在Linux中,通常nf_nat模块依赖于nf_conntrack,所以使用modprobe应该会自动处理这些依赖。也就是说,用户可能只需要运行modprobe nf_conntrack,然后再modprobe nf_nat,或者可能直接加载nf_nat,因为modprobe会自动加载依赖项。 但需要确认的是,某些系统上模块可能有不同的名称或依赖结构。例如,nf_conntrack_ipv4可能已经被更新为基于nf_conntrack的通用模块,尤其是在较新的内核版本中。因此,可能需要检查当前内核版本和模块的实际名称。 另外,根据引用[4],当卸载了相关模块后,使用iptables时会出现nat表不存在的问题,这提示nf_nat模块可能没有被加载,导致iptables无法使用NAT功能。所以加载这两个模块后,应该能恢复nat表的功能。 接下来,我需要验证一下正确的命令步骤。通常加载模块的命令是: sudo modprobe nf_conntrack sudo modprobe nf_nat 不过,可能由于依赖关系,加载nf_nat时会自动加载nf_conntrack,所以可能只需要加载nf_nat即可。但为了明确,分开加载可能更稳妥。 此外,可以使用lsmod | grep nf_conntrack和lsmod | grep nf_nat来检查模块是否已经加载。如果未加载,再执行相应的modprobe命令。 可能遇到的问题包括模块不存在或已被禁用。例如,某些内核可能将这些模块编译为内置(built-in)而非可加载模块,这时modprobe会失败。但这种情况较少见,尤其是对于标准发行版。 总结步骤应该是: 1. 加载nf_conntrack模块。 2. 加载nf_nat模块。 3. 验证是否加载成功。 此外,可能需要确认模块的配置参数,比如引用[2]提到的sysctl设置,但用户的问题仅是加载模块,可能不需要涉及这些设置。 另外,根据引用[3],nf_conntrack模块在2.6.15之后引入,用户可能使用的是较新的内核,所以模块名称应该正确。 现在需要将这些步骤以清晰的中文回答呈现,并按照用户的要求,使用正确的LaTeX格式,同时生成相关问题。 最后,确保回答中引用了正确的引用来源,比如引用[1]、[3]中提到的模块加载和卸载的相关内容。</think>要在Linux系统中加载`nf_conntrack`和`nf_nat`内核模块,可通过以下步骤实现: ### 1. 加载模块的命令 - **加载`nf_conntrack`模块**: ```bash sudo modprobe nf_conntrack ``` 该命令会加载连接跟踪模块,用于跟踪网络连接状态[^3]。 - **加载`nf_nat`模块**: ```bash sudo modprobe nf_nat ``` `nf_nat`模块依赖`nf_conntrack`,因此需先加载后者(`modprobe`会自动处理依赖,但显式加载更稳妥)。 ### 2. 验证模块加载状态 - 使用以下命令检查模块是否加载成功: ```bash lsmod | grep -E "nf_conntrack|nf_nat" ``` 若输出包含`nf_conntrack`和`nf_nat`,则表明加载成功。 ### 3. 加载依赖的其他模块(可选) 若需使用NAT功能(如iptables的`nat`表),可能需要加载相关辅助模块: ```bash sudo modprobe nf_nat_ipv4 # IPv4 NAT支持 ``` ### 4. 持久化配置(重启后生效) 若需开机自动加载模块,可将模块名添加到`/etc/modules-load.d/`配置文件中: ```bash echo "nf_conntrack" | sudo tee -a /etc/modules-load.d/nf.conf echo "nf_nat" | sudo tee -a /etc/modules-load.d/nf.conf ``` ### 注意事项 - 若模块加载失败,可能是内核未编译该模块或模块名称不匹配(需检查内核版本)[^4]。 - 加载后可通过`sysctl`调整`nf_conntrack`参数(如哈希表大小)[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

教Linux的李老师

赞赏是第一生产力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值