nf_conntrack: table full


具體告警判斷條件

 #!/bin/bash

  # This plugin checks for common network issues.
  # Currently only checks if conntrack table is more than 90% used.

  readonly OK=0
  readonly NONOK=1
  readonly UNKNOWN=2

  # "nf_conntrack" replaces "ip_conntrack" - support both
  readonly NF_CT_COUNT_PATH='/proc/sys/net/netfilter/nf_conntrack_count'
  readonly NF_CT_MAX_PATH='/proc/sys/net/netfilter/nf_conntrack_max'
  readonly IP_CT_COUNT_PATH='/proc/sys/net/ipv4/netfilter/ip_conntrack_count'
  readonly IP_CT_MAX_PATH='/proc/sys/net/ipv4/netfilter/ip_conntrack_max'

  if [[ -f $NF_CT_COUNT_PATH ]] && [[ -f $NF_CT_MAX_PATH ]]; then
    readonly CT_COUNT_PATH=$NF_CT_COUNT_PATH
    readonly CT_MAX_PATH=$NF_CT_MAX_PATH
  elif [[ -f $IP_CT_COUNT_PATH ]] && [[ -f $IP_CT_MAX_PATH ]]; then
    readonly CT_COUNT_PATH=$IP_CT_COUNT_PATH
    readonly CT_MAX_PATH=$IP_CT_MAX_PATH
  else
    exit $UNKNOWN
  fi

  readonly conntrack_count=$(< $CT_COUNT_PATH) || exit $UNKNOWN
  readonly conntrack_max=$(< $CT_MAX_PATH) || exit $UNKNOWN
  readonly conntrack_usage_msg="${conntrack_count} out of ${conntrack_max}"

  if (( conntrack_count > conntrack_max * 9 /10 )); then
    echo "Conntrack table usage over 90%: ${conntrack_usage_msg}"
    exit $NONOK
  else
    echo "Conntrack table usage: ${conntrack_usage_msg}"
    exit $OK
  fi

 解決方法

參考阿里雲,官方文檔

ECS實例中的應用偶爾出現丟包現象並且內核日志(dmesg)存在“kernel: nf_conntrack: table full, dropping packet”的報錯信息 (aliyun.com)

  • OS CentOS7.7

    LSB Version: :core-4.1-amd64:core-4.1-noarch
    Distributor ID: CentOS
    Description: CentOS Linux release 7.7.1908 (Core)
    Release: 7.7.1908
    Codename: Core

  • OS Kernel版本

   Linux PROD-DATA-K8S-WN1 5.11.1-1.el7.elrepo.x86_64 #1 SMP Mon Feb 22 17:30:33 EST 2021 x86_64 x86_64 x86_64 GNU/Linux

問題現象

Kubernetes環境,具體的網絡插件使用的是Cilium,並開啟eBPF功能,正常情況下會規避netfilter的功能,但是使用到Docker就會使用到iptables功能

摘抄其它

nf_conntrack是Linux系統內NAT的一個跟蹤連接條目的模塊。nf_conntrack模塊會使用一個哈希表記錄TCP協議“established connection”記錄,當這個哈希表滿之后,新的連接會引發“nf_conntrack: table full, dropping packet”錯誤。關於nf_conntrack模塊中的重要參數,可參考如下信息。

  1. nf_conntrack_buckets:哈希表的大小,可在模塊加載時指定參數,也可以通過sysctl命令修改。當系統內存大於等於4GB時,它的默認值是“65536”。
  2. nf_conntrack_max:哈希表的最大節點個數,即nf_conntrack模塊支持的最大連接數。當系統內存大於等於4G時,它的默認值是“262144”。對於處理大量連接的服務器來說,該默認值相對較小。
  3. nf_conntrack_tcp_timeout_time_wait:nf_conntrack模塊中保存time_wait狀態的TCP連接時間,默認值為“120s”。

雖然在dmesg日志沒有找到相對應的報錯信息,但是必須引起戒備之心,解決如下

根據自己業務場景調整參數的值,此值不能調整過高,眾所周知TCP連接消耗內存,也有具體公式

阿里雲官方建議,如果業務場景符合 “高並發,短鏈接”,那么可以根據調整這二個參數解決目前的問題,官方建議nf_conntrack_max = nf_conntrack_buckets * 4

net.netfilter.nf_conntrack_buckets = 131072
net.netfilter.nf_conntrack_max = 524288
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 60

 

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM