本文將簡述一下MongoDB的內存限制問題
1. 使用Docker限制
當我們使用docker創建mongo 容器時,可通過使用以下參數,對mongo可以使用的資源進行限制
內存限制
參數 簡介 -m, - -memory 內存限制,格式:數字+單位,單位可以是b, k, m, g,最小4M -- -memory-swap 內存和交換空間總大小限制,注意:必須比-m參數大 -m 和 --memory-swap
docker run -it --rm -m 100M --memory-swap -1 ubuntu-stress:latest /bin/bash
指定限制內存大小並且設置 memory-swap 值為 -1,表示容器程序使用內存受限,而 swap 空間使用不受限制(宿主 swap 支持使用多少則容器即可使用多少。如果 --memory-swap 設置小於 --memory則設置不生效,使用默認設置)。
docker run -it --rm -m 100M --memory-swap -1 centos /bin/bash
按照官方文檔的理解,如果指定 -m 內存限制時不添加 --memory-swap 選項,則表示容器中程序可以使用 100M 內存和 100M swap 內存。默認情況下,–memory-swap 會被設置成 memory 的 2倍。
–memory-swappiness=0
表示禁用容器 swap 功能(這點不同於宿主機,宿主機 swappiness 設置為 0 也不保證 swap 不會被使用):
docker run -it --rm -m 100M --memory-swappiness=0 ubuntu-stress:latest /bin/bash
–memory-reservation
選項可以理解為內存的軟限制。如果不設置 -m 選項,那么容器使用內存可以理解為是不受限的。按照官方的說法,memory reservation 設置可以確保容器不會長時間占用大量內存。
–oom-kill-disable
docker run -it --rm -m 100M --memory-swappiness=0 --oom-kill-disable ubuntu-stress:latest /bin/bash
–kernel-memory
內核內存與用戶內存根本不同,因為內核內存無法換出。無法交換使容器可能通過占用過多的內核內存來阻止系統服務。內核內存包括:
- stack pages
- slab pages
- sockets memory pressure
- tcp memory pressure
如果無特殊需求,kernel-memory 一般無需設置,這里不作過多說明。
CPU限制
參數 簡介 -- -cpuset-cpus="" 允許使用的CPU集 -c,- -cpu-shares=0 CPU共享權值 -- -cpu-quota=0 限制CPU CFS配額,必須不小於1ms,即>=1000 cpu-period=0 限制CPU CFS調度周期,范圍是100ms~1s,即[1000, 1000000] sudo docker run -ti --cpuset-cpus="1,3" --name cpuset [鏡像名稱:版本] bash
比如上面的指令指定容器進程可以在 CPU1 和 CPU3 上運行
2. 通過修改MongoDB的配置文件限制其可以使用的內存
MongoDB的內存限制參數配置:
3.X: /etc/mongod.conf
4.X: /etc/mongod.conf.orig
常用基本配置文件參數
storage:
# mongod 進程存儲數據目錄,此配置僅對 mongod 進程有效
dbPath: /data/mongodb/db
是否開啟 journal 日志持久存儲,journal 日志用來數據恢復,是 mongod 最基礎的特性,通常用於故障恢復。64 位系統默認為 true,32 位默認為 false,建議開啟,僅對 mongod 進程有效。
journal:
enabled: true
# 存儲引擎類型,mongodb 3.0 之后支持 “mmapv1”、“wiredTiger” 兩種引擎,默認值為“mmapv1”;官方宣稱 wiredTiger 引擎更加優秀。
engine: mmapv1
systemLog:
# 日志輸出目的地,可以指定為 “file” 或者“syslog”,表述輸出到日志文件,如果不指定,則會輸出到標准輸出中(standard output)
destination: file
# 如果為 true,當 mongod/mongos 重啟后,將在現有日志的尾部繼續添加日志。否則,將會備份當前日志文件,然后創建一個新的日志文件;默認為 false。
logAppend: true
# 日志路徑
path: /var/log/mongodb/mongod.log
net:
# 指定端口
port: 27017
# 綁定外網 op 多個用逗號分隔
bindIp: 0.0.0.0
maxIncomingConnections: 10000
內存優化相關的配置
MongoDB 在使用過程中, 內存占用會越來越大, 甚至達到危險的狀態, 而且會一直保持最高狀態, 官網上有相關的內容:https://docs.mongodb.com/v3.4/core/wiredtiger/index.html 以下根據官網, 增加限制內存的配置, 啟動mongo使用配置文件啟動
storage:
dbPath: /data/mongodb/db
journal:
enabled: true
engine: wiredTiger
# 如下配置僅對 wiredTiger 引擎生效(3.0 以上版本)
wiredTiger:
# wiredTiger 緩存工作集(working set)數據的內存大小,單位:GB
# 此值決定了 wiredTiger 與 mmapv1 的內存模型不同,它可以限制 mongod 對內存的使用量,而 mmapv1 則不能(依賴於系統級的 mmap)。默認情況下,cacheSizeGB 的值為假定當前節點只部署一個 mongod 實例,此值的大小為物理內存的一半;如果當前節點部署了多個 mongod 進程,那么需要合理配置此值。如果 mongod 部署在虛擬容器中(比如,lxc,cgroups,Docker)等,它將不能使用整個系統的物理內存,則需要適當調整此值。默認值為物理內存的一半。
engineConfig:
cacheSizeGB: 5
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
net:
port: 27017
bindIp: 0.0.0.0
maxIncomingConnections: 10000
參考鏈接