优化应用程序性能的一个关键组成部分是调整支持它的数据库的性能。我们的 Telemetry 系列中的每篇文章都讨论了开发人员和数据库管理员用来调整数据库的一个重要指标,并描述了 MongoLab 用户如何利用 MongoLab 的监控界面 Telemetry 来有效地审查这些指标并采取行动。
页面错误
数据库针对存储在磁盘上的数据进行了优化,但通常会在 RAM 中缓存尽可能多的数据,以便尽可能少地访问磁盘。然而,由于将应用程序访问的所有数据都存储在 RAM 中成本过高,数据库最终必须转到磁盘。因为磁盘比 RAM 慢,这会产生大量的时间成本。
有效地调整数据库部署通常涉及评估数据库访问磁盘的频率,以减少这样做的需要。为此,分析 MongoDB 部署的 RAM 和磁盘需求的最佳方法之一是关注所谓的页面错误。
什么是页面错误?
MongoDB 通过使用称为 MMAP 的操作系统工具来管理内存中的文档和索引,它将磁盘上的数据文件转换为虚拟内存中的地址。然后数据库像直接访问内存一样访问磁盘块。同时,操作系统透明地将尽可能多的映射数据缓存在 RAM 中,只在必要时才去磁盘检索数据。
当 MMAP 收到对未缓存页面的请求时,会发生页面错误,表明操作系统必须将该页面从磁盘读入内存。
页面错误对我的集群意味着什么?
Page Faults 的频率表示操作系统访问磁盘读取数据的频率。导致页面错误的操作速度较慢,因为它们必然会导致磁盘延迟。
页面错误是诊断数据库性能不佳时要查看的最重要指标之一,因为它们表明集群没有足够的 RAM 来执行您要执行的操作。分析页面错误将帮助您确定是否需要更多 RAM,或者需要更有效地使用 RAM。
遥测如何帮助我解释页面错误?
选择一个部署,然后通过几个月甚至几年的 遥测 回顾来确定页面错误的正常水平。在页面错误偏离该规范的情况下,检查应用程序和数据库日志以查找可能导致的操作。如果这些偏差是暂时的且不常见,则它们可能不会造成实际问题。但是,如果它们是常规的或以其他方式影响应用程序性能,您可能需要采取措施。
Page Faults 的爆发对应于数据库活动的增加。
如果页面错误稳定但您怀疑它们太高,请考虑页面错误与操作的比率。如果此比率很高,则可能表示未编制索引的查询或 RAM 不足。 “高”的定义因部署而异,需要了解部署的历史,但如果出现以下任何情况,请考虑采取行动:
- Page Faults 与 Operations 的比率大于或等于 1。
- 有效锁定率通常在 15% 以上。
- 队列通常大于 0。
- 该应用程序似乎运行缓慢。
注意:未来的遥测博客文章将涵盖其他指标,例如 Effective Lock % 和 Queues。有关详细信息,请参阅 MongoDB 的 serverStatus 文档 。
如何减少页面错误?
如何减少页面错误取决于它们的来源。页面错误过多的主要原因有以下三个。
- 没有足够的 RAM 用于数据集。 在这种情况下,解决方案是通过垂直扩展到具有更多 RAM 的机器或通过向分片集群添加更多分片来水平扩展来为部署添加更多 RAM。
- 由于缺乏适当的索引,RAM 使用效率低下 。最低效的查询是那些导致集合扫描的查询。当集合扫描发生时,数据库将遍历集合中的每个文档以确定查询的结果集。在扫描期间,整个集合被读入 RAM,并由查询引擎对其进行检查。获取查询的实际结果时,页面错误通常是可以接受的,但集合扫描会导致不会返回到应用程序的文档出现页面错误。更糟糕的是,这些不必要的页面错误可能会驱逐“热”数据,从而导致后续查询出现更多页面错误。
- 由于过多的索引导致 RAM 使用效率低下 。当更新文档的索引字段时,必须更新包含这些字段的索引。在磁盘上移动文档时,必须更新包含该文档的所有索引。这些受影响的索引必须进入 RAM 才能更新。如上所述,这会导致内存不稳定。
注意:为了帮助确定您的部署需要哪些索引,MongoLab 提供了一个 慢速查询分析器 ,它为共享和专用计划用户提供索引建议。
有问题或反馈吗?
随着这个遥测博客系列的继续,我们很乐意听取您的意见。您最感兴趣的话题是什么?您难以诊断哪些类型的性能问题?
请发送电子邮件至 support@mongolab.com 告诉我们您的想法,或者让我们帮助您调整 MongoLab 部署。