ArangoDB-aysnchronize-log过多地调用msync

时间:2016-04-20 06:13:05

标签: arangodb

以下是问题:为什么Arango在异步模式下一秒钟内数千次同步数据?这是我错误的配置还是预期的行为?

最近我正在测试ArangoDB和MongoDB的异步插入。在我的测试中,Arango的平均延迟是MongoDB的2倍。调整后我发现他们的IO不同。我认为这是Arango的池async-inert perf的根本原因 Arango :连续调用msync,一秒钟内调用千次,如下所示。这导致了太多的iowait和太多的jbd2。

05:42:21.138119 msync(0x7f50fdd75000, 4096, MS_SYNC) = 0 <0.000574>
05:42:21.138843 msync(0x7f50fdd75000, 8192, MS_SYNC) = 0 <0.000558>
05:42:21.139541 msync(0x7f50fdd76000, 4096, MS_SYNC) = 0 <0.000351>
05:42:21.139928 msync(0x7f50fdd76000, , MS_SYNC) = 0 <0.000555>
05:42:21.140532 msync(0x7f50fdd77000, 4096, MS_SYNC) = 0 <0.000318>
05:42:21.141002 msync(0x7f50fdd77000, 8192, MS_SYNC) = 0 <0.000714>
05:42:21.141755 msync(0x7f50fdd78000, 4096, MS_SYNC) = 0 <0.000345>
05:42:21.142133 msync(0x7f50fdd78000, 4096, MS_SYNC) = 0 <0.000725>

Mongo :在一秒钟内多次调用fdatasync。

测试环境:
所有测试都在一个VM中:8vCPU-24GBMem-120GBDisk-Centos6.7
它是基于带有ycsb的java驱动程序的单线程异步插入测试 为Arango设置:
v2.8.7
服务器,调度程序,v8-cs的线程都设置为1 使用false waitForSync创建集合,使用false waitForSync发送插入请求 开始cmd:

/usr/sbin/arangod --uid arangodb --gid arangodb --pid-file /var/run/arangodb/arangod.pid --temp-path /var/tmp/arangod --log.tty  --supervisor --wal.sync-interval=1000

收集属性:

{ 
  "doCompact" : true, 
  "journalSize" : 33554432, 
  "isSystem" : false, 
  "isVolatile" : false, 
  "waitForSync" : false, 
  "keyOptions" : { 
    "type" : "traditional", 
    "allowUserKeys" : true 
  }, 
  "indexBuckets" : 8 
}

详细的跟踪日志:

2016-04-19T06:59:36Z [12065] TRACE [arangod/Wal/SynchronizerThread.cpp:213] syncing logfile 6627612014716, region 0x7ff9beef3318 - 0x7ff9beef37f2, length: 1242, wfs: false
2016-04-19T06:59:36Z [12065] TRACE [arangod/Wal/SynchronizerThread.cpp:213] syncing logfile 6627612014716, region 0x7ff9beef37f8 - 0x7ff9beef3cd2, length: 1242, wfs: false
2016-04-19T06:59:36Z [12065] TRACE [arangod/Wal/SynchronizerThread.cpp:213] syncing logfile 6627612014716, region 0x7ff9beef3cd8 - 0x7ff9beef41b2, length: 1242, wfs: false
2016-04-19T06:59:36Z [12065] TRACE [arangod/Wal/SynchronizerThread.cpp:213] syncing logfile 6627612014716, region 0x7ff9beef41b8 - 0x7ff9beef4692, length: 1242, wfs: false
2016-04-19T06:59:36Z [12065] TRACE [arangod/Wal/SynchronizerThread.cpp:213] syncing logfile 6627612014716, region 0x7ff9beef4698 - 0x7ff9beef4b72, length: 1242, wfs: false
2016-04-19T06:59:36Z [12065] TRACE [arangod/Wal/SynchronizerThread.cpp:213] syncing logfile 6627612014716, region 0x7ff9beef4b78 - 0x7ff9beef5052, length: 1242, wfs: false
2016-04-19T06:59:36Z [12065] TRACE [arangod/Wal/SynchronizerThread.cpp:213] syncing logfile 6627612014716, region 0x7ff9beef5058 - 0x7ff9beef5532, length: 1242, wfs: false

1 个答案:

答案 0 :(得分:1)

作为多模型数据库的ArangoDB可以提供比MongoDB更多的用例。虽然它可以作为替代品,但其他可用功能也意味着对默认配置设置和实现细节的不同要求。

当您使用图表并希望保持其中的持久性时,您可以通过执行更频繁的同步来更改实际丢失数据的概率。 ArangoDB在另一个线程中执行这些同步;在尝试重现您的设置时,我们发现这个线程实际上不止一个人认为/etc/arangodb/arangod.conf中的sync-interval configuration value

[wal]
sync-interval=10000

我们解决了这个问题;通过foxx或arangod救援控制台(如果你没有使用--console参数以守护进程方式启动它,你可以获得一点点改善性能)

然而,当使用arangosh顺序插入10 k文件时,它并没有显着改变性能:

var time= require("internal").time;
var s = time()
db._drop('test')
db._create('test')
for (i=0; i < 100000; i++) {db.test.save({i: i})}
require("internal").print(time() -s)

一般来说,你的号码are similar to those in our performance comparison - 这就是ArangoDB 2.8的预期。

目前,您可以使用the bulk import facility来减少HTTP通信中的开销。