Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

A.3. fsync

Fsync I/O コストのかかる操作と呼ばれますが、これは完全に true ではありません。
ユーザーがリンクをクリックすると、新たなページに移動するたびに sqlite ライブラリーを呼び出すために使用される Firefoxfsync と呼ばれ、ファイルシステムの設定(主にデータ順モードを含む ext3)のために、何も生じなかったときのレイテンシーが長くなっていました。別のプロセスが同時に大きなファイルをコピーする場合は、時間がかかることがあります(最大 30 秒)。
ただし、fsync が全く使用されていないその他の状況では、ext4 ファイルシステムへの切り替えと共に問題が発生することがあります。ext3 は、データの順序付けモードに設定されました。このモードは、数秒ごとにメモリーをフラッシュし、これをディスクに保存しました。ext4 と laptop_mode では、保存の間隔が長くなり、システムが予期せずにオフされたときにデータが失われる可能性がありました。これで ext4 にはパッチが当てられますが、アプリケーションを慎重に設計することを検討し、必要に応じて fsync を使用する必要があります。
設定ファイルの読み取りと書き込みの簡単な例は、ファイルのバックアップの作成方法とデータが失われる方法を示しています。
/* open and read configuration file e.g. ./myconfig */
fd = open("./myconfig", O_RDONLY);
read(fd, myconfig_buf, sizeof(myconfig_buf));
close(fd);
...
fd = open("./myconfig", O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR);
write(fd, myconfig_buf, sizeof(myconfig_buf));
close(fd);
次のような適切なアプローチは以下のとおりです。
/* open and read configuration file e.g. ./myconfig */
fd = open("./myconfig", O_RDONLY);
read(fd, myconfig_buf, sizeof(myconfig_buf));
close(fd);
...
fd = open("./myconfig.suffix", O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR
write(fd, myconfig_buf, sizeof(myconfig_buf));
fsync(fd); /* paranoia - optional */
...
close(fd);
rename("./myconfig", "./myconfig~"); /* paranoia - optional */
rename("./myconfig.suffix", "./myconfig");