Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 索引适合RAM,但仍然是分页的_Mongodb - Fatal编程技术网

Mongodb 索引适合RAM,但仍然是分页的

Mongodb 索引适合RAM,但仍然是分页的,mongodb,Mongodb,我的工作集(db.collection.totalSize())是21GB。我的索引占用3.5 GB 在16 GBRAM机器上,通过mongostat我观察到出现页面错误。请注意,即使使用索引的查询也会出现这种情况 使用vmstat,我可以看到IO/bi部分下的大量读取 最后,在“admin”数据库上使用db.serverStatus(),我看到residentmem是10.6GB 考虑到Mongo使用的是10.6GB,这显然比我的索引要多,为什么会出现分页呢?索引不应该让您不必访问磁盘 数据库

我的工作集(
db.collection.totalSize()
)是21GB。我的索引占用3.5 GB

16 GBRAM机器上,通过
mongostat
我观察到出现页面错误。请注意,即使使用索引的查询也会出现这种情况

使用
vmstat
,我可以看到IO/bi部分下的大量读取

最后,在“admin”数据库上使用
db.serverStatus()
,我看到residentmem是
10.6
GB


考虑到Mongo使用的是10.6GB,这显然比我的索引要多,为什么会出现分页呢?

索引不应该让您不必访问磁盘

数据库正在使用16 GB中的10.6 GB。这最多是总DB大小的一半。如果你的应用程序正在请求不同的信息,那么DB的缓存将不会太满。(虽然索引可能会缓存在内存中,但索引只是完整记录的一小部分)

索引将帮助您找到正确的位置,但您可能需要转到磁盘才能找到它。MongoDB和大多数其他DB将在内存中缓存最新/常用的结果

Mongo DB将最常请求的数据称为“工作集”

有关更多信息,请参见此

编辑:有关数据库缓存的更多信息将减少使用满

缓存只能包含X个数量的数据。缓存中的数据将从缓存返回(无磁盘IO)。如果您的程序定期请求不在缓存中的数据,那么DB将不得不求助于磁盘IO来获取数据。缓存(这里是DB)尝试使用某种算法来决定在缓存中存储什么。“不同”是指与缓存认为应该存储的数据不同的数据


我建议您阅读有关缓存的更多信息。

因此搜索索引适合RAM,但获取整个文档需要io和RAM(哪一个不存在,所以使用分页?@Kevin:增加了几行来澄清问题。清晰、信息丰富的答案和有用的链接。根据您的更新和链接,索引很可能适合RAM,但操作系统可能会将文档放入RAM。鉴于我的RAM没有覆盖工作集,分页可能会发生,因为文档可能会替换RAM中的索引,而如果需要将索引放入内存,ch则需要一个页面错误。@Kevin您也可以尝试改进readahead的数字,看看这是否正确地使用了您的16GB ram,操作系统将尝试容纳尽可能多的工作集,因此10.6GB的工作集可能意味着您的readahead过低。嗨,Sammaye-请详细说明e关于如何提高我的预读数据?