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 通信的开销。
问题来了:为什么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 通信的开销。