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
文档中的以下字段可以提供洞察:
connections
包含以下两个字段:connections.current
当前连接到数据库实例的客户端总数。connections.available
未被使用的连接总数,新客户端可用。
如果存在大量并发应用程序请求,则数据库可能无法满足需求。如果是这种情况,请增加部署的容量。
对于写入密集型应用程序,应部署分片,并将一个或多个分片添加到分片集群中,以在 mongod
实例之间分配负载。
连接数量激增也可能是应用程序或驱动程序错误造成的。所有官方支持的 MongoDB 驱动程序都实现了连接池功能,它使得客户端可以更高效地使用和重用连接。如果连接数量极高,特别是没有相应的工作负载时,通常表明存在驱动程序或其他配置错误。
除非受到系统范围的限制,否则 MongoDB 支持的最大传入连接数将使用 maxIncomingConnections
设置进行配置。在基于 Unix 的系统上,可以使用 ulimit
命令或编辑系统的 /etc/sysctl
文件来修改系统范围的限制。有关详细信息,请参阅 UNIX ulimit
设置。
全时诊断数据捕获
为了帮助 MongoDB 工程师分析服务器行为,mongod
和 mongos
进程包括全时诊断数据捕获 (FTDC) 机制。FTDC 默认处于启用状态。由于 FTDC 在调试部署中的重要性,FTDC 线程故障是致命的,会停止父 mongod
或 mongos
进程。
重要
FTDC 隐私
FTDC 数据文件是经过压缩的,不适合人直接阅读。它们继承了与 MongoDB 数据文件相同的文件访问权限。只有有权访问 FTDC 数据文件的用户才能传输 FTDC 数据。
没有系统所有者或运营者的明确许可和协助,MongoDB 工程师将无法访问 FTDC 数据。
FTDC 数据在任何情况下都不会包含以下任何信息:
查询、查询谓词或查询结果的样本
从任一最终用户集合或索引中采样的数据
系统或 MongoDB 用户档案或安全证书
FTDC 数据包含某些主机信息,如主机名、操作系统信息以及用于启动 mongod
或 mongos
的选项或设置。某些组织或监管机构可能将此信息视为受保护或保密,但通常不视为个人身份信息 (PII)。对于这些字段配置了受保护、机密或 PII 数据的集群,请在发送 FTDC 数据之前通知 MongoDB 工程师,以协调适当的安全措施。
注意
Windows 上的 FTDC 用户权限
在 Windows 上,要收集磁盘、CPU 和内存等系统数据,FTDC 需要以下群组的 Microsoft 访问权限:
性能监控用户
性能日志用户
如果运行mongod
和mongos
的用户不是管理员,请将其添加到这些群组中以记录 FTDC 数据。有关更多信息,请参阅 此处的 Microsoft 文档 。
FTDC 定期收集以下命令产生的统计数据:
适用于
local.oplog.rs
集合的collStats
(仅mongod
)connPoolStats
(仅限mongos
)
根据主机操作系统,诊断数据可能包括以下一项或多项利用率统计信息:
CPU使用率
内存利用率
磁盘利用率与性能相关。FTDC 不包括与存储容量相关的数据。
网络性能统计信息。FTDC 仅捕获元数据,不捕获或检查任何网络数据包。
注意
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
选项启动 mongod
或 mongos
:
setParameter: diagnosticDataCollectionEnabled: false
在 MongoDB 工程师的支持下,禁用 FTDC 可能会增加分析或调试问题所需的时间或资源。有关 MongoDB 支持的信息,请访问MongoDB 支持入门。