- CPU負荷
- メモリ負荷
の2種類があると話をしました。
どっちなのっていうのを知るためにどうすればいいかについて書きます。
top
$ top # CPU使用率順にソート
$ top -a # メモリ使用率順にソート
$ top -p [PID] # 特定のプロセスを監視
$ top -d1 # 1秒ごとに更新
やってみた。
まず、非常に重要な数値が
load average
これは、システム全体の負荷(メモリ、CPUに関わらず)を表す数値として認識してください。
つまり、もしこの数値が高ければ、サーバーを最適化することで、処理が高速になる。
この数値が低いのに、レスポンスタイムが遅いなどの問題があれば、ネットワーク負荷(トラヒック理論)など別の原因によるものになるので、最初に確認しましょう。
定義は以下です。
1CPUにおける単位時間あたりの実行待ちとディスクI/O待ちのプロセスの数
Linuxカーネルはプロセス1つごとにプロセスディスクリプタを持っていて、そのstateメンバにプロセスの状態を入れて管理している。
プロセスの状態は以下のように区別される。
- TASK_RUNNING: 実行可能な状態。CPUが空いていれば実行できる。
- TASK_UNINTERRUPTABLE: 割り込み不能な待ち状態。ディスクI/O待ちなど、短時間で復帰するもの。
- TASK_INTERRUPTABLE: 割り込み可能な待ち状態。ユーザの入力待ちなど、復帰時間が予測できないもの。
- TASK_STOPPED: 実行中断になった状態。リジュームされるまでスケジューリングされない。
- TASK_ZOMBIE: ゾンビプロセス。子プロセスがexitして親プロセスにwaitされていないもの。 run queueに入っているプロセスのうち、TASK_RUNNINGとTASK_UNINTERRUPTABLEのものがload averageとして換算される。
load average、つまりシステムの負荷とは、「CPUの実行権限が与えられるのを待っているプロセス」と「ディスクI/Oの完了を待っているプロセス」の多さのことである。
Tasks
実行してるプロセスの数がわかる。
TASK_RUNNINGの個数をかぞえあげる。
思ってる以上にプロセスが動いてたりしたら、
何が動いてんの?ってなるから、みておくといいかも。
%CPUs
左から
- users
- systems
- nice
- idle
- wait
- heardware
- software
- steal
CPU使用率がわかるので、100%に近くなっていたら、
負荷が大きすぎるとわかる。
その原因が
- user program
- system program
のどちらにあるのかがわかるので、チェックする必要がある。
Mem
3696.7 total, 1900.0 free, 226.4 used, 1570.3 buff/cache
Mem Swap
スワップの回数が多いと、
メモリに収まりきっていなくて、ストレージの方を頻繁に参照していることがわかる。
そのせいでI/O待ちが発生しているかどうかは、
load averageや sar
vmstat
を確認してください。
PR | NI | VIRT | RES | SHR | S | %CPU | %MEM | TIME+ |
---|---|---|---|---|---|---|---|---|
優先度 | 相対優先度 | 仮想メモリ | 物理メモリ | 共有メモリ | 状態 | CPU使用率 | メモリ使用率 | 実行時間 |
I/O待ち時間は非常に誤解を招きやすい指標だ。CPUを酷使するプロセスがほかにやってくると、I/O待ち時間の値は下がる。するべき仕事ができたので、CPUはアイドル状態で待っていなくてよいのである。しかし、I/O待ち時間の数値が下がっても、同じディスクI/Oがなくなったわけでも、スレッドをブロックしなくなったわけでもない。逆もありうる。
LinuxではI/O待ち時間は今でもよく使われている指標であり、混乱を招く性質を持ちながら、あるタイプのディスクのボトルネック、つまりCPUがアイドルでディスクがビジーになっている状態を見つけ出すことができている。I/O待ち時間の一つの解釈方法は,I/O待ち時間が存在することをシステムにボトルネックがある兆候と捉え、例え高いCPU使用率とI/O待ち時間が両立している場合でも、I/O待ち時間を最小限に抑えるようにシステムをチューニングするというものである。
詳解 システムパフォーマンス
から引用
I/O負荷に関しては、まずは仕組みを正しく理解して、
CPUへの負荷がかかっていないか、
Swapの回数は増えているのか
といった情報についても同時にみていく必要がある。