Docs 菜单

Docs 主页开发应用程序MongoDB Manual

MongoDB 性能

在此页面上

  • 锁定性能
  • 连接数
  • 全时诊断数据捕获

使用 MongoDB 开发和操作应用程序时,您可能需要分析应用程序及其数据库的性能。性能下降的原因通常是数据库访问策略、硬件可用性和打开的数据库连接数量。

由于索引策略不充分或不适当,或者模式设计不当,某些用户可能会遇到性能限制。 锁定性能讨论了这些问题如何影响 MongoDB 的内部锁定。

性能问题可能表明数据库正在满负荷运行,应为数据库增设更多容量。具体而言,应用程序的工作集应与可用物理内存适配。

在某些情况下,性能问题可能是暂时的,并且与异常流量负载有关。如连接数中所述,扩展可以帮助缓解过多的流量。

数据库性能分析可以帮助您了解哪些操作导致性能下降。

MongoDB 使用锁系统来确保数据集的一致性。如果某些操作运行时间过长或形成队列,则性能将随着请求和操作等待获取锁而下降。

与锁相关的减速可能是间歇性的。要查看该锁是否影响了性能,请参阅 serverStatus 输出的部分和全局锁部分。

locks.<type>.timeAcquiringMicros 除以 locks.<type>.acquireWaitCount 可以得出特定锁模式的大致平均等待时间。

locks.<type>.deadlockCount 提供锁获取过程中遇到死锁的次数。

如果 globalLock.currentQueue.total 一直处于高位,则可能是有大量请求在等待锁定。这表明可能存在影响性能的并发问题。

如果 globalLock.totalTime 相对于 uptime 较高,则数据库处于锁定状态已有很长时间。

查询时间过长可能是由以下原因导致:索引使用不当;非最优模式设计;查询结构不良;系统架构问题;或 RAM 不足导致从磁盘读取。

在某些情况下,应用程序和数据库之间的连接数可能超出服务器处理请求的能力。serverStatus 文档中的以下字段可以提供洞察:

如果存在大量并发应用程序请求,则数据库可能无法满足需求。如果是这种情况,请增加部署的容量。

对于写入密集型应用程序,应部署分片,并将一个或多个分片添加到分片集群中,以在 mongod 实例之间分配负载。

连接数量激增也可能是应用程序或驱动程序错误造成的。所有官方支持的 MongoDB 驱动程序都实现了连接池功能,它使得客户端可以更高效地使用和重用连接。如果连接数量极高,特别是没有相应的工作负载时,通常表明存在驱动程序或其他配置错误。

除非受到系统范围的限制,否则 MongoDB 支持的最大传入连接数将使用 maxIncomingConnections 设置进行配置。在基于 Unix 的系统上,可以使用 ulimit 命令或编辑系统的 /etc/sysctl 文件来修改系统范围的限制。有关详细信息,请参阅 UNIX ulimit 设置

为了帮助 MongoDB 工程师分析服务器行为,mongodmongos 进程包括全时诊断数据捕获 (FTDC) 机制。FTDC 默认处于启用状态。由于 FTDC 在调试部署中的重要性,FTDC 线程故障是致命的,会停止父 mongodmongos 进程。

重要

FTDC 隐私

FTDC 数据文件是经过压缩的,不适合人直接阅读。它们继承了与 MongoDB 数据文件相同的文件访问权限。只有有权访问 FTDC 数据文件的用户才能传输 FTDC 数据。

没有系统所有者或运营者的明确许可和协助,MongoDB 工程师将无法访问 FTDC 数据。

FTDC 数据在任何情况下都不会包含以下任何信息:

  • 查询、查询谓词或查询结果的样本

  • 从任一最终用户集合或索引中采样的数据

  • 系统或 MongoDB 用户档案或安全证书

FTDC 数据包含某些主机信息,如主机名、操作系统信息以及用于启动 mongodmongos 的选项或设置。某些组织或监管机构可能将此信息视为受保护或保密,但通常不视为个人身份信息 (PII)。对于这些字段配置了受保护、机密或 PII 数据的集群,请在发送 FTDC 数据之前通知 MongoDB 工程师,以协调适当的安全措施。

注意

Windows 上的 FTDC 用户权限

在 Windows 上,要收集磁盘、CPU 和内存等系统数据,FTDC 需要以下群组的 Microsoft 访问权限:

  • 性能监控用户

  • 性能日志用户

如果运行mongodmongos 的用户不是管理员,请将其添加到这些群组中以记录 FTDC 数据。有关更多信息,请参阅 此处的 Microsoft 文档

FTDC 定期收集以下命令产生的统计数据:

根据主机操作系统,诊断数据可能包括以下一项或多项利用率统计信息:

  • CPU使用率

  • 内存利用率

  • 磁盘利用率与性能相关。FTDC 不包括与存储容量相关的数据。

  • 网络性能统计信息。FTDC 仅捕获元数据,不捕获或检查任何网络数据包。

注意

如果mongod进程在container中运行,FTDC 会从container而不是主机操作系统的角度报告利用率统计信息。例如,如果mongod在配置了 RAM 限制的container中运行,FTDC 将根据container的 RAM 限制(而不是主机操作系统的 RAM 限制)计算内存利用率。

FTDC 在文件轮转或启动时收集以下命令产生的统计数据:

mongod 进程将 FTDC 数据文件存储在 storage.dbPath 实例下的 diagnostic.data 目录中。所有诊断数据文件均存储在此目录中。例如,假定 dbPath/data/db,则诊断数据目录将为 /data/db/diagnostic.data

mongos 进程将 FTDC 数据文件存储在相对于 systemLog.path 日志路径设置的诊断目录中。MongoDB 截断日志路径的文件扩展名并将 diagnostic.data 连接到剩余名称。例如,如果 path 设置为 /var/log/mongodb/mongos.log,则诊断数据目录将为 /var/log/mongodb/mongos.diagnostic.data

您可以在 MongoDB Github 存储库 上查看 FTDC 源代码 。ftdc_system_stats_*.ccp 文件专门定义了捕获的任何特定于系统的诊断数据。

FTDC 按以下默认值运行:

  • 每 1 秒采集一次数据

  • 最大diagnostic.data 文件夹大小为 200MB。

这些默认值旨在为 MongoDB 工程师提供有用的数据,同时尽量减轻对性能或存储空间的影响。仅当 MongoDB 工程师出于特定诊断目的请求修改时,才需要修改这些值。

要禁用 FTDC,请在配置文件的 setParameter 设置中使用diagnosticDataCollectionEnabled: false 选项启动 mongodmongos

setParameter:
diagnosticDataCollectionEnabled: false

在 MongoDB 工程师的支持下,禁用 FTDC 可能会增加分析或调试问题所需的时间或资源。有关 MongoDB 支持的信息,请访问MongoDB 支持入门

← 开发检查清单