“文档” 菜单
文档首页
/
MongoDB Manual
/

MongoDB 性能

在此页面上

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

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

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

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

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

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

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

与锁相关的速度下降可能是间歇性的。要查看锁是否影响了性能,请参阅 部分和 输出的 globalLock 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 设置

数据库分析器收集有关针对 mongod 实例运行的操作的详情。分析器的输出有助于识别低效的查询和操作。

您可以为单个数据库或mongod实例上的所有数据库启用和配置分析。 Profiler settings affect only a single mongod instance and will not propagate across a replica set or sharded cluster.

有关启用和配置分析器的信息,请参阅数据库分析器

可用的分析级别如下:

等级
说明
0
分析器已关闭,因此不收集任何数据。这是默认的分析器级别。
1

分析器会收集用时超过 slowms 值或与某一筛选器匹配的操作的对应数据。

设置筛选器后:

  • slowmssampleRate 选项不用于分析。

  • 分析器仅捕获与筛选器匹配的操作。

2
该分析器会收集所有操作的数据。

警告

分析会降低性能,并在系统日志中暴露未经加密的查询数据。在生产部署中配置和启用分析器之前,请仔细考虑对性能和安全的影响。

有关潜在性能下降的更多信息,请参阅分析器开销

注意

logLevel 设置为 0 时,MongoDB 会将慢速操作记录到诊断日志中,记录速度由 slowOpSampleRate 确定。

如果 logLevel 设置得较高,所有操作无论延迟如何,都会显示在诊断日志中,但从节点记录慢速 oplog 条目消息这项操作除外。从节点仅记录慢速 oplog 条目。增加 logLevel 不会导致记录所有 oplog 条目。

读/写操作的分析器条目诊断日志消息(即 mongod/mongos 日志消息)包括:

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

重要

FTDC 隐私

FTDC 数据文件经过压缩,非人类可读。 未经系统所有者或操作符的明确许可和协助,MongoDB Inc. 工程师无法访问 FTDC 数据。

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

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

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

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

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

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

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

  • CPU使用率

  • 内存利用率

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

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

注意

如果 mongod 进程在容器中运行,FTDC 将从容器而不是主机操作系统的角度报告利用率统计信息。例如,如果 mongod 在配置了 RAM 限制的容器中运行,FTDC 会根据容器的 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

FTDC 按以下默认值运行:

  • 每 1 秒采集一次数据

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

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

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

要禁用 FTDC,请启动mongodmongos ,同时为配置文件中的setParameter设置指定diagnosticDataCollectionEnabled: false选项:

setParameter:
diagnosticDataCollectionEnabled: false

在 MongoDB Inc. 工程师的支持下,禁用 FTDC 可能会增加分析或调试问题所需的时间或资源。

← 开发检查清单