MongoDB 服務器優化說明


軟件層面優化

設置WiredTiger的cacheSizeGB

默認配置在系統可用內存的60%左右,如果一台機器上只部署一個mongod,mongod可以使用所有可用內存,則使用默認配置即可。

storage.wiredTiger.engineConfig.cacheSizeGB

值的范圍可以從 0.25 GB 到 10000 GB。

從 MongoDB 3.4 開始,默認的 WiredTiger 內部緩存大小是以下兩者中的較大者:50% (RAM - 1 GB) 或 256 MB。

分配足夠的Oplog空間

Oplog是MongoDB local庫下的一個固定集合,Secondary就是通過查看Primary 的oplog這個集合來進行復制的。MongoDB默認將其大小設置為可用disk空間的5%(默認最小為1G,最大為50G)。

啟用Log Rotation日志切換

systemLog.logRotate

日志回轉,防止一個日志文件特別大。默認值rename,重命名日志文件。可選值reopen,使用Linux日志rotate特性,關閉並重新打開次日志文件,可以避免日志丟失,但是logAppend必須為true。

systemLog.logAppend

默認值: false

當為 true 時,mongos 或 mongod 會在 mongos 或 mongod 實例重新啟動時將新條目附加到現有日志文件的末尾。 如果沒有此選項,mongod 將備份現有日志並創建一個新文件。

systemLog.verbosity

0 是 MongoDB 的默認日志詳細級別,包括信息性消息。

1 到 5 增加了詳細級別以包括調試消息。

systemLog.quiet

默認值: false

在嘗試限制輸出量的安靜模式下運行 mongos 或 mongod。

systemLog.quiet 不推薦用於生產系統,因為它可能會使特定連接期間的跟蹤問題變得更加困難。

systemLog.traceAllExceptions

默認值: false

打印用於調試的詳細信息。 用於與支持相關的故障排除的附加日志記錄。

systemLog.destination

MongoDB 將所有日志輸出發送到的目標。 指定file或syslog。 如果指定file,則還必須指定 systemLog.path。

如果不指定 systemLog.destination,MongoDB 會將所有日志輸出發送到標准輸出。

警告:syslog 守護進程在記錄消息時生成時間戳,而不是在 MongoDB 發出消息時生成時間戳。 這可能會導致日志條目的時間戳具有誤導性,尤其是在系統負載較重時。 我們建議對生產系統使用 file 選項以確保准確的時間戳。

systemLog.path

mongod 或 mongos 應將所有診斷日志信息發送到的日志文件的路徑,而不是標准輸出或主機的系統日志。 MongoDB 在指定路徑創建日志文件。

Linux 包 init 腳本不希望 systemLog.path 更改默認值。 如果您使用 Linux 軟件包並更改 systemLog.path,則必須使用您自己的 init 腳本並禁用內置腳本。

設置journal日志刷新時間和flush時間

storage.journal.commitIntervalMs

默認值:100

mongod 進程允許在日志操作之間的最長時間(以毫秒為單位)。 值的范圍可以從 1 到 500 毫秒。 較低的值會增加日志的持久性,但會降低磁盤性能。

在 WiredTiger 上,默認的日志提交間隔是 100 毫秒。 此外,包含或暗示 j:true 的寫入將導致日志立即同步。 有關影響同步頻率的詳細信息或其他條件,請參閱日志記錄過程。

storage.journal.commitIntervalMs 設置僅適用於 mongod。不適用於使用內存存儲引擎的 mongod 實例。

4.2.0 中的已知問題:4.2.0 中缺少 storage.journal.commitIntervalMs。

storage.syncPeriodSecs

默認值:60

在 MongoDB 通過 fsync 操作將數據刷新到數據文件之前可以經過的時間量。

不要在生產系統上設置此值。 在幾乎所有情況下,您都應該使用默認設置。

警告:如果將 storage.syncPeriodSecs 設置為 0,MongoDB 將不會將內存映射文件同步到磁盤。

mongod 進程將數據寫入日志非常快,而懶惰地寫入數據文件。 storage.syncPeriodSecs 對日志文件或日志沒有影響,但如果 storage.syncPeriodSecs 設置為 0,日志最終將消耗所有可用磁盤空間。 如果出於測試目的將 storage.syncPeriodSecs 設置為 0,則還應將 --nojournal 設置為 true。

storage.syncPeriodSecs 設置僅適用於 mongod。不適用於使用內存存儲引擎的 mongod 實例。

配置示例

storage:
  dbPath: /data/mongodb
  journal:
    enabled: true
    commitIntervalMs: 100
  syncPeriodSecs: 60

systemLog:
  verbosity: 0
  quiet: false
  traceAllExceptions: false
  destination: file
  logAppend: true
  logRotate: reopen
  path: /var/log/mongodb/mongod.log

net:
  port: 27017
  bindIp: 0.0.0.0

processManagement:
  timeZoneInfo: /usr/share/zoneinfo

security:
  authorization: enabled
  keyFile: /data/mongodb/rs1.key

replication:
  replSetName: rs1

系統層面優化

  • MongoDB連接內存優化
  • MongoDB連接數優化
  • 關閉Transparent Huge Pages
  • 使用XFS文件系統,同時禁掉數據庫文件的atime
  • 使用SSD或RAID10來提供存儲IOPS能力?
  • 為Data和Journal/log分別使用單獨的物理卷?
  • 禁用NUMA
  • 設置vm.swappiness
  • 修改磁盤調度算法
  • 預讀值(readahead)設置
  • 設置Linux內核參數

設置允許用戶/進程打開文件句柄數

創建/etc/profile.d/limit.sh文件,內容如下:

ulimit -n 1048576
ulimit -u 524288

編輯/etc/security/limits.conf文件,添加以下內容:

* soft nofile 1048576
* hard nofile 1048576
* soft nproc 524288
* hard nproc 524288

關閉Transparent Huge Pages

# vim /etc/systemd/system/disable-transparent-huge-pages.service
[Unit]
Description=Disable Transparent Huge Pages (THP)
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=mongod.service

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null'

[Install]
WantedBy=basic.target

# systemctl daemon-reload
# systemctl start disable-transparent-huge-pages
# systemctl enable disable-transparent-huge-pages
# cat /sys/kernel/mm/transparent_hugepage/enabled

設置vm.swappiness

# vim /etc/sysctl.conf
...
vm.swappiness = 1
# sysctl -p

修改磁盤調度算法

/sys/block/vda/queue/scheduler

預讀值(readahead)設置

# blockdev --report
# blockdev --setra 32 /dev/vda

# vim /etc/systemd/system/modify-readahead.service
[Unit]
Description=Modify Readahead
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=mongod.service

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'blockdev --setra 32 /dev/vda'

[Install]
WantedBy=basic.target

# systemctl daemon-reload
# systemctl enable modify-readahead
# reboot

MongoDB服務腳本示例

[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network.target

[Service]
User=mongodb
Group=mongodb
EnvironmentFile=-/etc/default/mongod
ExecStart=/usr/bin/mongod --config /etc/mongod.conf
PIDFile=/var/run/mongodb/mongod.pid
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false

# Recommended limits for for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings

[Install]
WantedBy=multi-user.target

使用XFS文件系統,同時禁掉數據庫文件的atime

/dev/mapper/debian10--vg-data /data          xfs     noatime,nodiratime    0    2


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM