1

我在 32 位生产系统上使用 MongoDB,这很糟糕,但现在我无法控制。挑战在于将内存使用量保持在 ~2.5GB 以下,因为超过此值会导致 32 位系统崩溃。

根据 mongoDB 团队的说法,跟踪内存使用情况的最佳方法是使用操作系统的进程跟踪系统(即 Unix 系统上的 ps 或 htop;Windows 上的 Process Explorer。)来获取虚拟内存大小。

数据库主要由一个不断循环数据的表组成,即定期从传感器接收数据,并且每天一个 cron 作业擦除过去 3 天之前的所有数据。在一段时间内,内存使用量会慢慢增加。随着时间的推移,我使用 db.serverStats()、db.lectura.totalSize() 和 ps 做了一些笔记,如下图所示。请注意,相关表的大小在上个月有所减少,但内存使用量仍然增加。

在此处输入图像描述

现在,我存储的数据天数有一些调整空间。今天基本删除了一半的数据,然后重启了mongodb,但是根据ps的mem virtual/mem mapped,最重要的内存使用量几乎没有变化!为什么当我擦除数据(并重新启动)时这些不会减少?我读了一些其他问题,人们说 mongo 并没有真正使用它可能正在使用的所有内存,并且您无法清除缓存或限制内存使用。但是,我怎样才能确保我保持在 2.5GB 的限制之下呢?

除非有办法阻止这个数据集大小——不管内存使用量的逐渐增加,否则在我看来 32 位版本的 Mongo 是不可用的。注意:如果它解决了问题,我不介意损失一点性能。

4

3 回答 3

3

要回答为什么映射和虚拟内存使用量不会随着删除而减少,映射数实际上是您mmap()在整个数据文件集时得到的。当您删除记录时,这不会缩小,因为尽管数据文件内部的空间被释放了,但它们本身并没有缩小 - 之后文件只是更空了。

虚拟将包括日志文件、连接以及其他与数据无关的内存使用,但同样的原则也适用于那里。此处描述了这一点以及更多内容:

http://www.mongodb.org/display/DOCS/Checking+Server+Memory+Usage

因此,32 位的2GB 存储大小限制实际上适用于数据文件,无论其中是否有数据。要回收已删除的空间,您必须运行修复。这是一个阻塞操作,将要求数据库在运行时处于脱机/不可用状态。就可用磁盘空间而言,它还需要高达原始大小的 2 倍才能运行修复,因为它本质上表示从头开始再次写出文件。

这个限制,以及它引起的问题,就是为什么 32 位版本不应该在生产中运行,它只是不适合。我建议尽快进入 64 位版本。

顺便说一句,这些数字(映射的或虚拟的)实际上都不能代表您的常驻内存使用情况,而这正是您真正想要查看的。随着时间的推移,最好的方法是通过MMS,这是 10gen 提供的免费监控服务 - 它会随着时间的推移为您绘制虚拟、映射和常驻内存以及大量其他统计信息。

如果您想立即查看,请运行mongostat并检查相应的内存列(res、mapped、virtual)。

通常,当使用具有无限存储空间的 64 位构建时,数据通常会大大超过可用内存。因此,mongod 将使用所有可用内存作为常驻内存(这就是为什么您应该始终将交换配置为 OOM Killer 不会发挥作用的原因)。

一旦使用了它,操作系统就不会停止分配内存,它只会将最旧的项目分页,以便为新数据 ( LRU ) 腾出空间。换句话说,内存的回收将为您完成,并且常驻内存级别将保持相当恒定。

于 2012-09-07T16:10:37.263 回答
2

拉伸 32 位的选项有限,但您可以尝试一些方法。您用完的是地址空间,而附加数据库文件大小的增加意味着您希望避免从“n”个文件跨越到“n+1”个文件的边界。将数据结构化到更多或更少的数据库中可能是值得的,这样您就可以将最大数量的实际数据放入内存并尽可能少地“死空间”。

例如,如果名为“mydatabase”的数据库包含 16 MB 的文件 mydatabase.ns(命名空间文件)、64 MB 的 mydatabase.0、128 MB 的 mydatabase.1 和 256 MB 的 mydatabase.2,那么下一个为此数据库创建的文件将是 mydatabase.3,大小为 512 MB。如果不是添加到 mydatabase,而是创建了一个额外的数据库“mynewdatabase”,它将以 16 MB 的 mynewdatabase.ns 和 64 MB 的 mynewdatabase.0 开始......比添加到原始数据库的 512 MB 小很多将会。事实上,您可以创建 4 个新数据库,而其占用的空间比向原始数据库添加新文件所消耗的空间要少,而且由于文件更小,它们更容易放入连续的内存块中。

于 2012-09-10T13:16:43.350 回答
-4

众所周知,不应将 32 位用于生产。

使用 64 位系统。

观点。

于 2012-09-07T14:04:01.347 回答