软件层面优化
设置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