1. 存储层:使用SSD替代传统机械硬盘
SSD的高速随机读写性能可显著降低MongoDB的I/O延迟,尤其适合高并发的读写场景。建议选择NVMe协议的SSD,其吞吐量和延迟更优。
2. 内存:增加物理内存并合理分配WiredTiger缓存
MongoDB依赖内存缓存数据和索引,建议将服务器总内存的**50%-70%**分配给WiredTiger引擎(通过storage.wiredTiger.engineConfig.cacheSizeGB配置)。例如,8GB内存的服务器可设置为5-6GB。
3. CPU:选择多核处理器提升并发处理能力
MongoDB是CPU密集型应用,多核CPU可并行处理查询和写入请求。建议选择4核及以上的处理器,如Intel至强或AMD EPYC系列。
4. 操作系统内核参数优化
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/defrag
/etc/security/limits.conf,添加:mongod soft nofiles 64000
mongod hard nofiles 64000
noop或deadline调度算法(通过echo noop | sudo tee /sys/block/sda/queue/scheduler设置)。1. 确认使用WiredTiger存储引擎
WiredTiger是MongoDB的默认高性能存储引擎,支持压缩和缓存优化。在/etc/mongod.conf中确认:
storage:
engine: wiredTiger
2. 调整WiredTiger缓存大小
根据服务器内存情况,设置合理的缓存大小(如8GB内存设置为6GB):
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 6
3. 优化日志与journal参数
logRotate: reopen(默认开启)。commitIntervalMs(默认100ms)可提高数据持久性,但会增加I/O压力。根据业务需求调整(如10-50ms)。4. 增加连接数限制
修改net.maxIncomingConnections(默认10000),根据并发连接数需求设置为5000-10000:
net:
maxIncomingConnections: 5000
1. 索引优化:创建高效索引
createIndex({ username: 1 })(1表示升序)。{ status: 1, created_at: -1 }),注意索引字段顺序(匹配查询条件的顺序)。db.collection.stats()检查未使用的索引并删除。2. 查询优化:减少资源消耗
find({ status: "active" }, { name: 1, email: 1, _id: 0 }),避免返回整个文档。explain("executionStats")分析查询计划,确保查询使用了索引。3. 批量操作与分页
bulkWrite()替代单条操作,减少网络往返次数。skip(10000).limit(10)),改用基于索引的分页(如记录上次查询的_id,下次查询find({ _id: { $gt: lastId } }, { ... }).limit(10))。1. 使用内置工具监控性能
2. 分析慢查询日志
开启慢查询日志(operationProfiling.mode: slowOp,slowOpThresholdMs: 100),通过db.getProfilingLevel()和db.system.profile.find()查看慢查询详情,针对性优化。
3. 第三方监控工具
使用Prometheus+Grafana或Percona Monitoring and Management(PMM)监控MongoDB的性能指标(如CPU、内存、磁盘I/O、连接数),实现可视化预警。
通过以上多层优化策略,可有效解决CentOS环境下MongoDB的性能瓶颈。需注意的是,优化过程应结合业务场景和实际监控数据,逐步调整并验证效果。