Linux实例常用内核网络参数优化
阿里云ECS使用过程中突然发现TCP连接数异常变化,遂深入了解并进行优化
查看和修改 Linux 实例内核参数
查看内核参数:执行命令 sysctl -a 查看当前系统中生效的所有参数,如下所示:
修改内核参数:
执行命令 vi /etc/sysctl.conf 修改文件中的参数
执行命令 sysctl -p 使配置生效
注意:调整内核参数后内核处于不稳定状态,请务必重启实例
Linux 网络相关内核参数引发的常见问题及处理
Linux 实例 NAT 哈希表满导致 ECS 实例丢包
此处涉及的内核参数:
net.netfilter.nf_conntrack_buckets
net.nf_conntrack_max
问题现象
ECS Linux 实例出现间歇性丢包,无法连接实例,通过 tracert、mtr 等工具排查,外部网络未见异常。同时,如下图所示,在系统日志中重复出现大量(table full, dropping packet.)错误信息。
原因分析
ip_conntrack 是 Linux 系统内 NAT 的一个跟踪连接条目的模块。ip_conntrack 模块会使用一个哈希表记录 TCP 协议 established connection 记录,当这个哈希表满了的时候,便会导致 nf_conntrack: table full, dropping packet 错误。Linux 系统会开辟一个空间用来维护每一个 TCP 链接,这个空间的大小与 nf_conntrack_buckets、nf_conntrack_max 相关,后者的默认值是前者的 4 倍,而前者在系统启动后无法修改,所以一般都是建议调大 nf_conntrack_max。
注意:系统维护连接比较消耗内存,请在系统空闲和内存充足的情况下调大 nf_conntrack_max,且根据系统的情况而定。
解决思路
执行命令 # vi /etc/sysctl.conf 编辑系统内核配置。
修改哈希表项最大值参数:net.netfilter.nf_conntrack_max = 655350。
修改超时参数:net.netfilter.nf_conntrack_tcp_timeout_established = 1200,默认情况下 timeout 是 432000(秒)。
执行命令 # sysctl -p 使配置生效。
文档涉及的 Linux 内核参数说明
参考链接 阿里云