我认为您在问题末尾的直觉是正确的。我怀疑是A,NUMA感知的内存分配在CPU之间迁移页面,还是B,更可能是透明大页面的碎片整理代码,试图找到连续的对齐区域。
已识别出大页面和透明大页面,这不仅可以在某些工作负载上显着提高性能,还可以在不带来太多好处的情况下消耗大量CPU时间。
了解您正在运行的内核,/ proc / meminfo的内容(或至少是HugePages_ *值),以及(如果可能)更多参考pageblock_pfn_to_page()的vtune事件探查器调用图,将很有帮助。
另外,如果您沉迷于我的猜测,请尝试使用以下命令禁用大页面碎片整理:
回声'从不'> / sys / kernel / mm / transparent_hugepage / defrag
(这可能取决于您的内核:)
回声'从不'> / sys / kernel / mm / redhat_transparent_hugepage / defrag
最后,这个应用程序是否使用了您写的数十演出的ram?什么语言?
由于您使用了“内存页面故障”一词,所以我想您对操作设计和虚拟内存已经很熟悉了。我很难想象一个情况/应用程序会如此严重地发生故障,以致无法读取大量的I / O-几乎总是从您要限制的缓冲区高速缓存中读取。
(如果您感到好奇,请查看mmap(2)标志,例如MAP_ANONYMOUS和MAP_POPULATE以及mincore(2),这些标志可用于查看哪些虚拟页面实际上具有映射的物理页面。)
祝好运!