我们在一些 Linux 机器上遇到了 iptables 问题,似乎加载规则的剪切数量导致 vmalloc 错误(大小 3506176 的 vmap 分配失败:使用 vmalloc= 增加大小。)出现在 dmesg 和任何其他规则停止加载。

经过大量研究,我们将 vmalloc 大小从 128MB 增加到 512MB 并重新启动,暂时解决了问题。
64 位内核似乎没有这个问题(?)。我检查了我的 CentOS 6 框(64 位),它有 VmallocTotal:34,359,738,367 kB (!)。

所以我的问题是,32 位 PAE 内核也能解决这个问题吗?
跨多个站点更改内核比更改操作系统要容易得多......

谢谢,
jack

最佳答案

32 位 PAE 内核无法解决此问题,因为该问题源于 vmalloc 空间中的分配碎片。在 x86-64 中,vmalloc 空间非常大(远大于物理 RAM 大小),因此您不会遇到足够碎片化以导致分配失败的情况。然而,在 32 位中,vmalloc 空间要小得多 - 几百 MB。迁移到 PAE 不会使这个虚拟分配空间变得更大。

如果您想保持 32 位,解决您的问题的一个方法是修改内核,以便 iptables 从预先分配的 vmalloc 空间分配,从而避免其他调用者对 vmalloc 造成的碎片(虽然,没有保证这将完美地解决您的问题,因为它取决于 iptables 如何根据您的用途分配内存的配置文件,这在本问题的范围内是未知的)。

关于Linux 内核、iptables 和 vmalloc 大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8093751/

10-11 18:48