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

禁用NUMA

# 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 = 0
# 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
上一篇:CentOS安装MongoDB


下一篇:Windows_MongoDB_4.0.21版本zip方式做副本集成员配置