この質問がプログラマー志向すぎる場合は、私に知らせてください。 Linux 2.6でのopen()システムコールのO_DIRECTフラグに精通している人はいないでしょうか。 Linusはその使用を軽蔑していますが、高性能のファイル書き込みはその使用を示しているようです。実際の経験と推奨事項について知りたいのですが。
詳細:
私が使用しているアプリケーションはします 独自のキャッシュを維持し、そうすることで平均5倍以上のスピードアップを達成します。ファイルに書き込むときは、キャッシュの内容をファイルシステムキャッシュに書き出す必要があります。これは冗長であり、パフォーマンス上の問題のようです。
承認された回答:
さて、あなたは経験を求めます、これは質問を少し主観的で議論の余地のあるものにしますが、まずまずです。
Linusは、人々が通常O_DIRECTに帰する用途を参照すると、それらの用途については、IMOLinusがほとんど正しいと述べました。ダイレクトI/Oを実行する場合でも、デバイスとの間でデータを直接プログラムステートメントに転送することはできません。(プログラムまたはデバイスによって)いっぱいになり、システムコールを介して相手側に転送されるバッファが必要です。また、効率を上げるために、もう一度必要になった場合に備えて、今読んだものを読み直したくないでしょう。したがって、ある種のキャッシュが必要です…そして、カーネルがO_DIRECT、ページキャッシュなしで提供するのはまさにそれです!使ってみませんか?また、より多くのプロセスが同じファイルに同時にアクセスしたい場合にもメリットがあります。O_DIRECTでは災害になります。
そうは言っても、O_DIRECTには次のような用途があります。何らかの理由でブロックデバイスから直接データを取得する必要がある場合。パフォーマンスとは何の関係もありません。
パフォーマンスのためにO_DIRECTを使用している人は、通常、ページキャッシュアルゴリズムが不適切なシステム、POSIXアドバイスメカニズムがないシステム、または他の人が言ったことを無意識に繰り返すシステムから来ています。これらの問題を回避するために、O_DIRECTが解決策でした。 Linux、OTOHには、根本的な問題を修正する必要があるという哲学があり、根本的な問題は、ページのキャッシュで悪い仕事をしたOSでした。
マシンのメモリエラーを見つけるために、catの簡単な実装にO_DIRECTを使用しました。これは、O_DIRECTの有効な使用法の1つです。それはパフォーマンスとは何の関係もありませんでした。
関連:OpenVPN –ローカルアドレスでソケットバインドに失敗しました[AF_INET] IP:1194:要求されたアドレスを割り当てることができませんか?