« 古いソースのコメントでの保持 | トップページ | topコマンドの見方 »

2014.02.24

CPU使用状況を確認する

主としてLinuxをターゲットとして、サーバの状態を監視しないといけないことは多々ある。
アプリ開発部門なのにインフラのサイジングとか挙動とか見てる・・・DevOpsだ!(笑)

まあそれはさておき、サーバの負荷状態を見る上ではCPUの利用状況を見るのは基本のキになる。
サーバの状況監視としては

  • CPU使用状況

  • メモリ使用状況

  • ディスクIO状況

  • ネットワークトラフィック状況

  • あたりをまずは概観することとなる。

    Windowsについてはタスクマネジャー最強、ということで今回のエントリーは対象外。
    実際にはWindowsでもtasklistなどいくつか有用なCUIツールやロギング方法はあるのだが、まずはLinux系が対象である。

    top

    今回は上記のうちCPUについて着目するので、このコマンドについては次回と確認とする。 実際にはtopコマンドはCPUの状況だけではなく、メモリやプロセス動向なども見ることのできる汎用監視ツールである。 ただモニタリングに優れている特性上対話型表示になるため、ログとして取得し後から解析する場合には使いづらい。

    vmstat

    こちらもCPUだけではなくメモリ、ディスクIO等総合的に取得可能な万能コマンド。 OSによって出力される内容は多少異なるが、ことCPUの使用率を見る上ではほぼ同一。
    vmstat [option] [interval]
    のように使用し、intervalには間隔の秒数を入力する。
    $ vmstat 1
    procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
    r b swpd free buff cache si so bi bo in cs us sy id wa st
    0 0 0 4963580 84008 2730284 0 0 43 113 249 127 1 1 97 1 0
    0 0 0 4963456 84008 2730284 0 0 0 0 989 140 1 1 99 0 0
    1 0 0 4962828 84008 2730284 0 0 0 0 989 125 0 1 100 0 0
    0 0 0 4963580 84020 2730272 0 0 0 1696 1003 112 0 1 99 0 0
    0 0 0 4963580 84020 2730284 0 0 0 0 998 142 0 0 99 0 0
    上記はRedhutにおける出力例である。 cpuとなっている右端の値に注目。

    us: ユーザー(アプリ)使用CPU%
    sy: システム(OS)使用CPU%
    id: アイドル 空きCPU%
    wa: I/O wait使用CPU%
    st: Steal値。他のOSがCPU要求をして拒否られた%

    us使用率が高い場合は、プロセスごとなどにCPU使用頻度が高いものを探す。waが大きい場合はディスクIOなどの処理がどんなことをしているかを調べることとなる。vmstatの深掘りもまた後日行ってみたい。

    mpstat


    vmstatはまとめてサーバの状況を出力してくれて便利であるのだが、複数のCPUを搭載している場合など、負荷を見誤ることがある。というのももし2コアのCPUを使用している場合、vmstatが示す使用率50%というのは、片方のコアが100%になってしまっていることを示しているかもしれないのだ。
    そこでCPU(コア)別のCPU使用率を確認するのであればこのコマンドが使える。
    $ mpstat -P ALL
    Linux 2.6.18-194.el5 (hogehoge) 02/24/2014

    09:24:58 AM CPU %user %nice %sys %iowait %irq %soft %steal %idle intr/s
    09:24:58 AM all 1.21 0.01 0.66 1.26 0.01 0.02 0.00 96.84 1004.53
    09:24:58 AM 0 1.47 0.00 0.77 3.81 0.02 0.06 0.00 93.87 1002.37
    09:24:58 AM 1 0.78 0.01 0.59 1.05 0.00 0.01 0.00 97.57 2.00
    09:24:58 AM 2 1.03 0.01 0.63 0.09 0.00 0.00 0.00 98.24 0.01
    09:24:58 AM 3 1.56 0.01 0.67 0.09 0.00 0.00 0.00 97.67 0.14

    これは4コアCPU搭載の機器で実行した例であるが、CPU allが4コア全体の平均値、後の0~3が個別のCPUの負荷状況を示している。
    vmstatに比べ"nice"、"irq"、"soft"という項目もさらに加わっている。

    nice:実行優先度を変更した(nice値)ユーザプロセスによるCPUの使用率
    irq:割り込みによるCPU実行時間の割合
    soft:ソフトウェア割り込み (software interrupt)によるCPU実行時間の割合
    要はマルチスレッドなどを実現するために割り込みや優先順位の付け替えを実施した際にかかったCPU負荷を示している。
    これらの値が高い場合、割り込みの多い処理が多重で実行されていることがわかる。

    sar


    mpstatと出力項目は似ているが、mpstatがインターバルを指定できてリアルタイムモニタリング向きなのに対して、sarは統計情報を見ることができる。
    $ sar
    Linux 2.6.18-194.el5 (hogehoge) 02/24/2014

    12:00:01 AM CPU %user %nice %system %iowait %steal %idle
    12:10:01 AM all 11.18 0.01 1.73 1.45 0.00 85.62
    12:20:01 AM all 0.29 0.01 0.53 0.04 0.00 99.13
    12:30:01 AM all 0.26 0.01 0.51 0.03 0.00 99.19
    12:40:01 AM all 0.28 0.01 0.52 0.03 0.00 99.16
    12:50:01 AM all 0.24 0.01 0.47 0.03 0.00 99.25

    オプション無しでsarを使用すると10分ごとのCPU使用状況の過去履歴情報を出力できる。
    CPU欄に"all"があることから推察できるとおり、オプションを変更すればCPU別の利用履歴を確認することが可能である。たとえば-P オプションを使って、CPU1番の利用履歴だけを出力することもできる。

    loadavgの取得


    topコマンドなどを使用すれば[load average]という値を見ることができる。
    Load Averageは簡単に言ってしまえばCPUに一度にかかっている負荷の数である。
    乱暴に言うとload averageの値がCPUのコア数よりも小さければ負荷はかかってない、といってしまえる。
    CPU個数2個に対してload avergeが4であれば、2個のCPUに対して常時4個の処理リクエストが発生している、という状況であり、2個の処理は待たされている、という状態になる。
    もしLoad Averageが非常に高い場合は比例してCPUの使用率もあがってはいくが、CPU使用率には余力があるのにLoad Averageがすごく高い場合、OSはマルチタスクを実行するためのプロセスの切替が間に合っておらず結果としてアイドルが発生したりという状態になる。

    loadavgの値はLinuxであれば/proc/loadvgに出力される。このため

    $ cat /proc/loadavg
    2.65 0.49 0.26 4/179 21228
    のようにcatコマンドなどでload averageを取得することができる。
    このときの出力されている値は1分平均、5分平均、10分平均のLoad Averageであり、上記の例であれば、この瞬間に多数のリクエストが発生している、と見ることができる。

    |

    « 古いソースのコメントでの保持 | トップページ | topコマンドの見方 »

    コメント

    コメントを書く



    (ウェブ上には掲載しません)




    トラックバック

    この記事のトラックバックURL:
    http://app.cocolog-nifty.com/t/trackback/2022/59184687

    この記事へのトラックバック一覧です: CPU使用状況を確認する:

    « 古いソースのコメントでの保持 | トップページ | topコマンドの見方 »