以下是问题:为什么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
答案 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通信中的开销。