同期書き込み

システムコールの本を読んでいると、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というぐらいなんですかね?

Linuxシステムプログラミング

Linuxシステムプログラミング