【问题标题】:High i/o while running AQL in arangodb在 arangodb 中运行 AQL 时出现高 i/o
【发布时间】:2016-05-25 04:58:34
【问题描述】:

我正在调查我遇到的 arangodb 中的性能问题。我注意到它在执行某些 AQL 时会执行繁重的 i/o(特别是读取操作)。我有以下问题:

  1. 实际加载到物理内存中的内容。是预写日志文件、数据文件还是日志
  2. 如果我假设所有 3 个都已加载,那么为什么在读取数据时应该有 i/o
  3. AQL 在日志/数据文件上运行,或者它还考虑预写日志文件数据。
  4. 如果它仅在日志/数据文件上运行,那么我们可能在预写文件中有新数据,但 aql 不会返回该数据

系统根本没有使用任何交换。但 AQL 运行时间仍在增加。有时运行需要高达 10 秒。我在 arangodb 上做了一个 iotop,我看到这个(见下文)特定的命令做了很多阅读。读取速度高达 15 mbps。

" 2320 be/4 arangodb 10.69 M/s 149.39 K/s 0.00 % 22.48 % arangod -c /etc/arangodb/arangod.conf --uid arangodb --gid arang~emp-path /var/tmp/arangod --log.tty --supervisor [[dispat_def]]"

【问题讨论】:

    标签: arangodb


    【解决方案1】:

    ArangoDB 将上述所有内容保存在内存中,AQL 会考虑已写入并提交到数据库的所有内容,无论它是否仍驻留在预写日志中。

    您的系统是否可能已用完主内存来映射所有这些数据?这可以解释高 i/o

    【讨论】:

    • 编辑了问题并在底部添加了更多信息
    • iotop -u arangodb 的输出:2320 be/4 arangodb 10.69 M/s 149.39 K/s 0.00 % 22.48 % arangod -c /etc/arangodb/arangod.conf --uid arangodb --gid arang~emp-path /var/tmp/arangod --log.tty --supervisor [[dispat_def]]
    • 首先,是否加载了 AQL 查询访问的所有集合?在服务器启动或重新启动后,对集合的第一个查询可能会完全加载集合。这可能会在第一次产生大量 I/O,但在之后重复查询时不会。另一个潜在问题是查询运行时系统内存不足。那么 I/O 也可能会增加很多。您可以查看系统整体内存使用情况的 top 或其他来源吗?
    • 是的,集合是在查询访问它们之前预加载的。我一直在看 i/o、cpu 和物理内存。物理内存使用率肯定约为 80%,但交换使用率仍为 0。CPU 使用率最高可达 75%。所以,我猜我仍然没有用完RAM。开始时的 i/o 很好,而且不多。这种性能滞后不是在启动时而是在运行 arangodb 超过 2 小时。
    • AQL 查询,即使是只读的,也会为其中间结果分配内存。操作系统可能通过从 arangod 的集合数据文件中卸载页面来满足这些内存分配请求。当再次访问这些页面时,无论是通过 AQL 查询本身还是对数据的其他操作,这可能会导致大量后续 I/O。这是否发生以及何时发生在很大程度上取决于操作系统和虚拟机配置,因此很难从这里判断。
    【解决方案2】:

    正如 stj 提到的

    AQL 查询,即使是只读的,也会为其中间结果分配内存。操作系统可能通过从 arangod 的集合数据文件中卸载页面来满足这些内存分配请求。当再次访问这些页面时,无论是通过 AQL 查询本身还是对数据的其他操作,这可能会导致大量后续 I/O。这是否以及何时发生在很大程度上取决于操作系统和虚拟机配置,因此很难从这里判断

    这是由于中间结果导致主内存耗尽的问题。

    【讨论】:

      猜你喜欢
      • 2020-02-21
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多