我们一直在使用iptables的问题,在我们的一些Linux机器上,似乎被加载的规则的剪切数量导致vmalloc错误(vmap分配大小3506176失败:使用vmalloc =增加大小)出现在dmesg中其他规则停止被加载。
经过大量研究,我们将vmalloc大小从128MB增加到了512MB,并重新启动,暂时解决了这个问题。 似乎64位内核没有这个问题(?)。 我检查了我的CentOS 6盒(64位),它有VmallocTotal:34,359,738,367 kB(!)。
所以我的问题是,一个32位的PAE内核也能解决这个问题吗? 更改内核比跨多个站点的操作系统要容易得多…
谢谢,Jak
32位的PAE内核不能解决这个问题,因为这个问题源于vmalloc空间中的分配碎片。 在x86-64中,vmalloc空间非常大(比物理内存大得多),所以你不会陷入分配失败的情况。 然而,在32位中,vmalloc空间要小得多 – 百万MB。 转向PAE并不会使这个虚拟分配空间变得更大。
如果你想保持32位,你的问题的解决方法是修改内核,使iptables从预先分配的vmalloc空间分配,从而避免其他调用者造成的碎片对vmalloc(尽管没有保证这将完美地解决你的问题,因为它取决于iptables如何分配内存相对于你做什么的配置文件,这在这个问题的范围是未知的)。
你可以使用32位用户空间的64位内核 – 这会给你一个巨大的vmalloc舞台的优势,只有一个内核的变化。