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でやると超遅い。