
t0mmy
学習履歴詳細
Linuxのしくみ 増量改訂版 8章 記憶階層 読了
ポイント
- ダーティ状態
- キャッシュ戦略
- ライトスルー , ライトバック
学び
- レジスタの計算速度と、メモリアクセス速度は、数十倍違う
- 「キャッシュラインに変更があった」ことを、「ダーティである」「ダーティ状態」と表現する
- Simultaneous Multi Threading (SMT)
- ページキャッシュでファイルのデータを、バッファキャッシュでファイル以外のデータをキャッシュする
気づき
- 空間的局所性 の特徴を知っていれば、意図的にパフォーマンスを悪化させることが可能
- キャッシュ関連情報は、
sar
コマンドで大体取得できる - パフォーマンスが大幅なに低下した場合、ページキャッシュおよびメモリ I/O のスラッシングが原因の可能性がある
sar
コマンドでスラッシングの有無を特定できるようになると、トラブルシュートの幅が広がりそう
メモ
キャッシュメモリ
レジスタの計算速度と、メモリアクセス速度は、数十倍違う。
この差を埋めるのが、キャッシュメモリ。
cpuがキャッシュメモリを書き換えた場合、書き換えた情報をメモリにも伝える必要がある。
この時、メモリに情報を伝える方法には、以下の二つが存在する。
- ライトスルー方式 : 都度メモリに伝える
- ライトバック方式 : 所定のタイミングで、まとめてメモリに伝える
キャッシュメモリが一杯の時にデータ書き込みが発生する場合、キャッシュライン上のデータを一つ破棄する。
この破棄が頻繁に発生する状態をスラッシングと呼ぶ。スラッシング状態では、I/O性能が大幅に低下する。
階層型キャッシュメモリ
最近のCPU は、キャッシュメモリが階層化されている。
- 「L1キャッシュ」「L2キャッシュ」「L3キャッシュ」のように表現する
「L1キャッシュ」が、最もレジスタに近い。
階層の番号が増えるほど、レジスタから遠のき、大容量/低速 になる。
Simultaneous Multi Threading (SMT)
一つのCPUで複数スレッドを同時実行することで、疑似的な対照型マルチプロセッシング環境を構築できる技術。
待機中(≒空き)のCPUリソースを有効活用する手段の一つ。
同時実行するスレッドにて、リソースの競合が発生しない場合、非常に高い効果を得ることが出来る。
ページキャッシュ
(ストレージデバイスの)ファイルから読み込んだデータを、メモリ上にキャッシュする技術。
ページキャッシュ領域は、カーネルのメモリ上に存在する。
つまり、ページキャッシュは、カーネル上で動作する。
仕組みはキャッシュメモリとほぼ同じ。
ページキャッシュでは、名前の通り、ページ単位でデータを扱う。
ページキャッシュの導入により、ストレージデバイスへの I/O 速度向上が期待できる。
/proc/sys/vm/drop_caches
に3 を書き込むことで、ページキャッシュをクリアできる。
ページキャッシュをクリアすることで、「パフォーマンスの悪化の原因はページキャッシュか切り分ける」といった使い方が可能。
バッファキャッシュ
ファイルデータ以外のデータをキャッシュする仕組み。
以下のようなときに使用する。
- ファイルシステムを使用せずに、デバイスファイルを用いてストレージデバイスに直接アクセスするとき
- ファイルサイズやパーミッションといった、メタデータにアクセスする時
ページキャッシュにおける ライトバック処理のタイミング
※ライトバック : 変更のあったデータを、一定のタイミングでまとめて書き出す処理
ページキャッシュのライトバック処理は、以下のタイミングで動作する。
- 周期的。デフォルトでは5sに一回
- 周期は、
syctl
のvm.dirty_writeback_centisecs
で変更可能 - 「0」は、ライトバック処理を無効化する設定
- 周期は、
- ダーティページが増えてきたとき
- 物理メモリの内、ダーティページの占める割合が、特定の値を上回ると動作
- デフォルトは10%
- 割合は、
vm.dirty_backgroud_ratio
パラメータで変更可能 - 割合ではなく、バイト単位による指定も可能
Dicect I/O
以下のような、ページキャッシュを動作させたくないような場合は、「Direct I/O」という仕組みを使用する。
- 一度しか読み書きしないデータ
- プロセスが、自分でページキャッシュ相当の仕組みを実装したい場合
ファイルの Open 時に、 O_Direct
フラグを立てることで、「Direct I/O」を使用できる。
統計情報
sar -r
コマンドで得られる、キャッシュ回りの統計データについてまとめる。
フィールド名 | 意味 |
---|---|
kbmemfree | 空きメモリの量(KiB)ページキャッシュ、バッファキャッシュ、スワップ領域はカウントしない |
kbavail | 事実上の空きメモリ量(KiB) kbmemfree + kbbuffers + kbcached |
kbbuffers | バッファキャッシュの量(KiB) |
kbcached | キャッシュメモリの量(KiB) |
kbdirty | ダーティなページキャッシュとバッファキャッシュの量(KiB) |
sar -B
コマンドにて、ページイン、ページアウト情報が取得できる。
swapon --show
コマンドにて、スワップ領域の容量などを確認できる。
sar -S
コマンドにて、スワップ領域の利用状況を確認できる。
スワップ領域の使用量を示す %swpused
の値を注視しよう。
2023年04月23日(日)
1.5時間