我们在一些Linux机箱上遇到了iptables的问题,看起来加载规则的剪切数会导致vmalloc错误(大小为3506176的vmap分配失败:使用vmalloc =增加大小。)出现在dmesg和任何其他规则都不会被加载。
经过大量研究后,我们将vmalloc大小从128MB增加到512MB并重新启动,这暂时解决了这个问题。 虽然64位内核似乎没有这个问题(?)。我检查了我的CentOS 6盒子(64位),它有VmallocTotal:34,359,738,367 kB(!)。
所以我的问题是,32位PAE内核是否也能解决这个问题? 在多个站点上更改内核比操作系统要容易得多......
谢谢, JAK
答案 0 :(得分:6)
32位PAE内核无法解决此问题,因为该问题源于vmalloc空间中的分配碎片。在x86-64中,vmalloc空间非常大(远大于物理RAM大小),因此您不会遇到分区失败的情况。然而,在32位中,vmalloc空间要小得多 - 几百MB。迁移到PAE不会使此虚拟分配空间更大。
如果你想保持32位,你的问题的解决方法是修改内核,以便iptables从预先分配的vmalloc空间分配,从而避免其他调用者对vmalloc造成的碎片(尽管,这并不能保证这会完美地解决你的问题,因为它取决于iptables如何根据你使用它做什么来分配内存的概况,这在这个问题的范围内是未知的。)
答案 1 :(得分:2)
您可以使用具有32位用户空间的64位内核 - 这将为您提供巨大的vmalloc竞技场的优势,只需更改内核。