
# Web访问超时系统日志打印：nf_conntrack:table full, dropping packet
#### 问题现象
ECS实例中的应用偶尔出现丢包现象。服务端系统日志/var/log/messages打印kernel: nf_conntrack:table full, dropping packet。
图1系统日志   
![](https://support.huaweicloud.com/trouble-ecs/zh-cn_image_0000002464721620.png "点击放大")
#### 约束与限制
本节操作涉及修改系统内核参数，在线修改内核参数会出现内核不稳定，建议修改后在合理的时间重启系统，请评估风险后操作。
#### 根因分析
iptables的connection-tracking模块使用系统内存的一部分来跟踪表中的连接。"table full, dropping packet"表明连接跟踪表已满，不能为新连接创建新的条目，因为没有更多的空间。因此出现"dropping packet"问题。
解决方案是增加连接跟踪条目的数量或过滤不需要追踪的连接。
#### 处理方法
**方案一：调整优化nf_conntrack模块中的参数值**
1. 提高net.netfilter.nf_conntrack_max值，即nf_conntrack模块支持的最大连接数。 以内存为64G，net.netfilter.nf_conntrack_max值调整为2097152为例：
   执行以下命令，使配置即时生效：
   ```
   sysctl -w net.netfilter.nf_conntrack_max=2097152
   ```
   执行以下命令确保重启后配置仍然生效：
   ```
   echo "net.netfilter.nf_conntrack_max = 2097152" >> /etc/sysctl.conf
   ```
   ![](https://support.huaweicloud.com/trouble-ecs/public_sys-resources/note_3.0-zh-cn.png)
   - net.netfilter.nf_conntrack_max不是越高越好，通常根据内存大小进行设置。
   
   - nf_conntrack_max计算公式（64位）： CONNTRACK_MAX = RAMSIZE (inbytes)/16384/2
     例如您的机器是一个64GB 64bit的系统，那么最合适的值是
     CONNTRACK_MAX = 64\*1024\*1024\*1024/16384/2 = 2097152
     
     
2. 调整nf_conntrack_buckets，即nf_conntrack模块哈希表大小。 如果conntrack表中的条目数量显著增加（例如以4倍的速度增加），则还应增加存储conntrack条目的哈希表的大小以提高效率。
   计算新的哈希值：在CentOS 6及以上版本，计算公式是hashsize = nf_conntrack_max/4
   执行以下操作，设置新的哈希大小：
   ```
   sysctl -w net.netfilter.nf_conntrack_buckets=524288
   ```
   执行以下命令确保重启后配置仍然生效：
   ```
   echo "net.netfilter.nf_conntrack_buckets=524288" >> /etc/sysctl.conf
   ```
   ![](https://support.huaweicloud.com/trouble-ecs/public_sys-resources/note_3.0-zh-cn.png)
   老版本的操作系统可能无法直接修改nf_conntrack_buckets，此时，可以通过调整模块选项hashsize实现。
   修改方法：
   在/etc/modprobe.d/nf_conntrack.conf中设置模块选项：
   ```
   echo "options nf_conntrack hashsize=524288" >> /etc/modprobe.d/nf_conntrack.conf
   ```
   重启系统后生效。
   
**方案二：通过iptables过滤不需要追踪的连接**
您可以在iptables规则中增加-j notrack参数 ，即过滤不需要追踪（track）的连接。该方式可以将不需要追踪的连接直接进行notrack处理，不会占用哈希表的空间，也不会引发报错。
```
iptables -t raw -A PREROUTING -p udp -j NOTRACK
iptables -t raw -A PREROUTING -p tcp --dport 22 -j NOTRACK
```
![](https://support.huaweicloud.com/trouble-ecs/public_sys-resources/note_3.0-zh-cn.png)
此处的命令表示不追踪UDP和22端口的TCP连接，仅供参考，以实际情况为准。
