欢迎阅读MongoDB性能最佳实践的系列博文之基准测试篇。
在本系列中,我们从多个重要维度上讨论实现规模化性能的关键因素,包括:
● 数据建模与内存优化
● 查询模式和性能分析
● 索引
● 分片
● 事务和读/写关注
● 硬件和操作系统配置
● 基准测试(本期讨论的内容)
通用基准测试可能会存在误导,并不能代表所有技术以及该技术在特定应用中的性能。
我们建议你根据应用程序实际所使用的数据、查询和部署环境来制定基准测试。
以下注意事项将帮助制定更有效的基准测试。
使用多个并行线程
特别是对于分片集群和某些特定配置(如writeConcern majority)来说,单个操作的延迟可能非常大,因此需要使用多个线程来保证吞吐量。
使用批量写入
同样,为了减少网络往返的开销,你可以使用批量写入一次加载(或更新)多个文档。
在数据加载之前创建Chunks
在创建新的分片集合时,在加载数据之前对chunks进行预分割。如果不进行预分割,数据可能会在加载到一个分片的过程中就被移动到其他分片。通过预分割数据,文档将并行加载到适相应当的分片中。如果你的基准测试不包括范围查询,那么可以使用基于哈希的分片来确保写入和读取的均匀分布。
考虑分片键的顺序
如果你配置了基于范围的分片,并且按分片键对数据进行排序,那么在给定时间内的所有插入操作必然都将进入同一个Chunk的同一个分片。那么添加多个分片就没有意义了,因为在给定时间内只有一个分片处于活跃状态。
你可以通过设计数据加载使得不同的分片键值并行插入到不同的分片中:如果你的数据按分片键顺序排序,那么可以使用基于哈希的分片,确保键值相近的并行插入将被路由到不同的分片。
批量加载时禁用平衡器
在批量加载期间,防止均衡器进行不必要的重新数据平衡,这样可以提高性能。
为系统进行预热数分钟
在用于生产环境的 MongoDB 系统中,工作集应放在内存中,所有读写操作都将在内存中执行。MongoDB必须首先把工作集读到内存中,因此在进行测试之前,先用有代表性的查询对系统进行几分钟的预热,从而更加准确地了解 MongoDB 在生产环境中的性能。
使用连接池
每次操作都重新建立连接需要额外的时间,尤其是在使用 TLS 的情况下。你可以参考官方文档中的连接池选项。
配置 ulimits 同样很重要。
通过监控找到瓶颈
无论是运行基准测试还是生产工作负载,监控部署环境都非常重要。
阿里云MongoDB提供的监控功能可以对实例各节点资源的运行情况进行监控,你可以通过基本监控功能查看常用资源(例如CPU使用率和内存使用率)的运行情况。
同时,阿里云MongoDB 提供的告警功能也支持为实例的重要监控项设置阈值报警规则。当监控项的值不在设置的阈值范围内时,系统会自动向你发出报警通知,提醒您数据异常,帮助您快速定位问题并进行处理。
图1:以查看某一时间点的监控信息为例
图2:设置告警规则
性能诊断最佳实践
- MongoDB实例内存使用率高问题
- 解决MongoDB实例的CPU使用率高的问题
- 如何解决MongoDB实例IOPS使用率高的问题
- MongoDB实例空间使用率高问题
长按复制链接阅读以上操作指南:
https://help.aliyun.com/zh/mongodb/user-guide/best-practices/?spm=a2c4g.11186623.0.0.79084e46YvNiW0
基准性能压测
如果你想进行MongoDB不同规格的基准性能压测,可以参考以下文档:
性能白皮书_云数据库MongoDB 版(MongoDB)-阿里云帮助中心
https://help.aliyun.com/zh/mongodb/support/performance-white-paper/
总结
感谢你与我们一起走过这段MongoDB性能最佳实践之旅,希望你能从中获取一些有用的信息。
阿里云提供了性能诊断与优化的帮助文档,你也可以加入我们的服务钉钉群(MongoDB开发者技术群1群:26895026108 ,MongoDB开发者技术群2群:28325026378)获得更多专家指导。