- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我们的一些 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/
我想分配虚拟连续的范围内存,以便在访问数据时可以使用局部性属性(空间局部性),同时考虑到更好的性能。我在下一页发现我需要使用 vmalloc 来更好地访问内存位置(如果我错了并且必须使用 kmallo
我看到 Linux 内核使用 vmalloc 为 fdtable 分配内存,当它大于某个阈值时。我想知道这种情况何时发生,并有一些更明确的信息。 static void *alloc_fdmem(si
我正在尝试了解 Linux 中的内存管理。在 vmalloc 的情况下,我发现了这个 Addresses returned cannot be translated into physical one
我正在尝试使用 vmalloc() 为内核模块分配大内存。我无法在具有 64GB 内存的 64 位 Linux (3.10.0-514.2.2.el7.x86_64) 上分配超过 2GB 的内存。 这
我正在开发一个 LKM,并且在分配它之后将一个 8192 字节的 vmalloc 区域归零。我知道我可以使用 vzalloc(),但它让我感到困惑,为什么我这样做: pmem = vmalloc(81
我四处搜索,发现大多数人都提倡使用 kmalloc,因为您可以保证获得连续的物理内存块。但是,如果找不到您想要的连续物理 block ,似乎 kmalloc 也会失败。 拥有连续的内存块有什么好处?具
我认为 kmalloc() 在内核中分配连续的物理页,因为虚拟内存空间直接映射到物理内存空间,只需添加一个偏移量即可。 但是,我还是不明白为什么它比vmalloc()效率更高。它仍然需要通过页表(内核
我正在向 Linux 内核 6.22 添加系统调用。 #include #incldue #include #include #include #include asmlinkage lo
我们的一些 Linux 机器上的 iptables 一直存在问题,似乎加载的规则数量过少导致 vmalloc 错误(大小为 3506176 的 vmap 分配失败:使用 vmalloc= 增加大小。)
我正在研究 Linux 中的堆栈保护。我发现 Linux 内核 VMAP_STACK 配置参数使用保护页面机制以及 vmalloc() 来提供堆栈保护。 我正在尝试找到一种方法来检查此保护页在 Lin
我的物理内存是 4G,我使用的是 32 位的 Android x86,启用了 HIGHMEM4G。我想尽可能地扩大 vmalloc() 空间。 正如我所尝试的,如果改为2G/2G VMsplit并使V
Hi all, 我目前正在调试设备驱动程序,但遇到了内核崩溃。检查回溯或错误日志后,问题似乎出在 kmalloc 上。我在想也许我可以用其他分配函数来改变 kmalloc。他们有什么区别? 这是错误日
我正在研究 PCIe/DMA 驱动程序。 DMA 目标内存不在用户空间中分配,而是通过 vmalloc 或 kmalloc 分配。我见过很多使用 get_user_pages_fast 获取结构页面信
在32位x86平台上,如果vmalloc()可以从ZONE_NORMAL或ZONE_HIGHMEM分配内存,是否意味着即使我扩大ZONE_HIGHMEM,vmalloc()实际可以使用的总范围不变?我
为什么在VMALLOC_START~VMALLOC_END发生page fault时do_translation_fault不填充Page table entry而只填充PG, PUD和PMD? ar
我是一名优秀的程序员,十分优秀!