次のコラム Linux システム チュートリアル では、Linux ディスク キャッシュに関する関連知識を紹介および要約します。必要としている友人の役に立てば幸いです。
まえがき
最近ディスク関連のオンライン障害に遭遇したので、Linuxのディスクキャッシュに関する知らなかった知識をまとめておきたいと思います。ずっと前のこと。
一般に、ディスク キャッシュが登場する理由はおそらく 2 つあります。1 つ目は、ディスクへのアクセス速度がメモリへのアクセス速度よりもはるかに遅いことです。アクセス速度はキャッシュによって改善できます。 2 つ目は、プログラムの局所性の原則に従って、データが一度アクセスされると、短期間で再びアクセスされる可能性が高いため、ディスクの内容をメモリにキャッシュすることで、パフォーマンスを向上させることができます。プログラムの実行速度。
局所性の原則
プログラムの局所性の原則: プログラムは実行時に局所性ルールを示します。つまり、一定期間内でのプログラム全体の実行は、番組の一部に限定されます。これに応じて、実行によってアクセスされる記憶空間も特定のメモリ領域に限定され、具体的には、局所性には通常、時間的局所性と空間的局所性の 2 つの形式があります。
時間的局所性: 一度参照されたメモリ位置は、将来複数回参照されます。
空間的局所性: 記憶場所が参照されると、将来的にはその近くの場所も参照されます。
ページ キャッシュ
ディスク上の IO 操作を減らすために、Linux システムは開いているディスクの内容をキャッシュします。キャッシュの場所は物理メモリです。ディスク アクセスをメモリ アクセスに変換し、プログラムの速度を効果的に向上させます。 Linux のキャッシュ方法では、物理メモリを使用してディスク上のコンテンツをキャッシュします。これはページ キャッシュと呼ばれます。
ページ キャッシュはメモリ内の物理ページで構成され、その内容はディスク上の物理ブロックに対応します。ページ キャッシュのサイズは、システムの空きメモリ サイズに応じて動的に調整され、メモリを占有してサイズを拡大したり、メモリ使用量の負担を軽減するために自ら縮小したりすることもできます。
仮想メモリ機構が登場するまで、オペレーティングシステムはブロックキャッシュ系を採用していましたが、仮想メモリの登場後は、オペレーティングシステムがIOをより細かく管理するようになったために、ページキャッシュ機構が採用されました。ページ キャッシュはページに基づいており、ファイル指向のキャッシュ メカニズムです。
ページ キャッシュの読み取り
Linux システムがファイルを読み取るときは、まずページ キャッシュからファイルのコンテンツを読み取ります。ページ キャッシュが存在しない場合は、システムは、まずファイル コンテンツをディスクから読み取ってページ キャッシュに更新し、次にファイル コンテンツをページ キャッシュから読み取って返します。
一般的なプロセスは次のとおりです。
プロセスは、ライブラリ関数 read を呼び出して、ファイル読み取りリクエストを開始します。
カーネルは、開いているファイルのリストをチェックし、ファイル システムによって提供される読み取りインターフェイスを呼び出します。
ページ キャッシュへの書き込み
ページ キャッシュが存在するため、プロセスが write を呼び出すと、ファイルへの更新はページ キャッシュにのみ書き込まれます。ファイルを削除し、対応するページをダーティとしてマークすると、プロセス全体が終了します。 Linux カーネルは、定期的にダーティ ページをディスクに書き込み、ダーティ フラグをクリアします。
書き込み操作では変更がページ キャッシュに書き込まれるだけなので、ディスク IO が発生するまでプロセスはブロックされません。この時点でコンピューターがクラッシュすると、書き込み操作の変更がディスク上で発生しない可能性があります。 。したがって、データ システムなど、厳密な要件を持つ一部の書き込み操作では、fsync やその他の操作を積極的に呼び出して、ディスクへの変更を適時に同期する必要があります。読み取り操作は異なります。通常、読み取りは、プロセスがデータを読み取るまでブロックされます。読み取り操作の遅延を減らすために、Linux システムは引き続き「事前読み取り」テクノロジを使用します。つまり、ディスクからデータを読み取るときに、カーネルはさらに多くのページをページ キャッシュに読み込みます。ライトバック スレッド
ページ キャッシュのライトバックは、カーネル内の別のスレッドによって完了します。ライトバック スレッドは、次の 3 つの状況でライトバックを実行します。次のように記述します。
空きメモリがしきい値を下回った場合。空きメモリが不足している場合は、キャッシュの一部を解放する必要がありますが、解放できるのはダーティでないページのみであるため、すべてのダーティ ページをディスクに書き戻して、リサイクル可能なクリーン ページに変える必要があります。バージョン | 説明 | |
---|---|---|
バージョン 2.6 より前 | #bdflush カーネル スレッドはバックグラウンドで実行されます。システムには bdflush スレッドが 1 つだけあります。メモリ消費量が特定のしきい値を下回ると、bdflush スレッドが起動されます。 kupdated は定期的に実行され、ダーティ ページを書き戻します。ただし、bdflush スレッドはシステム全体で 1 つだけであるため、システムのライトバック タスクが重い場合、bdflush スレッドが特定のディスクの I/O でブロックされ、他のディスクの I/O ライトバック操作が実行できなくなる可能性があります。時間内に実行されました。 | |
バージョン 2.6 で導入 | pdflush スレッドの数は動的であり、システムの I/O 負荷に依存します。これは、システム内のすべてのディスクに対するグローバル タスクです。ただし、pdflush はすべてのディスクを対象としているため、混雑したディスク上で複数の pdflush スレッドがすべてブロックされる可能性があり、これにより他のディスクの I/O ライトバックが時間内に実行されなくなることもあります。 | |
バージョン 2.6.32 以降に導入 | フラッシャー スレッドの数は一意ではなく、フラッシャー スレッドはすべてのスレッドに向けられているわけではありません。ただし、各フラッシャー スレッドはディスクに対応します。 |
ページ キャッシュの置換ロジックは、次のとおりです。 Linux は変更された LRU 実装であり、デュアルチェーン戦略としても知られています。以前とは異なり、Linux は 1 つの LRU リンク リストを維持するのではなく、アクティブ リンク リストと非アクティブ リンク リストという 2 つのリンク リストを維持します。アクティブ リスト上のページは「ホット」とみなされ、スワップアウトされませんが、非アクティブ リスト上のページはスワップアウトできます。アクティブ リスト内のページは、アクセスされるときに非アクティブ リストにある必要があります。どちらのリンク リストも疑似 LRU ルールによって維持されます。つまり、キューと同様に、ページは末尾から追加され、先頭から削除されます。 2 つのリンク リストのバランスをとる必要があります。アクティブなリンク リストが大きくなりすぎて非アクティブなリンク リストを超える場合、アクティブなリンク リストの先頭ページは非アクティブなリンク リストに戻され、そこで再びリサイクルできます。ダブル リンク リスト戦略は、従来の LRU アルゴリズムにおけるアクセスが 1 つだけというジレンマを解決します。また、擬似 LRU セマンティクスの実装も容易になります。このダブル リンク リスト方式は LRU/2 とも呼ばれます。より一般的なのは n 個のリンク リストであるため、LRU/n と呼ばれます。
[推奨学習: 「
linux ビデオ チュートリアル まとめ今回発生したオンライン障害の根本的な原因一時ファイルはビジネス ロジックのキャッシュに使用されるということです。一時ファイルが作成されてから短期間に削除された場合、ファイルに対する操作はページ キャッシュ内で実行され、実際にはページ キャッシュに書き戻されません。ディスクです。プログラムで問題が発生し、その応答が遅くなると、一時ファイルの存続時間が長くなり、一時ファイルがディスクに書き戻され、過剰なディスク圧力が発生してシステム全体に影響を与える可能性があります。
以上がLinuxのディスクキャッシュに関する知識をまとめます。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。