web-dev-qa-db-ja.com

LinuxでのO_DIRECTの使用

この質問がプログラマー志向すぎる場合は、お知らせください。 Linux 2.6でのopen()システムコールのO_DIRECTフラグに精通している人がいるのでしょうか。 Linusはその使用を非難していますが、高パフォーマンスのファイル書き込みはその使用を示しているようです。実世界での経験と推奨事項について教えてください。

詳細:私が使用しているアプリケーションdoesは独自のキャッシュを維持します。そうすることで、平均で5倍以上のスピードアップが達成されます。ファイルに書き込む場合、キャッシュの内容をファイルシステムキャッシュに書き出す必要があります。これは冗長でパフォーマンスの問題のようです。

24
casualunixer

わかりました、あなたは経験を求めます、これは質問を少し主観的で議論の余地のあるものにしますが、まずまずです。

Linusは、人々が通常O_DIRECTに帰する用途に言及することを言った、そしてそれらの用途に関しては、IMO Linusがほとんど正しいと言った。直接I/Oを行う場合でも、デバイスとの間でデータを直接プログラムステートメントに転送することはできません。(プログラムまたはデバイスによって)満たされ、システムコールを介して相手側に転送されるバッファーが必要です。また、それを効率的にするために、もう一度必要になった場合に備えて、すでに読んだばかりの内容を再度読む必要はありません。したがって、ある種のキャッシュが必要です...そして、ページキャッシュであるO_DIRECTなしでカーネルが提供するものです!なぜそれを使わないのですか?より多くのプロセスが同じファイルに同時にアクセスしたい場合には、O_DIRECTによる障害となる利点もあります。

そうは言っても、O_DIRECTには用途があります。何らかの理由でブロックデバイスから直接データを取得する必要がある場合。パフォーマンスとは関係ありません。

パフォーマンスのためにO_DIRECTを使用している人々は、通常、不良ページキャッシュアルゴリズムを使用しているシステム、またはPOSIXアドバイスメカニズムのないシステム、または他の人々の発言を不注意に繰り返す人々です。これらの問題を回避するために、O_DIRECTが解決策でした。 Linux、OTOHには、実際の根本的な問題を修正する必要があるという哲学があり、根本的な問題は、ページキャッシングでうまく機能しないOSでした。

私はO_DIRECTを使用しました マシンのメモリエラーを見つけるための猫の簡単な実装。これは、O_DIRECTの有効な使用法の1つです。それはパフォーマンスとは何の関係もありませんでした。

17
Juliano

実際、O_DIRECTisのいずれかを回避するために必要

  • キャッシュ汚染—たとえば、キャッシュのオーバーヘッドに意味がないことを知っていることがあります。 g。本当に大きなファイルを扱うときは、64 GiB RAMが2つしかない場合GiB RAMの場合。32の急流ファイルGiBユーザーが確認することを決定したものは、キャッシュに適した候補ではないようです。これは、独自のオーバーヘッドを伴う追加のアクティビティであり、実際に役立つデータがキャッシュから削除される可能性があります。
  • ダブルキャッシング— eの場合。 g。一部のRDBMS(言及するためのMySQL)では、独自のキャッシュを定義できます。データベースは、SQLの計画などについて何も知らないカーネルの仮想メモリよりも、キャッシュの方法と内容をよく知っていると思われます。

—見たところ、これは良くありません。そしてO_DIRECTは速くなることを意味していません多くの場合、速くありません

14
poige

O_DIRECTは、新しいファイルシステムの新しいカーネルでは失敗する可能性があります。たとえば このバグレポート を参照してください。そのため、使用方法が疑わしいことが多いだけでなく、次世代のLinuxディストリビューションではまったく機能しない可能性があります。そのため、たとえコードにメリットがあることを証明できたとしても、コードのパフォーマンスに賭けることはしません。

6

@ジュリアーノがすでに言ったことに関連して。

チェックアウト posix_fadvise実際の問題が基礎となるファイルシステムのキャッシュアルゴリズムの動作に問題がある場合は、ファイルシステムをどのように使用するかについてアドバイスを与えることができます。うまく実装されたfsの場合、パフォーマンスが向上するはずです。 (これは、同様の考慮事項に触れる別のトピックへのリンクです https://stackoverflow.com/a/3755818/544721

それはパフォーマンスと関係があります。

興味深い例は、mmapエンジンを使用したmongodbです。他の人が述べたように、しばらくの間データが読み取られる可能性が低い場合、O_DIRECTを使用するのが最適です。 mongodbでは、データベースジャーナルはO_DIRECTを使用して書き込まれますが、データとインデックスの書き込みはページキャッシュメカニズム(pdflush)によって処理されます。予期しない停止(カーネルパニック、ディスクまたは電源障害)。 O_DIRECT書き込みが不揮発性ストレージにコミットされる前にまだバッファリングがあることに注意してください。これにより、データの損失が減少します。

O_DIRECTのもう1つの重要な機能は、書き込みのsequenceをより詳細に制御できることです。繰り返しになりますが、書き込みの順序は保証されません(不揮発性のキャッシュディスクコントローラーがあり、fifoスケジューラーを使用している場合を除きますが、これらには独自の問題があります)。したがって、mysqlはそのデータ/インデックスとジャーナリングにO_DIRECTを使用しますが、後者は通常最初にコミットされることを期待できます。

ただし、O_DIRECTはリソース割り当ての公平性を損なうことを覚えておくことが重要です。アプリケーションが高速化する理由の1つは、他のものが遅くなることです。

3
symcbean