我运行在高通信量的两个服务器与Ubuntu的12.04(Linux的3.2.0-69-通用)和一个与Ubuntu的14.04(Linux 3.13.0-52-通用)。 我现在试图保证两个。 他们都有非常相似的硬件资源(相同数量的CPUS,但是12.04在14.04获得16GB时只有8GB RAM)。
我想启用ufw防火墙,但是我遇到了nf_conntrack表越来越大的问题。 数据包基本上正在被丢弃。
我find了解决scheme,通过降低超时,增加表大小以及桶的数量。 那是:
net.netfilter.nf_conntrack_tcp_timeout_established = 600 net.netfilter.nf_conntrack_max = 196608 net.netfilter.nf_conntrack_buckets = 24576
这些值正确更新,并保持重新启动。 (看到这个博客 )我也看到conntrack_count被提高远远高于默认值,所以我相信这是在两个服务器上工作。 值保持在极限之下,所以我相信它很好。
12.04服务器在高负载下工作正常,但14.04一直丢包,创build客户端超时。 现在在14.04启动,我可以在kern.log中看到这一行:
TCP established hash table entries: 131072 (order: 8, 1048576 bytes)
而在12.04,这是:
TCP established hash table entries: 524288 (order: 11, 8388608 bytes)
我怀疑这可能是为什么我的服务器丢包,因为这个表可能太小,关于14.04的stream量。
所以我试图寻找一种方法来设置这个大小,并发现参数thash_entries 在这里看到的解释)。 但是,我不能用sysctl来设置它。
所以这是我的问题:
提前感谢您的帮助,如果您需要更多的帮助,请不要犹豫。
PS我更像是一个系统专家的发展,所以我将不胜感激任何详细的答案:)
调整Linux内核的高吞吐量是一种基于平衡的艺术。
增加连接跟踪表是好的,但这意味着更多的套接字可能被使用,这又意味着系统需要更多的文件描述符,轮子继续…
在你的情况下,我会从下面的内核设置开始:
net.core.somaxconn
和
fs.file-max
第一个决定了内核将维持的开放套接字的数量。 第二个是用来设置内核支持的文件描述符的数量。
然后是可以进一步调整的SYN积压。
net.ipv4.tcp_max_syn_backlog
将设置可以等待来自服务器的ACK的连接数量。
net.ipv4.tcp_syncookies
要使SYN Backlog正常工作,您需要启用TCP SYN Cookie。
最后,还可以进行一些调整,例如启用TIME_WAIT连接重用。
net.ipv4.tcp_tw_reuse
这可能会减less在您收到高峰时打开的“新”套接字的数量。
这只是冰山一angular,我的大批量Linux / Unix系统的经验是,你将调整它几个月,才能得到正确的平衡。
请确保查看/var/log/kern.log和/var/log/messages以帮助进一步排除故障。
调整内核
高吞吐量计算pipe理指南