巨大的插入物杀死了arangod(好吧,差不多)

时间:2015-02-04 13:25:05

标签: arangodb

我想知道有没有人遇到过这个:

通过AQL插入文档时,我可以轻松杀死我的arango服务器。例如

FOR i IN 1 .. 10
  FOR u IN users
    INSERT {
        _from: u._id,
        _to: CONCAT("posts/",CEIL(RAND()*2000)),
        displayDate: CEIL(RAND()*100000000)
    } INTO canSee

(用户包含500000个条目),发生以下情况

  • canSee变得完全锁定(也不再读取)
  • 内存消耗量上升
  • arangosh或web控制台变得无法响应
  • 失败[ArangoError 2001:无法连接]
  • 服务器仍在运行,访问集合会产生超时
  • 直到服务器恢复并且我可以再次访问该集合需要大约5-10分钟
  • 访问任何其他收藏品工作正常

好吧,我正在创建大量条目,而AQL可能会以批量执行的方式实现。通过db.save方法进行写入时,它可以工作但速度要慢得多。

此外,我怀疑这可能与预写缓存填充有关。

但是,有没有办法解决这个问题?将大量条目写入数据库不一定会将其删除。

日志说

DEBUG [./lib/GeneralServer/GeneralServerDispatcher.h:411] shutdownHandler called, but no handler is known for task

DEBUG [arangod/VocBase/datafile.cpp:949] created datafile '/usr/local/var/lib/arangodb/journals/logfile-6623368699310.db' of size 33554432 and page-size 4096

DEBUG [arangod/Wal/CollectorThread.cpp:1305] closing full journal '/usr/local/var/lib/arangodb/databases/database-120933/collection-4262707447412/journal-6558669721243.db'

最好成绩

1 个答案:

答案 0 :(得分:4)

上述查询将在单个事务中将5M文档插入ArangoDB。这将需要一段时间才能完成,并且在事务仍在进行时,它将在内存中保存大量(可能需要的)回滚数据。

此外,上述查询将首先构建要插入内存的所有文档,一旦完成,将开始插入它们。构建所有文档也会消耗大量内存。执行此查询时,您将看到内存使用量稳步增加,直到某些时候磁盘写入将在实际插入开始时启动。

至少有两种方法可以改善这种情况:

  • 将查询拆分为多个较小的事务可能会有所帮助。然后,每笔交易都不会像原始交易一样大,并且在进行中不会阻止那么多系统资源。

  • 对于上面的查询,
  • 在技术上并不需要首先将所有文档构建到内存中,然后才将它们全部插入。相反,从users读取的文档可能会在到达时插入canSee。这不会加快查询速度,但是在结果集的查询执行期间,它将显着降低内存消耗。它还将导致写入立即开始,从而提前开始写入日志收集。并非所有查询都符合此优化条件,但有些(包括上述内容)是。我今天在一个机制上工作,检测符合条件的查询并以这种方式执行它们。这一变化今天被推入了devel分支,并将随ArangoDB 2.5一起提供。