ArangoDB-aysnchronize-log 调用 msync 太多

ArangoDB-aysnchronize-log invokes msync too much

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

最近我正在测试 ArangoDB 和 MongoDB 的异步插入。在我的测试中,Arango 的平均延迟是 MongoDB 的 2 倍。调整后我发现他们的IO不一样。我认为这是 Arango 的 pool 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。

测试环境:
所有测试都在一个虚拟机中:8vCPU-24GBMem-120GBDisk-Centos6.7
它是基于 java 带有 ycsb 的驱动程序的单线程异步插入测试。
Arango 会议:
v2.8.7
Server、scheduler、v8-cs的threads都设置为1.
使用 false waitForSync 创建 collection,使用 false waitForSync 发送插入请求。
启动命令:

/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

Collection 属性:

{ 
  "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

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

当您使用图表并希望保持其中的持久性时,您可以通过更频繁的同步来改变实际丢失数据的概率。 ArangoDB 在另一个线程中进行这些同步;在尝试重现您的设置时,我们发现该线程实际上做的事情比 /etc/arangodb/arangod.conf:

中的 sync-interval configuration value 要多
[wal]
sync-interval=10000

我们解决了这个问题;当通过 foxx 或 arangod 救援控制台在本地写入时,它会稍微提高性能(如果你不使用 --console 参数在守护进程模式下启动它,你会得到)

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

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 通信的开销。