Red Hat Training

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

A.3. fsync

Fsync I/O の高い操作と呼ばれますが、これは完全には当てはまるわけではありません。
ユーザーがリンクをクリックして新しいページに移動するたびに sqlite ライブラリーを呼び出すために使用される Firefox fsync 呼ばれ、ファイルシステム設定(主にデータ順モードの ext3)が原因で、何も発生しなかった場合に長いレイテンシーがありました。別のプロセスが同時に大きなファイルをコピーしている場合、これには長い時間がかかる可能性があります(最大 30 秒)。
ただし、fsync がまったく使用されていない他のケースでは、ext4 ファイルシステムへの切り替えで発生した問題がありました。Ext3 は data-ordered モードに設定されており、数秒ごとにメモリーをフラッシュしてディスクに保存します。ただし、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");