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

 

    

posted @ 2021-11-02 16:13  MacoPlus  阅读(1018)  评论(0编辑  收藏  举报