カーネルはページキャッシュをどのように使用しますか?

カーネルはページキャッシュをどのように使用しますか?

理解できないページキャッシュの問題があります。

私が理解しているように、ページキャッシュはディスクの読み取りと書き込みの両方でディスクキャッシュとして機能します。しかし、カーネルが10Gメモリページキャッシュを200GBディスクにマッピングする方法はわかりません。

読み取ると、カーネルはディスクから定期的に読み取るデータのみをキャッシュできますが、ディスクに書き込むと、カーネルがディスクに書き込む前にデータがメモリバッファに書き込まれます。

しかし、ディスクに書き込まれたデータが非常に大きい場合、どのようにメモリに十分なバッファリングがあるのでしょうか。

ベストアンサー1

通常、以下はsysctlこれらの操作を制御するカーネル/パラメータのリストです。

これに関する有用で有益なリソースはSUSEの記事にあります。メモリ管理サブシステムの調整。 SUSE Linux Enterprise Server 15 SP3用と記載されていますが、ほとんどのLinuxディストリビューションにも当てはまります(デフォルトは異なる場合があります)。

ページキャッシュ

ファイルデータキャッシュ。ディスクまたはネットワークからファイルを読み取ると、そのコンテンツはページキャッシュに保存されます。ページキャッシュのコンテンツが最新の場合、ディスクやネットワークアクセスは必要ありません。 tmpfs と共有メモリセグメントはページキャッシュから計算されます。

ファイルが書き込まれると、新しいデータはディスクまたはネットワークに書き戻される前にページキャッシュに保存されます(後書きキャッシュになります)。ページにまだ書き換えられていない新しいデータがある場合は、「ダーティ」と呼ばれます。ダーティとして分類されていないページは「クリーン」ページです。メモリが足りない場合は、クリーンページキャッシュページを解放して回収してください。ダーティページを回収するには、まず最初に消去する必要があります。

[...]

書き換え

アプリケーションがファイルに書き込むと、ページキャッシュが汚れたり、バッファキャッシュも汚れたりすることがあります。。ダーティメモリの量が指定されたページ数(バイトvm.dirty_background_bytes)に達した場合、ダーティメモリの量が総メモリの特定の割合に達した場合()vm.dirty_background_ratio、ページ寿命が指定された時間を超えた場合()vm.dirty_expire_centisecsカーネルは、ページが最初にダーティなファイルから始まり、ページの書き換えを開始します。。背景バイトと比率は相互に排他的であり、1つを設定すると他のものよりも優先されます。 Flusherスレッドはバックグラウンドで書き込み保存を実行し、アプリケーションを実行し続けることができます。 I / Oがアプリケーションがページキャッシュをダーティ化する速度に追いつくことができず、ダーティデータが重要な設定(vm.dirty_bytesまたはvm.dirty_ratio)に達すると、ダーティデータがこのしきい値を超えないようにアプリケーションが調整され始めます。

記事Linuxカーネルパラメータの紹介これについて良い説明があります。

これらのパラメータは、主にディスクのIO書き込みストレージ戦略を設定するために使用されます。

  • dirty_background_bytes/dirty_bytesおよびdirty_background_ratio/は、dirty_ratioそれぞれ「ダーティ」ページで埋めることができるシステムメモリの量と割合を表します。通常、比率が指定されます。
  • dirty_background_ratio:システムメモリのダーティページの割合を示します(デフォルトは10%)。このレートに達すると、バックグラウンドカーネルリフレッシュプロセスがディスクへの書き換えを開始します。
  • dirty_ratio:すべてがディスクにコミットされる前にダーティページで埋めることができる絶対最大システムメモリ量を示します。システムがこのポイントに達すると、ダーティページがディスクに書き込まれるまで、すべての新しいI / Oがブロックされ、I / Oが長時間一時停止します。システムはまず、vm.dirty_background_ratio フラッシュ・プロセスが非同期的に書き換えを開始し、アプリケーションが書き込みを続ける条件に達する。システムが指定された値に達すると、オペレーティングシステム vm.dirty_ratioはダーティページを同期的に処理してアプリケーションをブロックします。
  • vm.dirty_expire_centisecs:ダーティーページを書き込む前にキャッシュに保持できる期間を指定します。 1/100秒単位で表現されます。この間隔よりも長い間メモリに汚れたデータは、次にリフレッシュプロセスが起きたときに記録されます。
  • vm.dirty_writeback_centisecs: カーネルリフレッシュプロセスが起きる頻度を指定します。 1/100秒単位で表現されます。

これに関するもう一つの良い説明は、以下にあります。パラメータの書き換えSUSE 記事セクションメモリ管理サブシステムの調整上記ですでに述べた。

おすすめ記事