【问题标题】:What happens if one working set exceeds memory in MongDB?如果一个工作集超过了 MongoDB 中的内存会发生什么?
【发布时间】:2020-08-21 18:11:34
【问题描述】:

我了解每次在 mongoDB 中运行查询时都会缓存工作集。

当我知道前一页上的数据被删除和缓存时,如果一个工作集超出缓存内存会发生什么?

例如) 缓存大小GB:0.5g, 查询总文档大小:1g

使用 project 命令减少被缓存文档的大小是否有帮助?

【问题讨论】:

  • MongoDB 中的文档限制为 16 兆字节,因此您的文档不能占用 1 GB。
  • @D.SM 我的意思是总文件而不是一个文件

标签: mongodb wiredtiger


【解决方案1】:

缓存由 WiredTiger 管理,mongod 会请求它需要的文档,如果 WT 在缓存中没有找到它,它会从磁盘中读取。如果这使缓存超过阈值(默认为最大大小的 80%),后台驱逐工作人员将开始从缓存中删除最近最少使用的项目。

结果集在堆内存中构造/排序,而不是缓存。如果您的结果集太大,mongod 可能会在排序时使用磁盘作为临时空间。

大型结果也可能导致操作系统使用交换,在极端情况下可能会耗尽内存并被 OOM 杀手杀死。

【讨论】:

  • 我不明白“结果集是在堆内存中构造/排序的,而不是在缓存中。”不是每次都缓存结果吗?
  • 如果查询的构造不需要阻塞操作,如内存中排序,则数据库可以在到达游标末尾之前开始发回结果。从磁盘读取以构建结果的页面将被缓存直到被驱逐,但查询完成后结果不会保留。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
  • 2011-02-05
  • 2011-11-29
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多