新鲜的 MongoDB 使用 100MB 虚拟内存吗?

新鲜的 MongoDB 使用 100MB 虚拟内存吗?

我在服务器上使用 MongoDB 时遇到虚拟内存使用问题。注意:我只有一个本地用户帐户没有根权限。

服务器的 VM 限制(来自 ulimit -v)为 120MB。

空的数据库,MongoDB 报告使用了 100MB 的虚拟内存。

> db.serverStatus().mem 
{
    "bits" : 32,
    "resident" : 23,
    "virtual" : 100,
    "supported" : true,
    "mapped" : 0
}

当我尝试创建我的第一个数据条目(通过管理数据库中的 db.addUser)时,它会因内存不足错误而失败。

done allocating datafile DBPATH/admin.0, size: 16MB,  took 0.244 secs

ERROR:   mmap() failed for DBPATH/ admin.0 len:16777216 errno:12 Cannot allocate memory

我知道,由于虚拟机限制较小,并且使用 32 位 mongodb,我无法创建巨大的数据库,但没关系。我不需要巨大的数据库。

我不明白为什么它一开始就使用了这么多的虚拟内存,以及为什么它不能创建一个 16MB 的数据库表。

我已阅读另一个问题它阐明了 mongodb 如何使用虚拟内存,但是并没有帮助我理解这里出了什么问题。

答案1

您需要为 MongoDB 服务器提供足够的资源——这意味着很多的 RAM。
您实际上将其限制为没有任何,因此,除非您设置更合理的内存使用限制,否则您不应该期望它能够工作。


您似乎错误地认为 100MB 是很大的内存容量。
但事实并非如此。

一个简单的 shell(让我们以普通的 vanilla Bournesh为例)的虚拟大小接近 10MB。
一个更复杂的 shell(比如 Bourne-Again Shell bash)略低于 25MB。Apache
Web 服务器工作器的 VM 大小可以达到 150MB 或更多。

一个数据库引擎,即使是 NoSQL 引擎,其虚拟大小只有 100MB 并且可以通过网络进行通信,坦率地说是一个编程奇迹。如果您希望能够利用这个奇迹做任何事情,您将必须为其提供足够的 RAM 来实际保存和处理数据。

答案2

虚拟内存使用量将代表整个数据文件的大小(包括空白空间),而不仅仅是数据库中的数据。当您对文件调用 mmap() 时,它只会将所有内容映射到虚拟内存中 - 它并不关心文件中的内容。

如果您的虚拟内存限制较低,那么该主机根本不适合 MongoDB,除非数据集非常小。运行小文件选择,但只是一点点。

工作集和常驻内存与 MongoDB 的虚拟内存要求完全不同。对于虚拟内存,您至少需要有数据文件的总大小,如果您使用日志功能运行(您应该这样做,但 32 位通常无法实现),则该要求会加倍。一般来说,您应该有一个具有无限虚拟内存的主机来运行 MongoDB,如果施加了限制,可能会给您带来很多问题。

这不是您要问的部分,但除了一些基本测试之外,我通常也不建议使用 32 位版本的 MongoDB 进行任何操作。

相关内容