山東省兩學(xué)一做網(wǎng)站百度競價推廣流程
優(yōu)化MongoDB內(nèi)存使用,可以通過一下幾點來降低系統(tǒng)內(nèi)存占用,本次主要配置WiredTiger Cache來實現(xiàn)
- WiredTiger Cache:
- MongoDB 使用 WiredTiger 存儲引擎,其緩存使用最近最少使用 (LRU) 算法管理。頻繁訪問的數(shù)據(jù)會保留在內(nèi)存中,而不常訪問的數(shù)據(jù)會被剔除。
- 可以通過
storage.wiredTiger.engineConfig.cacheSizeGB
配置緩存大小,從而間接控制內(nèi)存使用。
- Page Eviction:
- WiredTiger 存儲引擎會定期執(zhí)行頁面驅(qū)逐 (page eviction) 操作,將不常使用的頁面從內(nèi)存中移除。這樣可以保持內(nèi)存的合理使用。
- TTL Indexes:
- MongoDB 提供 TTL (Time-To-Live) 索引,允許自動刪除超過指定時間的數(shù)據(jù)。雖然這主要用于管理存儲空間,但也有助于減少內(nèi)存占用。
- Inactive Data Handling:
- 在分片集群 (sharded cluster) 中,不活躍的數(shù)據(jù)可以通過遷移分片來減少某些節(jié)點上的內(nèi)存壓力。將不常訪問的數(shù)據(jù)分配到較少使用的節(jié)點上,減少高負(fù)載節(jié)點的內(nèi)存占用。
- Journaling and Snapshotting:
- MongoDB 的持久化機制會定期進行日志記錄和快照,這些操作會影響內(nèi)存使用。適當(dāng)配置日志記錄和快照策略可以幫助管理內(nèi)存。
設(shè)置WiredTiger
存儲引擎和緩存大小
修改配置文件后需要重啟MongoDB
storage:wiredTiger:engineConfig:cacheSizeGB: 16
重啟MongoDB
sudo systemctl restart mongod
運行時動態(tài)調(diào)整緩存大小
db.adminCommand({ setParameter: 1, "wiredTigerEngineRuntimeConfig": "cache_size=2GB" });
查看當(dāng)前的存儲引擎
db.serverStatus().storageEngine
查詢當(dāng)前設(shè)置的緩存大小【直接查看配置文件也可以】
db.serverStatus().wiredTiger.cache["maximum bytes configured"]
查看監(jiān)控和分析
登錄MongoDB
mongo "mongodb://admin:password@localhost:27017/admin"
創(chuàng)建具有監(jiān)控權(quán)限的用戶
db.getSiblingDB("admin").createUser({user: "statuser",pwd: "statpassword",roles: [{ role: "clusterMonitor", db: "admin" }]
})
監(jiān)控 MongoDB 實例的狀態(tài)
mongostat --uri "mongodb://statuser:statpassword@localhost:27017/?authSource=admin" --discover
mongostat
的輸出字段
host insert query update delete getmore command dirty used flushes vsize res qrw arw net_in net_out conn time
localhost:27017 10 *0 *0 *0 0 1|0 0.0% 70.3% 0 33.7G 32.1G 0|0 1|0 6.99k 44.8k 24 May 29 11:08:00.238
localhost:27017 7 *0 *0 *0 0 0|0 0.0% 70.3% 0 33.7G 32.1G 0|0 1|0 5.57k 44.2k 24 May 29 11:08:01.245
localhost:27017 4 *0 *0 *0 0 2|0 0.0% 70.3% 0 33.7G 32.1G 0|0 1|0 3.03k 44.8k 24 May 29 11:08:02.241
字段解釋
- host: MongoDB 實例的地址和端口。
- insert: 每秒插入的文檔數(shù)(10, 7, 4)。
- query: 每秒查詢的次數(shù)(未發(fā)生)。
- update: 每秒更新的次數(shù)(未發(fā)生)。
- delete: 每秒刪除的次數(shù)(未發(fā)生)。
- getmore: 每秒
getmore
操作的次數(shù)(未發(fā)生)。 - command: 每秒執(zhí)行的命令次數(shù)。分為讀命令和寫命令,如
1|0
和2|0
。 - dirty: 存儲引擎的臟數(shù)據(jù)百分比(0.0%)。
- used: 存儲引擎的緩存使用百分比(70.3%)。
- flushes: 每秒執(zhí)行的
fsync
操作次數(shù)(未發(fā)生)。 - vsize: 虛擬內(nèi)存大小(33.7GB)。
- res: 常駐內(nèi)存大小(32.1GB)。
- qrw: 排隊的讀寫操作數(shù)量(查詢 | 寫入,均為 0)。
- arw: 活動的讀寫操作數(shù)量(查詢 | 寫入,均為 1|0)。
- net_in: 每秒網(wǎng)絡(luò)輸入量(6.99kB, 5.57kB, 3.03kB)。
- net_out: 每秒網(wǎng)絡(luò)輸出量(44.8kB, 44.2kB)。
- conn: 當(dāng)前連接數(shù)(24)。
- time: 當(dāng)前時間。
used:存儲引擎的緩存使用百分比解釋
在 MongoDB 的 mongostat
輸出中,used
字段表示存儲引擎(通常是 WiredTiger)緩存使用的百分比。這個百分比是存儲引擎實際使用的緩存內(nèi)存量與分配給存儲引擎的總緩存內(nèi)存量之間的比值。具體來說:
- Numerator(分子):存儲引擎實際使用的緩存內(nèi)存量。
- Denominator(分母):分配給存儲引擎的總緩存內(nèi)存量。
詳細解釋
MongoDB 的 WiredTiger 存儲引擎使用一個內(nèi)部緩存來管理內(nèi)存中的數(shù)據(jù)。緩存大小可以通過 cacheSizeGB
參數(shù)配置。如果沒有特別配置,WiredTiger 默認(rèn)將服務(wù)器總內(nèi)存的 50% 分配給緩存。
比值計算公式
used% = 實際使用的緩存內(nèi)存/分配的總緩存內(nèi)存 * 100%
示例
假設(shè)你在 mongod.conf
中配置了 WiredTiger 的緩存大小為 16 GB:
storage:wiredTiger:engineConfig:cacheSizeGB: 16
然后在 mongostat
輸出中看到 used
字段為 70.3%:
host insert query update delete getmore command dirty used flushes vsize res qrw arw net_in net_out conn time
localhost:27017 10 *0 *0 *0 0 1|0 0.0% 70.3% 0 33.7G 32.1G 0|0 1|0 6.99k 44.8k 24 May 29 11:08:00.238
這表示 WiredTiger 實際使用了約 11.248 GB 的緩存內(nèi)存(即 70.3% × 16 GB)。
優(yōu)化 MongoDB 實例的內(nèi)存使用,特別是降低常駐內(nèi)存(res
)的占用
1. 調(diào)整工作集
確保工作集(即正在頻繁訪問的數(shù)據(jù)集)能夠適應(yīng)可用的內(nèi)存。如果工作集過大,超出了物理內(nèi)存容量,MongoDB 會頻繁進行磁盤 I/O 操作,從而影響性能。
2. 索引優(yōu)化
索引是提高查詢性能的關(guān)鍵,但過多的索引會消耗大量內(nèi)存。請按照以下步驟優(yōu)化索引:
- 分析查詢模式:確定哪些查詢最常執(zhí)行,然后為這些查詢建立適當(dāng)?shù)乃饕?/li>
- 移除不必要的索引:定期審查和刪除不再使用或效率不高的索引。
- 復(fù)合索引:對于多字段查詢,使用復(fù)合索引來提高查詢效率。
// 創(chuàng)建復(fù)合索引示例
db.collection.createIndex({ field1: 1, field2: 1 });
3. 合并小文檔
如果文檔太小且數(shù)量很多,會增加內(nèi)存消耗和索引開銷??紤]將小文檔合并成大文檔,減少文檔數(shù)量,從而降低內(nèi)存使用。
4. 啟用壓縮
MongoDB 提供了多種存儲引擎和壓縮選項,例如 WiredTiger 提供了 zlib 和 snappy 壓縮。
- 啟用數(shù)據(jù)壓縮:通過配置文件或啟動參數(shù)啟用壓縮,減少數(shù)據(jù)和索引的內(nèi)存占用。
# mongod.conf 示例
storage:wiredTiger:engineConfig:cacheSizeGB: 16collectionConfig:blockCompressor: snappy
5. 調(diào)整 WiredTiger 緩存
WiredTiger 是 MongoDB 的默認(rèn)存儲引擎,可以通過調(diào)整其緩存大小來優(yōu)化內(nèi)存使用。
- 緩存大小配置:適當(dāng)調(diào)整 WiredTiger 的緩存大小,確保留有足夠的內(nèi)存供操作系統(tǒng)和其他進程使用。
# mongod.conf 示例
storage:wiredTiger:engineConfig:cacheSizeGB: 16
6. 配置系統(tǒng)參數(shù)
- 內(nèi)存分配:確保 MongoDB 進程有足夠的物理內(nèi)存可用,并且操作系統(tǒng)的虛擬內(nèi)存設(shè)置合理。
- 透明大頁:禁用透明大頁(Transparent Huge Pages, THP),減少內(nèi)存碎片。
# 禁用透明大頁
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
7. 清理未使用的數(shù)據(jù)
定期清理未使用的數(shù)據(jù)和集合,減少數(shù)據(jù)庫的總體大小和內(nèi)存占用。
8. 監(jiān)控和調(diào)整
- 監(jiān)控工具:使用監(jiān)控工具(如 MongoDB Ops Manager、Grafana 等)實時監(jiān)控內(nèi)存使用情況。
- 性能分析:定期進行性能分析和內(nèi)存使用審計,找出內(nèi)存使用的熱點并進行優(yōu)化。