MongoDB,NUMA硬件,页面错误,但足够的RAM用于工作集,触摸命令或vmtouch / dd不会加载到内存中



MongoDB 2.46 & 2.4.8

用例:

  1. 在具有 2 个索引的集合上加载 100.000 个文档。驻留内存增加 (mongostat),并且不会发生页面错误。
  2. 重新启动蒙戈。驻留内存不足(这是预期的)
  3. 尝试使用触摸命令db.runCommand({ touch: collection, data: true, index: true })或其他方式(在OS,vmtouch/dd上)"预热"mongo。
    a) 在这一步中,在我的开发机器 (MacOS) 上,我在 mongostat 中看到很多页面错误试图加热它(预期)并且驻留内存被提高。从那时起,任何更新都不会引发页面错误
    b) 在 numa 服务器 (256 GB RAM) 上,即使我使用本指南启动了 mongo:http://docs.mongodb.org/manual/administration/production-notes/#mongodb-on-numa-hardware(注意:我没有超级用户访问权限。但是,第 2 步,在/proc/sys/vm/zone_reclaim_mode 中回显 0,已经是 0,所以我就这样离开了),我似乎无法使用"触摸"命令预热内存。即使它成功返回,也不会发生任何反应。在mongostat中,只有"mapped"和"vsize"越来越高,并且驻留内存相同(35m)。我甚至尝试使用 vmtouch 和 dd 命令加载操作系统内存中的数据文件。只有重新索引集合更改了驻留内存。

在我开始将数据加载到服务器一段时间后,问题就开始了。我做了很多更新插入,一开始的性能很棒(3000 - 4000 更新插入/秒)。这是意料之中的,因为工作集将能够放入内存中。在 30.000.000 个文档之后,该过程似乎出现了很多页面错误,我不知道为什么。数据文件约为 33GB,性能约为 500 个更新插入/秒,存在大量页面错误。这应该意味着工作集不在内存中。但是,256GB RAM应该绰绰有余。我尝试了"触摸"命令,但驻留内存不足(我什至重新启动了mongod进程,运行了触摸命令,即使"mapped"和"vsize"飙升到很多GB,驻留内存仍然很低,35m)。我试图重新索引集合,瞧,常驻内存从 35m 变为> 20GB。但是,我再次看到了页面错误。然后我尝试 vmtouch 数据文件(或使用 dd)。同样,很多页面错误。

问题是我不能"只有"500 个更新插入/秒。我应该更改我的应用程序逻辑吗?我认为有了 256GB 内存,我的"活动"工作集(预计为 60GB)应该适合内存。我在中间(30GB),似乎我无法做任何事情来解决这个问题。是 numa 硬件吗?我应该进行任何其他更改吗?

提前致谢

我刚刚在ServerFault上写了一个关于驻留内存,页面错误以及如何故障排除,调整和调整等的非常详细的答案,所以我不会在这里重新散列。

我会说Sammaye的评论是正确的,触摸(或dd,vmtouch等)命令不会导致内存再次报告为mongod进程的驻留,直到进程实际访问数据(在此之前它只是在FS缓存中),然后您可以在SERVER-9415中遇到问题,这可能导致驻留内存报告不足。

我认为您已经在这里查看了关键指标,并且您应该能够实现比报告更高的驻留内存(或者至少,将更多数据放入内存而不会看到明显的页面错误)。 您描述的情况听起来像是来自其他地方的内存压力,但我假设您会注意到另一个进程消耗了大量内存。

我要指出的是,我之前花了几天时间(字面意思)试图使特定的 AWS 实例超过 30% 的内存阈值,但没有成功。

当我们最终放弃并尝试另一个实例时,没有改变任何东西(我们只是添加了一个新实例作为辅助实例并故障转移到它),它立即进入了超过 70% 的驻留内存。 当然,这是在m2.4xlarge实例上,所以规模与你的不同,但始终值得牢记。如果你可以在另一个实例上尝试一下,我建议试一试。

最新更新