【问题标题】:does mongodb swap out older data or relinquish them?mongodb 是换掉旧数据还是放弃它们?
【发布时间】:2014-02-07 21:53:25
【问题描述】:

我从 MondoDb 文档中阅读

“尽管如此,运行 MongoDB 的系统不需要 swap 进行日常操作。数据库文件是内存映射的,应该构成 MongoDB 内存使用的大部分。因此,mongod 在正常操作中不太可能使用任何交换空间。操作系统会从内存映射文件中释放内存,不需要交换,MongoDB 可以在不需要交换系统的情况下将数据写入数据文件。”

如果我没看错的话,当查询将新数据从磁盘加载到内存时,系统会用完物理内存(但不是虚拟内存),操作系统会从内存中“释放”一些旧内容以腾出空间新数据。这与将旧内容交换到交换空间的 usu mmap 行为相反。由于虚拟内存是由操作系统控制的,而不是由 Mongo 控制的,我不明白这个描述怎么可能是真的。

任何专家可以为我澄清一下吗?这是一个相当重要的问题,因为“释放”实际上更可取,因为它跳过了交换的 IO 损失。

【问题讨论】:

  • 您的问题可能会更清楚地表达为:mongo 是否使用交换?简短的回答是:不:)

标签: mongodb memory-management


【解决方案1】:

操作系统将从内存中“释放”一些较旧的内容,为新数据腾出空间。

是的,过度执行此操作会导致系统抖动并杀死您的系统。你需要有足够的内存来确保你不只是不断地从磁盘加载,而是应该有一个很好的中间。

如果你不小心,你也可以得到OOM杀手。

由于虚拟内存是由操作系统而不是 Mongo 控制的,

确切地说,操作系统只会使用 LRU (http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used)(通常)来解决哪些页面要用新数据覆盖,并且会。

从技术上讲,操作系统永远不会“释放”它只是覆盖,就像一个封顶集合。

【讨论】:

  • 我想了解这一切的每一个细节。所以如果一个页面超过了 LRU 标准,那么它就会被覆盖。如果内存中没有任何可覆盖的页面(所有页面都是新的),则操作系统会从内存中换出一些页面(以交换空间)以为新页面腾出空间。这是正确的吗?
  • Mongo 不使用交换 - 所以不,不正确。您在上述评论中所描述的是颠簸(不断循环记忆中的内容)
  • @user1058511 哎呀忘了这一点,因为 AD7six 声明 mongod 将占用尽可能多的可用 RAM,而不是交换。
  • @user1058511 或者更确切地说是 MongoDB 会要求这样做,而操作​​系统只会给出它认为合适的内容
  • 可能值得强调的是,mongod 将使用所有空闲 ram,但会立即将其释放到其他系统。 mongod“占用所有内存”是正常的,不是问题。
【解决方案2】:

我想这就是答案

"如果要从物理内存中丢弃的页面来自图像或数据文件并且尚未写入,则不需要保存该页面。相反,它可以被丢弃,如果进程再次需要该页面,则可以从图像或数据文件中取回内存。

但是,如果页面已被修改,操作系统必须保留该页面的内容,以便以后可以访问它。这种类型的页面称为脏页,当它从内存中删除时,它会保存在一种称为交换文件的特殊文件中。相对于处理器和物理内存的速度而言,对交换文件的访问非常长,并且操作系统必须兼顾将页面写入磁盘的需求和将它们保留在内存中以供再次使用的需求。”

但是,在 MongoDb 的情况下,脏页很快就会被刷新到数据库中。这可能就是为什么“运行 MongoDB 的系统不需要交换常规操作”的原因。并且交换只涉及“在某些情况下具有极端的内存限制、内存泄漏或多个程序使用相同的内存。将交换空间想象成一个蒸汽释放阀,它允许系统释放额外的压力而不影响整体功能系统。”

【讨论】:

  • 你从哪里得到你的源代码,我知道交换的使用与许多系统上的不同,例如,当进程仍在运行时不应该使用交换,除非它超过它的分配空间,还有很多其他规则
  • 阀门的解释是准确的,但脏页不应该立即被刷新交换,在这种情况下MongoDB会很慢,每次它想要处理一个它必须再次从磁盘读取同步
  • 同意1。当然,如果活动进程准备好特定页面,则交换不会发生,当然,如果不超过物理内存,交换也不会发生。在 2 上,我没有说“刷新交换”。我的意思是刷新到 MongoDb。
  • "flushed to mongodb"是什么意思?在 mongodb 的上下文中,一些来自未命名来源的关于交换文件使用的引用是不相关的。考虑 mongo 以只读方式使用,并且已使用所有内存 - 发出一个新查询,无法从内存中的数据提供服务 - 会发生什么?什么是“刷新到 mongodb”?
  • 来自 MongoDb Doc “当使用日志运行时,MongoDB 在数据文件中更改之前将写入操作存储并应用到内存和日志中。”每次写入都首先进入内存,同时创建脏页。稍后将更改写入磁盘。这就是我所说的刷新到 MongoDb 的意思。如有混淆,请见谅。
猜你喜欢
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多