MongoDB Performance

在本页面

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

由于索引策略不足或不适当,或者架构设计模式不佳,某些用户可能会遇到性能限制。 Locking Performance讨论了这些因素如何影响 MongoDB 的内部锁定。

性能问题可能表明数据库正在以最大容量运行,是时候向数据库添加附加容量了。特别是,应用程序的working set应该适合可用的物理内存。有关工作集的更多信息,请参见内存和 MMAPv1 存储引擎

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

Database Profiling可以帮助您了解导致降级的操作。

Locking Performance

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

与锁定有关的减速可能是间歇性的。要查看锁定是否已影响您的性能,请参考serverStatus输出的locks部分和globalLock部分。

locks.timeAcquiringMicros除以locks.acquireWaitCount可以得出特定锁定模式的平均 await 时间。

locks.deadlockCount提供锁获取遇到死锁的次数。

如果globalLock.currentQueue.total始终很高,则可能有大量请求正在 await 锁定。这表明可能存在并发问题,可能会影响性能。

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

无效的索引使用可能导致长时间的查询;非最佳模式设计;查询结构不良;系统架构问题;或 RAM 不足导致page faults和磁盘读取。

内存和 MMAPv1 存储引擎

Memory Use

通过MMAPv1存储引擎,MongoDB 使用内存 Map 文件来存储数据。给定足够大的数据集,mongod进程将分配系统上的所有可用内存供其使用。

尽管这是有意的并有助于提高性能,但内存 Map 文件使很难确定 RAM 量是否足以容纳数据集。

serverStatus输出的内存使用状态Metrics 可以洞察 MongoDB 的内存使用情况。

mem.resident字段提供了正在使用的常驻内存量。如果这超出了系统内存的数量,并且磁盘上有大量数据不在 RAM 中,则您可能超出了系统的容量。

您可以检查mem.mapped来检查mongod正在使用的 Map 内存量。如果此值大于系统内存量,则某些操作将需要page faults才能从磁盘读取数据。

Page Faults

使用 MMAPv1 存储引擎时,由于 MongoDB 从其数据文件的当前不在物理内存中的部分读取数据或将数据写入其中的数据,可能会发生页面错误。相反,当物理内存用完并且物理内存的页面交换到磁盘时,就会发生 os 页面错误。

MongoDB 报告其触发的页面错误为一秒内的page faults总数。要检查页面错误,请参见serverStatus输出中的extra_info.page_faults值。

MongoDB 页面故障计数器的迅速增加可能表明服务器的物理内存太少。访问大型数据集或扫描整个集合时也可能发生页面错误。

单页故障可以快速完成,并且没有问题。但是,总的来说,大量的页面错误通常表明 MongoDB 从磁盘读取了太多数据。

页面发生故障后,MongoDB 通常可以“屈服”读取锁定,从而允许其他数据库进程在mongod将下一页加载到内存时进行读取。在页面错误之后产生读取锁可以提高并发性,还可以提高大容量系统中的总体吞吐量。

增加 MongoDB 可访问的 RAM 数量可能有助于减少页面错误的发生率。如果无法做到这一点,则可能要考虑部署sharded cluster或向部署中添加shards以在mongod个实例之间分配负载。

有关更多信息,请参见什么是页面错误?

连接数

在某些情况下,应用程序与数据库之间的连接数可能会使服务器处理请求的能力不堪重负。 serverStatus文档中的以下字段可提供详细信息:

如果有大量并发应用程序请求,则数据库可能难以满足需求。如果是这种情况,那么您将需要增加部署的容量。

对于需要大量读取的应用程序,请增加replica set的大小,并将读取操作分配给secondary成员。

对于繁重的应用程序,请部署sharding并将一个或多个shards添加到sharded cluster以在mongod实例之间分配负载。

连接数量激增也可能是应用程序或驱动程序错误的结果。所有官方支持的 MongoDB 驱动程序都实现连接池,这使 Client 端可以更有效地使用和重用连接。连接数量过多,特别是没有相应的工作量时,通常表示驱动程序或其他配置错误。

除非受到系统范围的限制的约束,否则 MongoDB 对传入连接没有任何限制。在基于 Unix 的系统上,您可以使用ulimit命令或通过编辑系统的/etc/sysctl文件来修改系统限制。有关更多信息,请参见UNIX ulimit 设置

Database Profiling

Database Profiler收集有关针对 mongod 实例运行的操作的详细信息。探查器的输出可帮助识别效率低下的查询和操作。

您可以为mongod实例上的单个数据库或所有数据库启用和配置概要分析。探查器设置仅影响单个mongod实例,并且不会跨replica setsharded cluster传播。

有关启用和配置探查器的信息,请参见Database Profiler

提供以下分析级别:

LevelDescription
0探查器已关闭,并且不收集任何数据。这是默认的探查器级别。
1分析器收集的操作数据所花费的时间比slowms的时间长。
2探查器收集所有操作的数据。

Important

分析可能会影响性能并与系统日志共享设置。在生产部署上配置和启用探查器之前,请仔细考虑所有性能和安全隐患。

有关潜在性能下降的更多信息,请参见Profiler Overhead

Note

logLevel设置为0时,MongoDB 以slowOpSampleRate确定的速率将* slow *操作记录到诊断日志中。对于从版本 3.6.11 开始的 MongoDB 3.6 部署,副本集的第二副本将设置日志所有花费比慢操作阈值更长的时间的 oplog 条目消息,而与采样率无关。

在更高的logLevel设置下,所有操作都将显示在诊断日志中,而与它们的延迟无关,但以下情况除外:记录次要节点的操作日志 Importing 消息缓慢。辅助服务器仅记录慢速操作日志条目;增加logLevel不会记录所有操作日志条目。

全时诊断数据捕获

为了便于 MongoDB Inc.工程师对 MongoDB 服务器行为的分析,mongodmongos进程包括全时诊断数据收集(FTDC)机制。 FTDC 数据文件经过压缩,不可读,并且继承了与 MongoDB 数据文件相同的文件访问权限。只有有权访问 FTDC 数据文件的用户才能传输 FTDC 数据。 MongoDB Inc.工程师无法独立于系统所有者或操作员访问 FTDC 数据。默认情况下,MongoDB 进程在 FTDC 上运行。有关 MongoDB 支持选项的更多信息,请访问MongoDB 支持入门

FTDC Privacy

FTDC 数据文件已压缩且无法读取。未经系统所有者或操作员的明确许可和帮助,MongoDB Inc.工程师无法访问 FTDC 数据。

FTDC 数据“绝不”包含以下任何信息:

  • 查询,查询谓词或查询结果的 samples

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

  • 系统或 MongoDB 用户凭证或安全证书

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

FTDC 定期收集以下命令产生的统计信息:

根据主机 os,诊断数据可能包括以下一项或多项统计信息:

  • CPU utilization

  • Memory utilization

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

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

FTDC 收集以下命令在文件旋转或启动时产生的统计信息:

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

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

FTDC 使用以下默认值运行:

  • 每 1 秒钟捕获一次数据

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

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

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

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

setParameter:
  diagnosticDataCollectionEnabled: false

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