【问题标题】:Linux kernel, iptables and vmalloc sizeLinux 内核、iptables 和 vmalloc 大小
【发布时间】:2011-11-16 19:57:05
【问题描述】:

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

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

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

谢谢, 杰克

【问题讨论】:

    标签: linux linux-kernel


    【解决方案1】:

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

    如果您想保持在 32 位,解决您的问题的方法是修改内核,以便 iptables 从预先分配的 vmalloc 空间进行分配,从而避免其他调用者对 vmalloc 造成的碎片(尽管,不能保证这会完美地解决您的问题,因为它取决于 iptables 如何分配内存的配置文件,这在此问题的范围内是未知的)。

    【讨论】:

      【解决方案2】:

      您可以将 64 位内核与 32 位用户空间一起使用 - 这将为您带来巨大的 vmalloc 领域的优势,而只需更改内核即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多