続・vmstatの見方と考え方 [Linux(CentOS/VineLinux)]
vmstatの見方と考え方を見たという人から…
vmstatの右端の、「cpu」のところにある「id」でサーバの重い・軽いを判断してはいけないという理由がイマイチわからないのでもう少し説明して欲しい
というリクエストを受けたので、説明を追加する。
まず、理由は複数あるのけども、その中で最も判りやすい例を示す。
ターミナルを2個開いて、片方でvmstatを、もう片方でtopコマンドを実行してみよう。すると…
CPUの処理時間を見ると、%Idleは80%以上あるように見える。NFSサーバなので、ディスクへのI/Oが処理の中心になるので、%wioが多いのは仕様である。
このような状態のサーバでも、たまに「重い」と言われることがある。
経験の浅いサーバ管理者だったら、「は?」とか思ってしまうかもしれない。
しかし、topコマンドで見ると一発で答えがわかる。
イマドキのサーバはマルチコア・マルチプロセッサが当たり前なので、コア毎の状態を見る必要がある。
「Cpu3」の状態を見てもらいたい。ここだけ%waの数値が「92.7」とかなっていることが判るだろう。
これは何をしているのかというと、このコアがこのサーバのI/Oの多くをほぼ独占している状態にあることを意味している。(完全に独占しているとは言えないが…)
たとえ、CPUがマルチコア・マルチプロセッサ化されたとは言っても、I/Oはまだまだ単一の処理しか対応できないのが現実である。ディスクにしてもネットワークにしても、ある瞬間にそのディスクやネットワークを使用できるスレッドはたった一つであり、誰かがディスクアクセスを行っているその瞬間は他の人はディスクアクセスが終了するか使用する権利が回ってくるまで待機させられることとなる。
vmstatやsarコマンドをそのまま眺めているだけでは、こうした事象には気がつきにくくなっている。なにしろvmstatやsarコマンド、topも標準のままでは全てのコア・CPUの平均値しかレポートしないので、こうしたI/Oネックによるサーバの「重さ」に管理者が気がつかないということになってしまっているのであった。
その意味でも、vmstatの「cpu」よりも「procs」に注目するようにと、以前のアーティクルで記述したのであった。「procs」は「ブロックされたプロセスの数」を表示しているので、上記サンプルのように、1/8のコアだけが忙しくても、現実に実行をブロックされたプロセスが発生すればprocsの欄にレポートされるのである。
なお、topコマンドで各コア・プロセッサごとの処理状態を見たい場合は「1」を押す。すると、全体のCPU平均と、コア・プロセッサ毎の表示が切り替わる。また、sarコマンドでコア・プロセッサ毎の処理状態を確認したい場合は「-P ALL」オプションを付ける。ALLのかわりにCPUのIDを指定すると、そのコア・プロセッサだけ表示される。ちなみに -P ALLをつけた場合はこんな感じ。
この時間だと、cpu2がせっせとIO処理をしている(cpu3も結構がんばっている)が、全体としては17.46%にしか見えないので、「ま、まだ楽勝じゃん!?」とか思われてしまうこともしばしば。
これが、「%Idle」の多い少ないだけでサーバの「重い」「軽い」を判断してはいけない理由の一つ。
vmstatの右端の、「cpu」のところにある「id」でサーバの重い・軽いを判断してはいけないという理由がイマイチわからないのでもう少し説明して欲しい
というリクエストを受けたので、説明を追加する。
まず、理由は複数あるのけども、その中で最も判りやすい例を示す。
ターミナルを2個開いて、片方でvmstatを、もう片方でtopコマンドを実行してみよう。すると…
[root@nfsserver ~]# vmstat 5 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r b swpd free buff cache si so bi bo in cs us sy id wa st 1 1 4 78100 465408 11877040 0 0 170 23 0 2 0 1 97 2 0 2 1 4 79332 465592 11876136 0 0 4108 211 5870 3475 1 3 83 13 0 0 1 4 77096 467276 11871576 0 0 5503 336 6187 4404 1 4 81 14 0 0 1 4 80312 469152 11863716 0 0 3864 26 5157 2085 0 1 86 14 0 0 1 4 77016 471196 11859260 0 0 4785 68 5458 4898 1 5 81 13 0 1 1 4 79320 472012 11850980 0 0 5079 1895 6298 2508 0 1 85 13 0 3 1 4 79104 474516 11845392 0 0 4951 754 6324 4816 1 4 81 14 0 0 1 4 75820 477668 11834292 0 0 3651 201 5537 4384 1 4 80 15 0
CPUの処理時間を見ると、%Idleは80%以上あるように見える。NFSサーバなので、ディスクへのI/Oが処理の中心になるので、%wioが多いのは仕様である。
このような状態のサーバでも、たまに「重い」と言われることがある。
経験の浅いサーバ管理者だったら、「は?」とか思ってしまうかもしれない。
しかし、topコマンドで見ると一発で答えがわかる。
[root@nfsserver ~]# top top - 14:07:00 up 32 days, 8:52, 1 user, load average: 1.81, 1.68, 1.24 Tasks: 469 total, 1 running, 468 sleeping, 0 stopped, 0 zombie Cpu0 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu1 : 0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu2 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu3 : 1.0%us, 5.0%sy, 0.0%ni, 0.0%id, 92.7%wa, 0.0%hi, 1.3%si, 0.0%st Cpu4 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu5 : 0.3%us, 0.3%sy, 0.0%ni, 94.0%id, 4.0%wa, 0.3%hi, 1.0%si, 0.0%st Cpu6 : 0.3%us, 0.7%sy, 0.0%ni, 97.4%id, 1.7%wa, 0.0%hi, 0.0%si, 0.0%st Cpu7 : 0.0%us, 0.3%sy, 0.0%ni, 95.3%id, 2.7%wa, 0.0%hi, 1.7%si, 0.0%st Mem: 14363332k total, 14286036k used, 77296k free, 508620k buffers Swap: 14679832k total, 4k used, 14679828k free, 11667896k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 29685 root 18 0 197m 124m 760 D 5 0.9 0:13.81 rsync 463 root 10 -5 0 0 0 S 0 0.0 28:23.28 kswapd0 4231 root RT 0 88192 4328 2704 S 0 0.0 10:09.53 multipathd 27891 root 15 0 0 0 0 S 0 0.0 0:33.86 nfsd 28012 root 15 0 0 0 0 S 0 0.0 0:35.92 nfsd 28022 root 15 0 0 0 0 S 0 0.0 0:30.93 nfsd 28072 root 15 0 0 0 0 S 0 0.0 0:33.64 nfsd 29681 root 15 0 85124 3180 2464 S 0 0.0 0:00.98 sshd 32756 root 15 0 12976 1360 796 R 0 0.0 0:00.06 top 1 root 18 0 10316 676 568 S 0 0.0 0:02.27 init 2 root RT 0 0 0 0 S 0 0.0 0:06.38 migration/0 3 root 34 19 0 0 0 S 0 0.0 0:00.01 ksoftirqd/0
イマドキのサーバはマルチコア・マルチプロセッサが当たり前なので、コア毎の状態を見る必要がある。
「Cpu3」の状態を見てもらいたい。ここだけ%waの数値が「92.7」とかなっていることが判るだろう。
これは何をしているのかというと、このコアがこのサーバのI/Oの多くをほぼ独占している状態にあることを意味している。(完全に独占しているとは言えないが…)
たとえ、CPUがマルチコア・マルチプロセッサ化されたとは言っても、I/Oはまだまだ単一の処理しか対応できないのが現実である。ディスクにしてもネットワークにしても、ある瞬間にそのディスクやネットワークを使用できるスレッドはたった一つであり、誰かがディスクアクセスを行っているその瞬間は他の人はディスクアクセスが終了するか使用する権利が回ってくるまで待機させられることとなる。
vmstatやsarコマンドをそのまま眺めているだけでは、こうした事象には気がつきにくくなっている。なにしろvmstatやsarコマンド、topも標準のままでは全てのコア・CPUの平均値しかレポートしないので、こうしたI/Oネックによるサーバの「重さ」に管理者が気がつかないということになってしまっているのであった。
その意味でも、vmstatの「cpu」よりも「procs」に注目するようにと、以前のアーティクルで記述したのであった。「procs」は「ブロックされたプロセスの数」を表示しているので、上記サンプルのように、1/8のコアだけが忙しくても、現実に実行をブロックされたプロセスが発生すればprocsの欄にレポートされるのである。
なお、topコマンドで各コア・プロセッサごとの処理状態を見たい場合は「1」を押す。すると、全体のCPU平均と、コア・プロセッサ毎の表示が切り替わる。また、sarコマンドでコア・プロセッサ毎の処理状態を確認したい場合は「-P ALL」オプションを付ける。ALLのかわりにCPUのIDを指定すると、そのコア・プロセッサだけ表示される。ちなみに -P ALLをつけた場合はこんな感じ。
00時00分01秒 CPU %user %nice %system %iowait %steal %idle 00時20分01秒 all 0.88 0.00 4.12 17.46 0.00 77.54 00時20分01秒 0 0.05 0.00 0.15 0.05 0.00 99.76 00時20分01秒 1 0.05 0.00 0.62 0.02 0.00 99.31 00時20分01秒 2 0.71 0.00 1.55 70.52 0.00 27.23 00時20分01秒 3 0.45 0.00 2.70 36.00 0.00 60.86 00時20分01秒 4 1.44 0.00 4.13 0.07 0.00 94.35 00時20分01秒 5 1.24 0.00 7.41 12.05 0.00 79.30 00時20分01秒 6 1.54 0.00 5.86 11.18 0.00 81.42 00時20分01秒 7 1.59 0.00 10.52 9.81 0.00 78.08
この時間だと、cpu2がせっせとIO処理をしている(cpu3も結構がんばっている)が、全体としては17.46%にしか見えないので、「ま、まだ楽勝じゃん!?」とか思われてしまうこともしばしば。
これが、「%Idle」の多い少ないだけでサーバの「重い」「軽い」を判断してはいけない理由の一つ。
コメント 0