外观
MongoDB 性能相关参数
内存相关参数
1. wiredTigerCacheSizeGB
- 作用:设置WiredTiger存储引擎使用的缓存大小
- 默认值:操作系统可用内存的50%
- 范围:0.1GB 到 1000GB
- 推荐值:
- 生产环境:操作系统可用内存的50%-60%
- 测试环境:根据实际资源情况调整
- 版本差异:
- MongoDB 3.0+:引入WiredTiger存储引擎
- MongoDB 4.2+:支持动态调整
配置示例:
yaml
systemLog:
destination: file
path: /var/log/mongodb/mongod.log
storage:
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 16调优建议:
- 预留足够内存给操作系统和其他进程
- 对于高并发写入场景,可以适当减少缓存大小
- 对于读密集型场景,可以适当增加缓存大小
2. wiredTigerConcurrentReadTransactions
- 作用:设置WiredTiger存储引擎的并发读事务数上限
- 默认值:128
- 范围:1 到 100000
- 推荐值:根据系统并发需求调整,一般保持默认值
- 版本差异:MongoDB 3.0+ 可用
配置示例:
yaml
storage:
wiredTiger:
engineConfig:
concurrentReadTransactions: 2563. wiredTigerConcurrentWriteTransactions
- 作用:设置WiredTiger存储引擎的并发写事务数上限
- 默认值:128
- 范围:1 到 100000
- 推荐值:根据系统并发需求调整,一般保持默认值
- 版本差异:MongoDB 3.0+ 可用
配置示例:
yaml
storage:
wiredTiger:
engineConfig:
concurrentWriteTransactions: 256存储相关参数
1. storage.engine
- 作用:指定MongoDB使用的存储引擎
- 默认值:wiredTiger(MongoDB 3.2+)
- 可选值:
- wiredTiger:默认存储引擎,适合大多数场景
- inMemory:内存存储引擎,适合高性能需求
- mmapv1:旧版存储引擎,已废弃
- 推荐值:wiredTiger
- 版本差异:
- MongoDB 3.2+:默认使用wiredTiger
- MongoDB 4.0+:废弃mmapv1存储引擎
配置示例:
yaml
storage:
engine: wiredTiger2. wiredTiger.collectionConfig.blockCompressor
- 作用:设置集合数据的压缩算法
- 默认值:snappy
- 可选值:
- none:不压缩
- snappy:平衡压缩比和性能
- zlib:更高的压缩比,更低的性能
- zstd:MongoDB 4.2+,更好的压缩比和性能
- 推荐值:
- 一般场景:snappy
- 空间敏感场景:zstd(MongoDB 4.2+)
- 版本差异:
- MongoDB 3.0+:支持snappy和zlib
- MongoDB 4.2+:新增zstd压缩算法
配置示例:
yaml
storage:
wiredTiger:
collectionConfig:
blockCompressor: zstd3. wiredTiger.indexConfig.prefixCompression
- 作用:启用或禁用索引前缀压缩
- 默认值:true
- 可选值:true/false
- 推荐值:true
- 版本差异:MongoDB 3.0+ 可用
配置示例:
yaml
storage:
wiredTiger:
indexConfig:
prefixCompression: true网络相关参数
1. net.port
- 作用:设置MongoDB监听的端口
- 默认值:27017
- 范围:1024 到 65535
- 推荐值:保持默认值或根据安全需求调整
- 版本差异:所有版本可用
配置示例:
yaml
net:
port: 270172. net.bindIp
- 作用:设置MongoDB监听的IP地址
- 默认值:127.0.0.1(仅本地访问)
- 推荐值:
- 单机部署:0.0.0.0(允许所有IP访问)
- 集群部署:绑定到具体的网卡IP
- 版本差异:所有版本可用
配置示例:
yaml
net:
bindIp: 0.0.0.03. net.maxIncomingConnections
- 作用:设置MongoDB允许的最大并发连接数
- 默认值:65536
- 范围:100 到 1000000
- 推荐值:根据系统资源和应用需求调整
- 版本差异:所有版本可用
配置示例:
yaml
net:
maxIncomingConnections: 100004. net.unixDomainSocket.enabled
- 作用:启用或禁用Unix域套接字
- 默认值:true(Linux/Unix系统)
- 可选值:true/false
- 推荐值:保持默认值
- 版本差异:所有版本可用(仅Linux/Unix系统)
配置示例:
yaml
net:
unixDomainSocket:
enabled: true
pathPrefix: /tmp日志相关参数
1. systemLog.verbosity
- 作用:设置日志详细级别
- 默认值:0
- 范围:0-5
- 推荐值:
- 生产环境:0-1
- 调试环境:2-5
- 版本差异:所有版本可用
配置示例:
yaml
systemLog:
verbosity: 1
destination: file
path: /var/log/mongodb/mongod.log2. systemLog.logRotate
- 作用:设置日志轮转方式
- 默认值:rename
- 可选值:
- rename:重命名当前日志文件
- reopen:重新打开日志文件(配合外部日志轮转工具)
- 推荐值:
- 自动轮转:rename
- 配合外部工具(如logrotate):reopen
- 版本差异:所有版本可用
配置示例:
yaml
systemLog:
logRotate: reopen
destination: file
path: /var/log/mongodb/mongod.log3. operationProfiling.level
- 作用:设置性能分析级别
- 默认值:off
- 可选值:
- off:关闭性能分析
- slowOp:仅记录慢查询
- all:记录所有操作
- 推荐值:
- 生产环境:off或slowOp
- 调试环境:all
- 版本差异:所有版本可用
配置示例:
yaml
operationProfiling:
level: slowOp
slowOpThresholdMs: 1004. operationProfiling.slowOpThresholdMs
- 作用:设置慢查询阈值(毫秒)
- 默认值:100
- 范围:1 到 3600000
- 推荐值:
- 生产环境:根据业务需求调整,一般100-500ms
- 调试环境:可以设置更小的值
- 版本差异:所有版本可用
配置示例:
yaml
operationProfiling:
slowOpThresholdMs: 200复制相关参数
1. replication.oplogSizeMB
- 作用:设置副本集 oplog 的大小(MB)
- 默认值:
- 64位系统:磁盘可用空间的5%
- 最大不超过50GB
- 范围:1 到 1000000
- 推荐值:
- 写入密集型场景:更大的oplog size,建议20GB-100GB
- 读密集型场景:默认值即可
- 版本差异:所有版本可用
配置示例:
yaml
replication:
oplogSizeMB: 204802. replication.replSetName
- 作用:设置副本集名称
- 默认值:无
- 范围:字符串,长度1-128
- 推荐值:有意义的名称,如rs0, rs1等
- 版本差异:所有版本可用
配置示例:
yaml
replication:
replSetName: rs03. replication.syncFromAny
- 作用:允许副本集成员从任何其他成员同步数据
- 默认值:false
- 可选值:true/false
- 推荐值:false(生产环境)
- 版本差异:MongoDB 3.2+ 可用
配置示例:
yaml
replication:
syncFromAny: false查询相关参数
1. setParameter.failIndexKeyTooLong
- 作用:控制索引键过长时的行为
- 默认值:false(MongoDB 3.0+)
- 可选值:true/false
- 推荐值:false
- 版本差异:
- MongoDB 2.6-:默认true
- MongoDB 3.0+:默认false
配置示例:
yaml
setParameter:
failIndexKeyTooLong: false2. setParameter.internalQueryExecMaxBlockingSortBytes
- 作用:设置内存排序的最大字节数
- 默认值:104857600(100MB)
- 范围:32768 到 1073741824
- 推荐值:
- 一般场景:默认值
- 大数据集排序:适当增加
- 版本差异:MongoDB 3.0+ 可用
配置示例:
yaml
setParameter:
internalQueryExecMaxBlockingSortBytes: 2097152003. setParameter.maxIndexBuildMemoryUsageMegabytes
- 作用:设置索引构建的最大内存使用量(MB)
- 默认值:500
- 范围:100 到 10000
- 推荐值:根据系统内存情况调整
- 版本差异:MongoDB 4.2+ 可用
配置示例:
yaml
setParameter:
maxIndexBuildMemoryUsageMegabytes: 1000写入相关参数
1. storage.journal.enabled
- 作用:启用或禁用WiredTiger日志
- 默认值:true
- 可选值:true/false
- 推荐值:true(生产环境)
- 版本差异:MongoDB 3.0+ 可用
配置示例:
yaml
storage:
journal:
enabled: true2. storage.journal.commitIntervalMs
- 作用:设置WiredTiger日志的提交间隔(毫秒)
- 默认值:100
- 范围:1 到 500
- 推荐值:
- 写入性能优先:增加到200-500
- 数据安全性优先:保持默认值或减少到50
- 版本差异:MongoDB 3.0+ 可用
配置示例:
yaml
storage:
journal:
commitIntervalMs: 2003. setParameter.disableLogicalSessionCacheRefresh
- 作用:禁用逻辑会话缓存刷新
- 默认值:false
- 可选值:true/false
- 推荐值:false
- 版本差异:MongoDB 3.6+ 可用
配置示例:
yaml
setParameter:
disableLogicalSessionCacheRefresh: false分片相关参数
1. sharding.clusterRole
- 作用:设置节点在分片集群中的角色
- 默认值:无
- 可选值:
- shardsvr:分片节点
- configsvr:配置服务器节点
- 推荐值:根据节点角色设置
- 版本差异:所有版本可用
配置示例:
yaml
sharding:
clusterRole: shardsvr2. sharding.archiveMovedChunks
- 作用:控制是否归档移动的chunk
- 默认值:true
- 可选值:true/false
- 推荐值:true
- 版本差异:MongoDB 4.0+ 可用
配置示例:
yaml
sharding:
archiveMovedChunks: true参数调优最佳实践
1. 逐步调整
- 每次只调整一个参数
- 观察24-48小时,评估调整效果
- 根据实际效果决定是否继续调整
2. 基于监控数据
- 结合监控工具(如MongoDB Atlas, Prometheus+Grafana)
- 关注关键指标:
- 内存使用率
- 磁盘IOPS
- 网络吞吐量
- 查询响应时间
- 慢查询数量
3. 考虑业务场景
- 写入密集型:优化写入相关参数
- 读密集型:优化缓存和索引参数
- 混合场景:平衡各方面参数
4. 版本兼容性
- 检查参数在目标MongoDB版本中的可用性
- 注意参数默认值的变化
- 关注废弃参数和新增参数
5. 测试环境验证
- 在测试环境中验证参数调整效果
- 模拟生产环境负载
- 进行性能基准测试
常见参数调优场景
1. 高并发写入场景
- 调整wiredTigerCacheSizeGB:适当减少缓存大小
- 调整wiredTigerConcurrentWriteTransactions:增加并发写事务数
- 调整storage.journal.commitIntervalMs:增加提交间隔
- 启用journal预分配:storage.journal.preAllocDataFiles: true
2. 读密集型场景
- 调整wiredTigerCacheSizeGB:适当增加缓存大小
- 优化索引:确保查询使用合适的索引
- 调整wiredTigerConcurrentReadTransactions:增加并发读事务数
- 考虑使用副本节点分担读负载
3. 大数据集场景
- 调整internalQueryExecMaxBlockingSortBytes:增加内存排序限制
- 优化查询:避免全集合扫描
- 考虑分片:将数据分布到多个节点
- 调整oplogSizeMB:增加oplog大小
常见问题(FAQ)
Q1: 如何查看当前MongoDB的配置参数?
A1: 可以使用以下方法查看:
- 通过mongosh连接到MongoDB,执行
db.adminCommand({ getCmdLineOpts: 1 })查看命令行参数 - 执行
db.adminCommand({ getParameter: 1, <parameter_name>: 1 })查看特定参数 - 查看配置文件:通常位于/etc/mongod.conf或/usr/local/etc/mongod.conf
Q2: MongoDB参数可以动态调整吗?
A2: 部分参数支持动态调整,无需重启MongoDB:
- wiredTigerCacheSizeGB(MongoDB 4.2+)
- systemLog.verbosity
- operationProfiling.level
- 部分setParameter参数
其他参数需要修改配置文件并重启MongoDB才能生效。
Q3: 如何确定最佳的wiredTigerCacheSizeGB值?
A3: 可以参考以下公式:
wiredTigerCacheSizeGB = (系统总内存 - 预留内存) * 0.5- 预留内存:操作系统预留约1GB,其他进程预留约1-2GB
- 根据实际情况调整比例,一般在50%-60%之间
Q4: 为什么我的MongoDB实例使用的内存超过了wiredTigerCacheSizeGB设置?
A4: 因为wiredTigerCacheSizeGB只控制WiredTiger存储引擎的缓存大小,MongoDB还会使用额外的内存用于:
- 连接管理
- 操作执行
- 索引构建
- 系统缓存
- 其他MongoDB进程
Q5: 如何优化MongoDB的写入性能?
A5: 可以从以下几个方面优化:
- 调整wiredTigerCacheSizeGB:适当减少缓存大小
- 调整storage.journal.commitIntervalMs:增加提交间隔
- 使用批量写入:减少网络往返
- 优化索引:避免过多索引影响写入性能
- 考虑分片:将写入负载分布到多个节点
- 调整wiredTigerConcurrentWriteTransactions:增加并发写事务数
Q6: 如何优化MongoDB的查询性能?
A6: 可以从以下几个方面优化:
- 调整wiredTigerCacheSizeGB:适当增加缓存大小
- 优化索引:确保查询使用合适的索引
- 调整internalQueryExecMaxBlockingSortBytes:增加内存排序限制
- 优化查询语句:避免全集合扫描
- 考虑使用副本节点分担读负载
- 调整wiredTigerConcurrentReadTransactions:增加并发读事务数
