nf_conntrack內核模塊常見問題
- 問題描述
- 排查步驟
- 前置條件:啟用nf_conntrack內核模塊
- 檢查nf_conntrack配置
- 解決辦法1:半數減少nf_conntrack buckets的值
- 解決辦法2:加倍調大m.min_free_kbytes值
- 解決辦法3:Linux社區權威答復-忽略告警
問題描述
內核報錯 falling back to vmalloc
排查步驟
前置條件:啟用nf_conntrack內核模塊
檢查nf_conntrack內核模塊是否啟用
# 檢查當前系統是否已經安裝了 nf_conntrack 內核模塊
lsmod | grep nf_conntrack
如果輸出中沒有nf_conntrack,則未啟用該模塊
# 低版本內核啟用內核模塊
modprobe nf_conntrack_ipv4# 高版本內核nf_conntrack_ipv4被nf_conntrack替換了
modprobe nf_conntrack
檢查nf_conntrack配置
參數 | 默認值 | 解釋 |
---|---|---|
net.netfilter.nf_conntrack_buckets | 65536 | 網絡連接跟蹤表(conntrack table)的桶(bucket)數量 |
net.netfilter.nf_conntrack_max | 262144 | 連接跟蹤表中可以存儲的最大連接跟蹤條目數 |
net.nf_conntrack_max | 262144 | 網絡連接跟蹤表(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"
# 查看連接跟蹤模塊(nf_conntrack)中的哈希表大小
# net.netfilter.nf_conntrack_buckets 參數是 hashsize 參數的一個別名
## 較大的哈希表大小可以支持更多的連接跟蹤,但也會占用更多的內存
cat /sys/module/nf_conntrack/parameters/hashsize# 通常和net.netfilter.nf_conntrack_buckets的值是一樣的
解決辦法1:半數減少nf_conntrack buckets的值
https://blog.csdn.net/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
如果仍然報錯誤falling back to vmalloc
,繼續按半數減小
,進行測試。
解決辦法2:加倍調大m.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中已經刪除該告警
。
這是Linux內核社區 關于消除該告警的補丁郵件
https://lore.kernel.org/lkml/55A8C428.1000005@gmx.de/T/