fsync
カーネルのページキャッシュにある書き込みを、永続的なストレージへ強制的に書き出すシステムコール。これがないと、「保存した」はずのファイルはRAMに載っているだけで、電源が落ちれば消える。
通常の write() はデータがページキャッシュに入った時点で戻る。速いが、何も約束しない。fsync(fd) はディスクの確認まで待つため数ミリ秒かかり、データベースにコミット遅延がある理由そのものだ。fdatasync() はメタデータを省くぶん軽い。
古典的な落とし穴は二つ。ファイルを同期しても、ディレクトリエントリが新規なら、ディレクトリも同期しなければならない。また書き込みキャッシュを持つディスクは、バリアがないと、データが盤面に届いたと偽ることがある。さらに2018年、PostgreSQL の開発者は「fsyncgate」を発見した。Linux が書き戻し失敗後にエラーフラグを破棄するため、次の fsync はデータを失っているのに成功を返したのである。