为什么MongoDB的内存映射文件导致像top这样的程序显示比正常数字更大的数字?

时间:2011-12-22 01:40:05

标签: linux mongodb memory-mapped-files nosql

我试图绕着mongodb的内部包围,我一直在读这个

http://www.theroadtosiliconvalley.com/technology/mongodb-mongo-nosql-db/

为什么会这样?

1 个答案:

答案 0 :(得分:3)

因此,存储器映射文件的工作方式是内存中的地址按字节与磁盘上的文件进行字节映射。这使得它非常快,但非常大。想象一下磁盘上的一个文件,你的数据占用了那么大的内存。

为什么它很棒

实际上,这种情况很糟糕,因为直接从内存中进行写入和读取而不是发出系统调用(认为上下文切换)很快。此外,在实践中,这个巨大的内存映射块不适合你的物理ram这一事实很好。为什么?您只需要工作数据集以适合ram,因为未使用的页面未加载并且只保留在磁盘上。如果需要它们,则会发生页面错误并加载。 (我相信已经加载的部分被称为驻留记忆)

为什么它有点糟糕

映射到内存中的文件需要页面对齐,所以如果你没有用完页面边界上的内存空间,你就会浪费空间(小的tradoff)

摘要(tldnr)

它可能看起来占用了大量资源,因为它将整个数据映射到内存地址,但这并不重要,因为数据实际上并不是全部保存在RAM中。 Mongo将根据需要提取数据,并有效地使用内存来维护高效的工作集。