MongoDB 性能

2020-05-22 00:00:00 数据 文件 错误 系统 页面

参考官方文档:
docs.mongodb.com/manual



锁性能


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


与锁相关的损耗可能是间歇性的。 要查看锁是否影响了性能,请参阅serverStatus输出的locks部分和globalLock部分。


通过locks.acquireWaitCount划分locks.timeAcquiringMicros可以给出特定锁定模式的近似平均等待时间。


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

如果globalLock.currentQueue.total一直很高,那么大量请求可能正在等待锁定。 这表明可能会有影响性能的并发问题。


如果globalLock.totalTime相对于正常运行时间较高,则数据库在锁定状态下已存在很长时间。

索引的使用会导致长查询; 非优方案设计; 差的查询结构; 系统架构问题; 或RAM不足导致页面错误和磁盘读。



内存使用


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


虽然这是有意的并且有助于性能,但是内存映射文件使得难以确定RAM的数量是否足以用于数据集。

serverStatus输出的内存使用状态量可以提供对MongoDB内存使用的深入了解。


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


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


Page Faults


使用MMAPv1存储引擎时,因为MongoDB会将数据读取或写入当前未位于物理内存中的部分数据文件,可能会发生页面错误。相反,当物理内存耗尽且物理内存页面交换到磁盘时,会发生操作系统页面错误。


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


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


单个page fault 会很快完成,并且没有问题。但是,总体而言,大量页面错误通常表明MongoDB正在从磁盘读取过多数据。


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


增加MongoDB可访问的RAM量可能有助于降低页面错误的频率。如果无法做到这一点,您可能需要考虑部署分片群集或向部署添加分片以在mongod实例之间分配负载。


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

  • connections 是以下两个字段的容器:
    • connections.current 连接到数据库实例的当前客户端的总数。
    • connections.available 可用于新客户端的未使用的连接总数。

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


      对于读取繁重的应用程序,请增加副本集的大小并将读取操作分发给辅助成员。


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


      连接数量的峰值也可能是应用程序或驱动程序错误的结果。所有官方支持的MongoDB驱动程序都实现了连接池,允许客户端更有效地使用和重用连接。极高数量的连接,但是是没有相应的工作负载,通常表示驱动程序或其他配置错误。


      除非受系统范围限制,否则MongoDB对传入连接没有限制。在基于Unix的系统上,您可以使用ulimit命令或编辑系统的/ etc / sysctl文件来修改系统限制。


      全时诊断数据捕获


      为了便于MongoDB公司工程师分析MongoDB服务器行为,mongod和mongos进程包含了全时诊断数据收集(FTDC)机制。 FTDC数据文件是压缩的,不是人类可读的,并且继承了与MongoDB数据文件相同的文件访问权限。 只有具有FTDC数据文件访问权限的用户才能传输FTDC数据。 MongoDB Inc.工程师无法独立于系统所有者或运营商访问FTDC数据。 默认情况下,MongoDB进程在FTDC上运行。


      FTDC数据文件是压缩的,不是人类可读的。 未经系统所有者或运营商的明确许可和协助,MongoDB Inc.工程师无法访问FTDC数据。


      FTDC数据从不包含以下任何信息:
  • 查询例子,查询谓词或查询结果
  • 从任何终用户集合或索引中采样的数据
  • 系统或MongoDB用户凭据或安全证书


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


    FTDC定期收集以下命令生成的统计信息:
  • serverStatus
  • replSetGetStatus(仅限mongod)
  • local.oplog.rs集合的collStats(仅限mongod)
  • connPoolStats(仅限mongos)



FTDC收集以下命令在文件轮询或启动时生成的统计信息:

  • getCmdLineOpts
  • buildInfo
  • hostInfo



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


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



FTDC使用以下默认值运行:

  • 每1秒捕获一次数据
  • 大诊断.data文件夹大小为200MB。


    这些默认设置旨在为MongoDB Inc.工程师提供有用的数据,而对性能或存储大小的影响小。


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


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


    setParameter:
    diagnosticDataCollectionEnabled: false


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

相关文章