2015-05-19 35 views
0

我正在调查arangodb中的性能问题。我注意到它在执行某些AQL时会执行大量的I/O(特别是读操作)。我在脑海中有以下问题:在arangodb中运行AQL时的高I/O

  1. 什么是实际加载到物理内存。是预写日志文件,数据文件还是日记本
  2. 如果我假设所有3都已加载,那么为什么在读数据时应该有一个I/O
  3. AQL在Journal/datafile上运行,或者它需要write-也提前记录文件数据。
  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]]“

回答

2

ArangoDB将上述内容全部保留在内存中,并且AQL会考虑所有已写入并提交到数据库的内容,而不管它是否仍驻留在写入或不是。

您的系统是否有可能用完主内存来映射所有这些数据?这可能解释了高I/O

+0

编辑的问题,并把一个位的更多信息在底部 –

+0

输出的iotop -u arangodb: 2320是/ 4 arangodb 10.69米/秒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]] –

+0

首先,是否加载了AQL查询所访问的所有集合?服务器启动或重新启动后,集合上的第一个查询可能会完全加载集合。这可能会第一次产生大量的I/O,但不会在查询重复后产生。另一个潜在的问题是在查询运行时,系统内存不足。然后I/O也可能增加很多。你可以为系统的整体内存使用量观看最高或其他来源? – stj

1

由于STJ提到

AQL查询,即使只读的,他们中间结果分配内存。 OS可能通过从arangod的集合数据文件中卸载页面来满足这些内存分配请求。当再次访问这些页面时,这可能会导致很多后续I/O,通过AQL查询本身或其他数据操作。无论是否发生这种情况都取决于操作系统和虚拟机配置,因此很难从这里得知

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