先说结论

本文适配 MongoDB 4.2.1
不能通过 MongoDB 的配置文件严格限制 MongoDB 占用的内存
将 storage.wiredTiger.engineConfig.cacheSizeGB 配置为期望占用最大内存的 60% 左右即可

查看 MongoDB 内存使用情况

  • mem

    > db.serverStatus().mem
    {
      "bits": 64,     // 操作系统位数
      "resident": 15542,  // 常驻内存/物理内存(MB)
      "virtual": 16760,   // 虚拟内存
      "supported": true   // 为 true 表示支持显示额外的内存信息
    }
  • tcmalloc

    > db.serverStatus().tcmalloc.tcmalloc.formattedString
    ------------------------------------------------
    MALLOC:    13431957064 (12809.7 MiB) Bytes in use by application
    MALLOC: +   1582014464 ( 1508.7 MiB) Bytes in page heap freelist
    MALLOC: +   1060879520 ( 1011.7 MiB) Bytes in central cache freelist
    MALLOC: +      2996608 (    2.9 MiB) Bytes in transfer cache freelist
    MALLOC: +      7394200 (    7.1 MiB) Bytes in thread cache freelists
    MALLOC: +     74448896 (   71.0 MiB) Bytes in malloc metadata
    MALLOC:   ------------
    MALLOC: =  16159690752 (15411.1 MiB) Actual memory used (physical + swap)
    MALLOC: +      5287936 (    5.0 MiB) Bytes released to OS (aka unmapped)
    MALLOC:   ------------
    MALLOC: =  16164978688 (15416.1 MiB) Virtual address space used
    MALLOC:
    MALLOC:         608155              Spans in use
    MALLOC:             21              Thread heaps in use
    MALLOC:           4096              Tcmalloc page size
    ------------------------------------------------
    Call ReleaseFreeMemory() to release freelist memory to the OS (via madvise()).
    Bytes released to the OS take up virtual address space but no physical memory.
  • 红框所示即为大致物理内存消耗
    MongoDB 内存消耗

storage.wiredTiger.engineConfig.cacheSizeGB

  • 从 MongoDB 3.4 开始, 这个参数默认值为下面二者中更大的一个:

  • MB

Windows

walker 在 Windows Server 2012 R2 上将 mongod.cfg 中 storage.wiredTiger.engineConfig.cacheSizeGB 设置为 32 之后,在任务管理器中发现,MongoDB Server 占用的内存还是达到了 45 GB,相关配置如下:

storage:
  dbPath: E:\MongoDB\Server\4.2\data
  journal:
    enabled: true
  engine: wiredTiger
  wiredTiger:
    engineConfig:
         cacheSizeGB: 32

于是想从系统配置上对 MongoDB 进行内存限制。

WSRM

WSRM
Windows System Resource Manager
Windows 系统资源管理器

在 Windows Server 2008 中可以用 WSRM 限制 MongoDB 内存,从 Windows Server 2012 开始,WSRM 被弃用,类似功能由 Hyper-V 提供。

Linux

Linux 下可以使用cgroups限制MongoDB的内存使用

本文出自 qbit snap

qbit
268 声望279 粉丝