MongoDB:数据分区的磁盘I/O利用率已经降低

15

我上次从MongoDB Atlas收到警报:

Disk I/O % utilization on Data Partition has gone above 70 on nvme2n1 

但是我不知道如何本地化/查询/索引/代码某部分/有问题的集合。

我该以何种方式执行分析,以找出问题的根本原因?

3个回答

15

并不是回答,但我看到许多人面临类似的问题。

在我的情况下,根本原因是:我们有一个包含大量文档的集合,其中包含一些元数据的坐标列表(实际上是坐标列表),每次更新它时,我们都会像添加新坐标一样多次更新它。+一些其他操作。

据我所知,MongoDB无法获取文档的部分内容,它会获取完整的文档,并且当我们获取许多不同的大型文档时,它们无法适应MongoDB内存缓存,每次访问都要访问硬盘,这导致了这个问题。

所以,我们只需将此文档拆分为几个文档即可解决此问题。虽然我们需要频繁访问以更新/添加此数据,但我们将其保存到不同的文档中,最终,在处理完成后,我们将所有这些文档汇集成一个大型文档,以进行“历史检查”。


9

更新 08/24/2023

“磁盘利用率%”指标已被废弃,可以使用“磁盘队列深度”和“磁盘IOPS”指标来监控磁盘性能。

在MongoDB,我们倡导不断改进用户体验。作为这一承诺的一部分,我们对数据库监控指标进行了重要调整;我们从监控图表和警报中移除了“磁盘利用率%”指标

未来,我们建议您使用“磁盘队列深度”和“磁盘IOPS”指标作为更全面和可操作的替代方案。我们的团队经过仔细评估,选择了与您遇到的真实性能场景最符合的指标,“磁盘队列深度”指标提供了更好的磁盘饱和度衡量,“磁盘IOPS”指标提供了更好的磁盘利用率衡量。通过关注这些指标,您可以获得更有价值的系统性能洞察,并识别潜在的瓶颈。

这里是关于如何监控MongoDB的更多详细信息。
最近,在MongoDB Atlas上遇到了这个警报:数据分区的磁盘I/O利用率超过90%,在实例重新启动维护后出现。与Atlas支持团队讨论后,我们对这个指标有了清楚的理解。

了解磁盘I/O利用率

磁盘I/O利用率数据分区上的磁盘I/O利用率的定义请参考doc

磁盘I/O利用率警报表示在指定阈值下请求被发出的时间百分比。

如果发出到包含MongoDB集合数据的任何分区的请求时间百分比达到或超过阈值,则会发生数据分区上的磁盘I/O利用率

iostat中的两个陷阱:%util和svctm

设备饱和发生在为串行请求提供服务的设备接近100%时。但对于并行提供请求的设备,如RAID阵列和现代SSD,这个数字不反映它们的性能限制。

这意味着,如果在给定的时间段内有至少一个I/O操作正在进行中,操作系统将报告“100%磁盘利用率”,因为该磁盘在那段时间内被“100%使用”。
因此,仅仅磁盘利用率百分比本身并不能说明相对于其“最大IOPS”容量,磁盘是否承受压力。
磁盘利用率达到“100%”本身并不意味着存在问题。磁盘利用率是发出请求到包含MongoDB集合数据的任何分区的时间百分比。这包括来自任何进程的请求,而不仅仅是MongoDB进程。现代磁盘存储可以同时支持多个I/O操作,因此具有“~100%”的利用率并不罕见,因为它只意味着磁盘在“100%”的时间间隔内始终在处理至少一个操作。
结论
在诊断潜在的与磁盘性能相关的问题时,我们应该综合考虑所有可用的与磁盘相关的指标,以及系统CPU中的IOWait。

可能的操作以帮助解决磁盘利用率%警报

  • 优化您的查询
    • 创建索引以支持读操作
    • 注意查询选择性和覆盖查询
  • 使用Atlas性能顾问查看慢查询和建议的索引。
  • 审查索引策略以进行可能的进一步索引改进。
  • 分析查询性能以查看查询如何使用索引。
  • 分析配置文件以优化执行时间较长的查询
  • 增加硬件资源,例如在Atlas上增加实例大小IOPS

来源:Mongo Doc


2
正如警报所说,这是由于磁盘利用率过高引起的。最常见的原因是未经优化的查询具有较差的“查询目标比率”,或者在相对较短的时间窗口内从/向磁盘读取/写入大量文档。
为了识别这些查询,请从“分析器”开始,并查找具有较差的“检查:返回比率”的操作。您还可以参考“性能顾问”,看它是否建议在效率低下的操作上建立任何索引。由于分析器的窗口仅限于过去24小时,因此您还可以参考您的日志来识别“慢查询”。
最终,解决这个问题的努力是三向的:
- 通过有效的索引和过滤策略优化查询执行 - 检查一次读/写入的数据量 - 增加群集的IOPS
有关官方参考,请查看此处的文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接