【技術メモ】「正しい」メモリ使用率の考え方
正しいメモリ使用率の考え方
本当に知りたいのは、「現在プロセスがつかんでいるメモリのうち、実メモリのサイズ」
Linuxでいうと?
「Used - ( Cache + Buffer )」のこと
メモリ関連のコマンドの見方
Tasks: 115 total, 1 running, 114 sleeping, 0 stopped, 0 zombie Cpu(s): 0.3%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 2041652k total, 1975180k used, 66472k free, 283688k buffers Swap: 2031608k total, 34644k used, 1996964k free, 1481516k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 3091 tomcat 20 0 284m 44m 14m S 0.3 2.2 10:09.82 java 1 root 20 0 2040 648 556 S 0.0 0.0 0:10.66 init 2 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root RT -5 0 0 0 S 0.0 0.0 0:00.00 migration/0
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 2040 648 ? Ss Mar19 0:10 init [3]
Windowsでいうと?
「パフォーマンスカウンタの[Process]の[Working Set]のトータルサイズ」のこと
パフォーマンスカウンタ
Process
- Private Bytes
- 実際にプロセスが必要としており、他のプロセスと共有できないサイズ
- そのプロセスがどれくらいメモリを消費するのかの一番の目安
- この項目はディスクにスワップされているページや物理メモリ上の領域を問わない
- Working Set
- Page Faults/sec
- Private Bytes
Memory
RHELについて、ちゃんとまじめに考えてみる
- 何を持って、「メモリが空いている」とするのか??
- 単純に考えると、何も利用していない(割り当てていない)領域を空き容量とすればいい
- しかし現在のOSは、「使えるメモリはとことん使え」という設計思想
- 空きメモリは積極的にファイルキャッシュ用途に利用されてしまう
着目するのは、メモリ解放のカーネルの挙動
サーバ用途のメモリ設計を考えると、「可能な限りスワップを発生させない」ことが重要
- 特にオンライン系のサーバの場合、スワップインによるクライアントへのレスポンス遅延が一番気になる
- 例えば通常1秒以内でレスポンスが帰っている処理が数秒や最悪十数秒に伸びる
ということで、メモリ空き容量を評価する上は、「スワップが発生しない程度」の空きが保たれていることが重要
結果として「未割当て領域+ディスク同期による解放領域」を空きと見なすという考えになる
ここまでの話を、式にまとめると以下のような形になります。
- メモリの空き容量
- = 未割り当て容量(free) + ディスク同期にて解放可能な容量(ファイルページ≒バッファ&キャッシュ)
- メモリ利用容量
- = メモリ合計容量 - メモリ空き容量
- = メモリから解放不可な容量 + 解放時にスワップアウトしてしまう容量
- メモリの空き容量