MongoDB 2.46& 2.4.8
用例:
在我开始将数据加载到服务器后,问题开始了一段时间。我做了很多upserts并且开始时表现很棒(3000 - 4000 upserts / sec)。这是预期的,因为工作集将能够适应内存。在30.000.000文件之后,这个过程似乎会造成很多页面错误,我不知道为什么。 数据文件大约是。 33GB ,性能大约是500 upserts / sec,有很多页面错误。这应该意味着工作集不在内存中。但是, 256GB RAM应该绰绰有余。我尝试了'touch'命令,但驻留内存很低(我甚至重新启动了mongod进程,运行了touch命令,即使'mapped'和'vsize'暴涨到很多GB,常驻内存保持低位,35m) 。我试图重新索引收集和vo,居民记忆从35米 - > 20GB。但是,我再次看到了页面错误。然后我尝试vmtouch数据文件(或与dd)。同样,很多页面错误。
问题在于我不能'只'500 upserts / sec。我应该改变我的应用逻辑吗?我认为使用256GB内存时,我的“主动”工作集(预期为60GB)应该适合内存。我处于中间位置(30GB),似乎我无法解决这个问题。它是numa硬件吗?我应该做出任何其他改变吗?
提前致谢
答案 0 :(得分:1)
我刚刚在ServerFault上写了关于驻留内存,页面错误以及如何排除故障,调整和调整等的pretty detailed answer,所以我不会在这里重新哈希。
我会说Sammaye的评论是正确的,触摸(或dd,vmtouch等)命令不会导致内存再次报告为mongod
进程的驻留,直到进程实际访问数据为止(直到那时它只是在FS缓存中),然后你可以点击SERVER-9415中的问题,这可能导致常驻内存被报告。
我认为您已经在考虑这里的关键指标,并且您应该能够获得比报告更高的驻留内存(或者至少可以将更多数据存入内存而不会出现明显的页面错误)。你所描述的情况听起来像是来自其他地方的记忆压力,但我假设你会注意到另一个进程需要大量记忆。
我要注意的是,我之前花了几天时间(字面意思)试图使特定的AWS实例超过30%的内存阈值而没有成功。
当我们最终放弃并尝试了另一个实例时,没有更改任何内容(我们只是添加了一个新实例作为辅助实例并对其进行了故障转移),它立即转移到超过70%的驻留内存。当然,这是m2.4xlarge
个实例,所以与你的实例不一样,但总是值得记住。如果你可以在另一个实例上试一试,我建议你试一试。