空きメモリの確保の仕方(メモリーチューニング)(kernel2.6)

linux kernel2.6 での メモリーチューニングの方法。大容量物理メモリの場合、ほとんどがページキャッシュ・ファイルキャッシュ。

必要な処置

?A.早めにダーティーページを掃除させる

?B.できるだけスワップさせない

?C.最低空き容量を大きくする。

? →ファイルキャッシュがたまらない

?  →1つのプロセス分の空きメモリを空けていれば、プロセス起動時にスワップしない。

?   →メモリが必要になった瞬間の、スワップによるスローダウンが防げる

A.早めにダーティーページを掃除させる

?pdflushがダーティーページの掃除を行う

? vm.dirty_ratio > ダーティーページの割合 > vm.dirty_background_ratio

? のときpdflushがバックグラウンドで掃除

? ダーティーページの割合 > vm.dirty_ratio

? のときdflushがフォワグラウンドで掃除
 なので、vm.dirty_ratio vm.dirty_background_ratioの値を小さくすれば
 こまめに掃除をし、メモリが空く可能性がある。
 (メモリが必要になったときに、一括で長時間スローダウンすることが
   防げる可能性がある)

 しかし、これだけではダーティーページだけでページキャッシュは開放されない
B.最低空き容量を大きくする。

?空きメモリ容量が vm.min_free_kbytes を下回ったとき
 ページキャッシュは開放される。

  vm.min_free_kbytesの値を大きくすれば、
  ページキャッシュの総量を減らせる。

 極端な話、アプリで最大300MBメモリを使用するなら、
 この値を307200(=300MB*1024)にしておけばスワップしない(バッファキャッシュがあるぞとかスワップアウトのアルゴリズムが・・・とか細かいことは抜きして)



C.できるだけスワップさせない

?vm.swappiness を減らせばスワップしにくくなる。
  (何かのパーセンテージらしい・・・)



[追記]
/proc/sys/vm/drop_caches に値を放り込めば、
キャッシュが即時開放されるらしい(Kernel2.6.16 以降(CentOS5/RHEL5以降))
echo "3" >  /proc/sys/vm/drop_caches
1・・・ページキャッシュのみを解放
2・・・ダーティページとinodeキャッシュを解放
3・・・ ページキャッシュとダーティページとinode

を解放
実行前にsyncを実行したほうがいいらしい。

2はいいとして、1と3をしたら直後にパフォーマンス悪くなりそう・・・
(コマンドを実行するごとにメッセージファイルを読みにいったりしてるの知ってますか?)

kernel2.4の頃みたいに直接キャッシュサイズを指定できたらここまで悩まんでもいいのに・・・


					

ディスク使用率

コマンド

iostat -d -x 3

ビジーの基準

  • %util が 100%に近ければビジー
  • svctm 50(ミリ秒)以上
  • 平均I/O要求サイズ(avgrq-szフィールド) 平均待機時間(awaitフィールド)が高いとI/O待ちの可能性

平均サービス時間(svctmフィールド)

iostat 秒数 測定回数
avg-cpu: %user %nice %sys %idle

出力項目の説明

  • AIX版 iostat

Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn

  • %user—アプリケーション使用率
  • %nice—
  • %sys—カーネルのCPU使用率
  • %idle—CPUの未使用率
  • tps—
  • Blk_read/s—ディスクの読み込み量(ブロック/秒)
  • Blk_wrtn/s—ディスクの書き込み量 Blk_read—ディスクの読み込み総量(ブロック)
  • Blk_wrtn—ディスクの書き込み総量
  • linux版 iostat -xの項目説明

Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s avgrq-sz await svctm%util

  • rrqm/s—秒毎にマージされた読み込み要求数
  • wrqm/s—秒毎にマージされた書き込み要求数
  • r/s—読み込み要求数/秒 w/s—書き込み要求数
  • rsec/s—読み込みセクタ数/秒
  • wsec/s—書き込みセクタ数/秒
  • rkB/s—読み込み量(KB)/秒
  • wkB/s—書き込み量(KB)/秒
  • avgrq-sz—I/O要求の平均サイズ(セクタ)
  • avgqu-sz—I/O要求の平均待ち数
  • await—I/O要求の平均待ち時間(ミリ秒)
  • svctm—I/O要求の平均処理時間(ミリ秒)
  • %util—I/O要求におけるCPU消費量(%)