同期書き込み
システムコールの本を読んでいると、writeシステムコールは
同期書き込みが行えるようです。やりかたはファイルを open
するときのフラグ引数に O_SYNCをつけるだけです。
O_SYNCをつけた同期と、非同期書き込みで最後にfsyncで
ディスクに書き出すプログラムの時間差を比べてみました。
上がO_SYNC, 下が fsyncによるものです。
ファイルサイズは 4MBとしました。
#include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #define BUF_SIZE 4096 #define WRITE_LIMIT ((0x1 << 22)) int main (int argc, char *argv[]) { int fd, sum, r; char buf[BUF_SIZE]; if (argc < 2) { fprintf(stderr, "Usage write_sync file_name\n"); return -1; } fd = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC | O_SYNC, 0644); if (fd < 0) { fprintf(stderr, "Can't open file : %s\n", argv[1]); return -1; } memset((void*)buf, 0, BUF_SIZE); sum = 0; while ( (r = write(fd, buf, BUF_SIZE)) >= 0 ) { sum += r; if (sum >= WRITE_LIMIT) { break; } } r = close(fd); if (r < 0) { fprintf(stderr, "Can't close file\n"); return -1; } return 0; }
timeコマンドの結果は以下のようになりました。
(O_SYNC) write_sync tmp.txt 0.00s user 0.10s system 27% cpu 0.364 total (fsync) write_nosync tmp.txt 0.00s user 0.01s system 15% cpu 0.098 total
4MBのサイズで約3.7倍の差となりました。
本によると大事なところでもそのつど fsyncなり fdatasyncをした方がよい
とありましたけど、その通りの結果という感じですね。常に電源が落ちるかも
という可能性のときは O_SYNCというぐらいなんですかね?
- 作者: Robert Love,ロバートラブ,千住治郎
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/04/16
- メディア: 大型本
- 購入: 5人 クリック: 181回
- この商品を含むブログ (29件) を見る