如果选项 CONFIG_MIGRATION 被禁用,可能会出现啥问题?
Posted
技术标签:
【中文标题】如果选项 CONFIG_MIGRATION 被禁用,可能会出现啥问题?【英文标题】:What are the potential problems if the option CONFIG_MIGRATION is disabled?如果选项 CONFIG_MIGRATION 被禁用,可能会出现什么问题? 【发布时间】:2020-10-12 13:21:10 【问题描述】:如果选项 CONFIG_MIGRATION 被禁用,可能会出现什么问题?我发现它与错误有关:“页面分配失败:订单:9”。如果禁用此选项,此错误经常发生。如果禁用,是否还能通过其他方法减少内存碎片?
【问题讨论】:
查看此链接以获得对该问题的一个很好的总结:***.com/a/11340774/5639126 您对大连续块的大小限制得越多,后续分配的机会就越大,这就是我看待它的方式。如果您正在设计一个路由器,并且一直有很多小进程来来去去,那么您不需要大量分配。另一方面,如果您正在运行一些使用大块内核内存的视频驱动程序,那么您可能会这样做。您围绕系统的使用进行设计。 我认为在您的情况下,一个很好的新问题是,当无法进行压缩时,减少内存碎片的最佳方法是什么? 是的,我担心禁用这些选项时的潜在问题以及减少碎片的方法。 【参考方案1】:CONFIG_MIGRATION 会按照 kconfig 帮助中的说明进行操作:
允许在不更改虚拟地址的情况下迁移进程页面的物理位置。这在两种情况下很有用。第一个是在 NUMA 系统上将页面放置在更靠近访问的处理器的位置。第二个是分配大页面时,因为迁移可以重新定位页面以满足大页面分配而不是回收。
您的错误发生在第二部分失败时,内核尝试分配页面并失败。错误在mm/page_alloc.c中产生:
nopage:
if (read_mems_allowed_retry(cpuset_mems_cookie))
goto retry_cpuset;
warn_alloc(gfp_mask,
"page allocation failure: order:%u", order);
这几乎是没有 CONFIG_MIGRATION 的主要问题,拥有它使内核更有可能满足内存请求,尤其是大页面。不过,它本身与内存碎片无关,内核仍然会在不迁移的情况下首先尝试回收或压缩内存。希望对您有所帮助。
【讨论】:
感谢您的澄清。您所说的“它本身与内存碎片无关,内核仍然会尝试在不迁移的情况下首先回收或压缩内存。”是什么意思?您能否为我更详细地解释一下?感谢您对此事的关注。 我的意思是页面分配可能由于碎片或其他原因而失败;而迁移是一种方式,在回收旧内存和压缩之后,尝试获得合适的内存块。您可能会发现这两个链接很有帮助:关于碎片化savvinov.com/2019/10/14/… 和关于回收内存:kernel.org/doc/gorman/html/understand/understand013.html 非常感谢。在您的帮助下,我对这件事的理解在不同的层面上。在CONFIG-MIGRATION
和CONFIG-COMPACTION
都被禁用的情况下,是否还能通过其他方法减少内存碎片?
@John,您可以减少内存碎片,有一些技术可以做到这一点,我自己将其用于用户应用程序,例如创建内存池并从中分配内存,而不是从堆中动态分配内存,可能是最好的方法;您可以在用户空间中运行驱动程序,以便控制内存分配;您可以使用算法来分配避免碎片的内存,请参阅gii.upv.es/tlsf(虽然我自己从未使用过)
我明白了。我非常感谢你。这两个都是很好的方法。在CONFIG-MIGRATION
和CONFIG-COMPACTION
都被禁用的情况下,Linux 内核是否仍然可以使用任何方法来减少内存碎片?以上是关于如果选项 CONFIG_MIGRATION 被禁用,可能会出现啥问题?的主要内容,如果未能解决你的问题,请参考以下文章