【问题标题】:MongoDB logs all queries as slow on logging verbosity level 1 and higherMongoDB 将所有查询记录为在记录详细级别 1 及更高级别时很慢
【发布时间】:2022-09-28 23:03:49
【问题描述】:

我有一个 Mongo db 版本 4.4.1,我正在分析慢查询。使用分析级别 1 和详细级别 0 不会记录任何内容,但是使用分析级别 1 和详细级别 1 所有查询都会记录为慢,即​​使 durationMillis 低于慢速。我发现的只是文档中的官方信息:

https://www.mongodb.com/docs/manual/tutorial/manage-the-database-profiler/#profiling-levels https://www.mongodb.com/docs/manual/reference/method/db.setLogLevel/#db.setloglevel-- https://www.mongodb.com/docs/manual/reference/configuration-options/#mongodb-setting-operationProfiling.slowOpThresholdMs

在较高的 logLevel 设置下,所有操作都会出现在诊断日志中,无论其延迟如何,但以下例外:辅助节点记录慢速 oplog 条目消息。辅助节点仅记录慢速 oplog 条目;增加 logLevel 不会记录所有 oplog 条目。

不清楚详细级别 1 及更高级别是否会自动将所有查询记录为慢。

不同详细级别的行为是什么以及为什么将 durationMillis 低于 slowms 的查询记录为慢

    标签: mongodb


    【解决方案1】:

    我认为这个问题将一些相关主题混为一谈,原因可以理解,我们将在下面看到。

    第一对概念是分析器和慢查询日志记录。 database profiler 是一个有上限的集合,它收集有关 CRUD 操作(除其他外)的运行时信息。可以直接在日志文件中单独捕获有关 CRUD 操作的详细信息。您可以使用单个 db.setProfilingLevel() method 来调整这两者。

    现在,上述日志文件与mongod 进程用于其他操作需求的diagnostic log file 相同。因此,单个文件具有双重职责,因为它还将捕获有关许多其他组件的详细信息,例如网络、复制和访问控制。为了使问题更加复杂,可以配置和记录的components 之一确实是the QUERY one。为components 调整verbosity 是通过db.setLogLevel() method 完成的。系统默认为verbosity level of 0 for all components, which includes "Informational" (I) details

    现在“慢查询”日志行由“信息”级别的QUERY 组件生成的消息类型之一。这一事实的结果是,您可以增加通过以下任一方式记录的慢查询条目的数量:

    • 通过db.setProfilingLevel() 方法降低slowms 阈值
    • 通过db.setLogLevel() 方法为QUERY 组件增加verbosity

    最后回到开头,慢查询记录和分析也与slowms(和其他相关设置)的使用重叠。具体来说,如果您将(分析)level 设置为1,那么slowms 现在将用于控制进入日志文件的条目以及分析器捕获的条目。 02 的设置使分析忽略slowms(分别在分析器中不捕获任何内容或捕获所有内容)。

    因此,您引用的文档部分,包括前面的句子,是试图将所有这些联系在一起的部分(当涉及到PRIMARY 上的行为时):

    logLevel 设置为0 时,MongoDB 以slowOpSampleRate 确定的速率将慢操作记录到诊断日志中。在较高的logLevel 设置下,所有操作都会出现在诊断日志中,无论其延迟如何

    注意到:

    • 这里的“慢操作”定义为超过slowms设置的操作
    • 这里的logLevel 指的是db.setLogLevel()verbosity 设置,而不是db.setProfilingLevel()level 参数。

    我找不到关于为什么 db.setLogLevel() 方法的组件字符串是 shown in lowercase 但在记录时它们是 appear to be uppercase 的详细信息。


    回到带有这个附加上下文的原始问题,如果我们稍微收紧措辞,所描述的行为与记录的行为是一致的。我假设关于“分析慢查询" 只是关于在日志文件中捕获慢查询。如果是这样,那么:

    使用分析级别 1 和详细级别 0 时不会记录任何内容

    如果执行的所有查询也低于slowms 阈值(默认为100ms),这是正确的。

    使用分析级别 1 和详细级别 1,所有查询都会被记录为慢,即​​使 durationMillis 低于 slowms

    不清楚详细级别 1 和更高级别是否会自动将所有查询记录为慢。

    根据前面引用的文档或Logging Slow Operations section here,这也是正确的,它简洁地指出“如果客户端操作(例如查询)的持续时间超过慢速操作阈值或日志详细级别为1 或更高,则会出现在日志中。"

    【讨论】:

      猜你喜欢
      • 2016-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-29
      相关资源
      最近更新 更多