• ECS实例中的应用偶尔出现丢包现象并且内核日志(dmesg)存在“kernel: nf_conntrack: table full, dropping packet”的报错信息


    问题描述

    连接ECS实例中的应用时偶尔出现丢包现象。经排查,ECS实例的外围网络正常,但内核日志(dmesg)中存在“kernel: nf_conntrack: table full, dropping packet”的错误信息。存在此问题的ECS实例符合如下条件。

    • 镜像:aliyun-2.1903-x64-20G-alibase-20190327.vhd及之后的所有镜像版本。
    • 内核:kernel-4.19.24-9.al7及以后的所有内核版本。

    问题原因

    nf_conntrack是Linux系统内NAT的一个跟踪连接条目的模块。nf_conntrack模块会使用一个哈希表记录TCP协议“established connection”记录,当这个哈希表满之后,新的连接会引发“nf_conntrack: table full, dropping packet”错误。关于nf_conntrack模块中的重要参数,可参考如下信息。

    • nf_conntrack_buckets:哈希表的大小,可在模块加载时指定参数,也可以通过sysctl命令修改。当系统内存大于等于4GB时,它的默认值是“65536”。
    • nf_conntrack_max:哈希表的最大节点个数,即nf_conntrack模块支持的最大连接数。当系统内存大于等于4G时,它的默认值是“262144”。对于处理大量连接的服务器来说,该默认值相对较小。
    • nf_conntrack_tcp_timeout_time_wait:nf_conntrack模块中保存time_wait状态的TCP连接时间,默认值为“120s”。

    解决方案

    阿里云提醒您:

    • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
    • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
    • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

    请您结合现场实际情况,从如下两种解决方案中选择最适合您业务场景的方法。

    方案一:通过sysctl接口调整nf_conntrack模块中的参数值

    业务侧应提前自行确认应用程序可能使用的nf_conntrack最大连接数,并参考如下命令,通过sysctl接口调整nf_conntrack模块中的参数值。

    注:如果您的业务本身符合“并发连接数较高,其中主要是短连接”的特性。建议增大nf_conntrack_maxnf_conntrack_buckets的参数值,以确保不会由于连接数过多导致nf_conntrack的哈希表满。一般建议nf_conntrack_max参数值为nf_conntrack_buckets参数值的4倍 。

     
    sudo sysctl -w net.netfilter.nf_conntrack_max=1503232
    sudo sysctl -w net.netfilter.nf_conntrack_buckets=375808  # 如果使用非4.19内核,该选项可能无法在运行时修改
    sudo sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=60

    注:

    • 命令中的参数值仅供参考,现场请结合实际业务情况进行调整。在调整前,建议提前创建快照或备份重要文件,确保数据安全。
    • 建议一起调整nf_conntrack_bucketsnf_conntrack_max参数。如果只改动nf_conntrack_max参数值,可能会导致哈希表上的链表过长,查询效率低。如果只改动nf_conntrack_buckets参数值,不能解决该问题。

    方案二:通过iptables过滤不需要追踪的连接

    参考如下命令,在iptables规则中增加“-j notrack”的动作 ,即过滤不需要追踪(track)的连接。该方式的好处是治本,可以将不需要追踪的连接直接进行notrack处理,将不会占用哈希表的空间,也就不会引发报错。

     
    sudo iptables -t raw -A PREROUTING -p udp -j NOTRACK
    sudo iptables -t raw -A PREROUTING -p tcp --dport 22 -j NOTRACK

    注:此处的命令表示不追踪UDP和22端口的TCP连接,仅供参考。现场以实际情况为准。

    相关文档

    适用于

    • 云服务器 ECS
      注:
      • 镜像:aliyun-2.1903-x64-20G-alibase-20190327.vhd及之后的所有镜像版本。
      • 内核:kernel-4.19.24-9.al7及以后的所有内核版本。

    转载于:https://help.aliyun.com/knowledge_detail/154095.html?spm=5176.11065259.1996646101.searchclickresult.38ad3530iVe68L

  • 相关阅读:
    程序=算法+数据结构 的理解
    为什么有些语言可以被反编译?而有的不能?
    手机怎么访问电脑服务器上的网页
    linux一键安装
    Linux初学者必知的5个学习网站
    忘记阿里云管理终端密码怎么办
    Linux学习(CentOS-7)---磁盘分区(概念、分区方法、分区方案)
    远程桌面怎样复制本地文件听语音
    如何查看某个端口被谁占用
    cmd命令
  • 原文地址:https://www.cnblogs.com/LiuChang-blog/p/12732771.html
Copyright © 2020-2023  润新知