tsalakh ain sus noam Huyah ol guf

勉強会のメモ。その他備忘録。参考にさせて頂いたサイトや資料はリンクさせて頂いていますが不都合があればご連絡ください。

【技術メモ】「正しい」メモリ使用率の考え方

正しいメモリ使用率の考え方

本当に知りたいのは、「現在プロセスがつかんでいるメモリのうち、実メモリのサイズ」

Linuxでいうと?

「Used - ( Cache + Buffer )」のこと

メモリ関連のコマンドの見方

  • top
    • VIRT
    • RES
      • 物理メモリに割り当てられた領域
    • SHR
      • 他のプロセスからも共有されている可能性がある領域
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
  • ps aux
    • VSZ
    • RSS
      • 物理メモリに割り当てられた領域
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
  • Memory

    • Available Mbytes
      • 物理メモリの空きサイズ
      • これが足りないとスラッシングになってしまい、激しくパフォーマンスが低下する
    • Pages/sec
      • ハード ページフォルトを解決するためにディスクとの間で読み書きされるページ数
      • (ハードページフォルトは、プロセスにおいて必要なデータをディスクから取得しなければならないときに発生)
      • Memory: Pages Input/sec と Memory: Pages Output/sec との合計

RHELについて、ちゃんとまじめに考えてみる

  • 何を持って、「メモリが空いている」とするのか??
    • 単純に考えると、何も利用していない(割り当てていない)領域を空き容量とすればいい
    • しかし現在のOSは、「使えるメモリはとことん使え」という設計思想
    • 空きメモリは積極的にファイルキャッシュ用途に利用されてしまう
  • 着目するのは、メモリ解放のカーネルの挙動

    • カーネルはプロセスやドライバから新規メモリの要求があった時、未使用領域(freeコマンドやmeminfoで言うところのfree領域)から割り当てる
    • 未使用領域が無い場合、既存のメモリを解放して空きを作って割り当てる
    • この「既存メモリの解放処理」に2通りのやり方があり、一つはスワップアウトする、もう一つはディスク同期してメモリ解放する
  • サーバ用途のメモリ設計を考えると、「可能な限りスワップを発生させない」ことが重要

    • 特にオンライン系のサーバの場合、スワップインによるクライアントへのレスポンス遅延が一番気になる
    • 例えば通常1秒以内でレスポンスが帰っている処理が数秒や最悪十数秒に伸びる
  • ということで、メモリ空き容量を評価する上は、「スワップが発生しない程度」の空きが保たれていることが重要

  • 結果として「未割当て領域+ディスク同期による解放領域」を空きと見なすという考えになる

  • ここまでの話を、式にまとめると以下のような形になります。

    • メモリの空き容量
      • = 未割り当て容量(free) + ディスク同期にて解放可能な容量(ファイルページ≒バッファ&キャッシュ)
    • メモリ利用容量
      • = メモリ合計容量 - メモリ空き容量
      • = メモリから解放不可な容量 + 解放時にスワップアウトしてしまう容量

参考URL