log書き込みてすと

fdatasync(2) やっぱおそいよ。

timeは数回はかって最短のものをかいた。

$ wget http://static.nyaxtstep.com/misc/log.c
$ gcc -DALLOC_FALLOCATE -DSYNC_FDATASYNC log.c -o log_falc_dsync
$ gcc -DALLOC_FALLOCATE -DSYNC_SYNC_FILE_RANGE log.c -o log_falc_sfr

# ext2 
$ sudo mkfs.ext2 -b 4096 -E stride=32,stripe-width=32 /dev/sdd1
$ sudo mount /dev/sdd1 /work/ssd -onoatime

$ time ./log_falc_sfr ~/work/ssd/logtest 10000
real	0m2.499s user	0m0.000s sys	0m0.132s
$ time ./log_falc_dsync ~/work/ssd/logtest 10000
real	0m2.923s user	0m0.004s sys	0m0.136s

# ext4 (journal遅延書き込み)
$ sudo mkfs.ext4 -b 4096 -E stride=32,stripe-width=32 /dev/sdd1
$ sudo mount /dev/sdd1 /work/ssd -odata=writeback,noatime,commit=30

$ time ./log_falc_sfr ~/work/ssd/logtest 10000
real	0m2.473s user	0m0.000s sys	0m0.128s
$ time ./log_falc_dsync ~/work/ssd/logtest 10000
real	0m3.186s user	0m0.000s sys	0m0.132s

blktraceログはこちら:http://static.nyaxtstep.com/misc/blktraces.tar.gz

ログをみてみたかぎり、このサンプルプログラムだとメタデータ部分への変更はfdatasync/sync_file_rangeともにしていない。
fdatasyncのほうが無駄にでかい領域をwriteしているようにみえるしこの辺が速度差か。

後このプログラムだとext2/4で差がないのに対し、開発中のログ構造化ストレージでは11倍ぐらいext4のが遅くなるのも謎。
追記: sync単位が4kか128kかの違いぽいですね。4k単位のfdatasyncをext4でやると超遅い。