ablog

不器用で落着きのない技術者のメモ

サーバ負荷をシンプルに評価する指標 "sysload"

たしか、4年くらい前にデータベース系のイベントで瀬島さんと横道さんと話しているときにそういうものを作っているとちらっと聞いて気になっていたので、ブログ見たときに sysload は「あの時、聞いたやつだ」と思い出した。

はるか昔kernel 2.6 の頃、Load Average が低めに出てしまうというバグがありました。
当時、弊社では Load Average を監視項目の一つにしていたため、これには大いに困りました。
また、その頃、私は resource monitoring に力を入れていたのですが、以前 blog でも書かせていただいた通り、MySQLのサーバ一台あたり200以上のmetricを収集していたため、「多すぎてどれを見ていいかわからない」といった声が社内から上がっていました。
そういった諸々の問題を解決するため、6年くらい前、私はあれこれ思案して、新しい metric を作成しました。
いまなおその metric は社内で広く普及しており、一定の有用性を示せたかと思いますので、せっかくなのでOSSとして公開させていただくことにしました。
gree/sysload
今回は、その metric と、その metric を生成するためのスクリプトの実装について、解説させていただきます。

6年くらい前に自作した metric がそこそこ有用だと思うので、OSSで公開します | GREE Engineers' Blog

職人芸な繊細な仕事だが、非常にシンプルに収斂していて匠の技を感じた。監視項目は大量にあると見るのが大変なので、如何に最小限の項目でアラートを上げるようにして全てを網羅できるようにできるかがパフォーマンス・エンジニアの腕の見せどころだと思う。*1
sysload は "sys_load_five" 1項目で「CPUバウンドなサーバもdiskバウンドなサーバも、NICからの割り込みが激しいサーバも、とりあえずsysloadさえ監視しておけば、検知できる」というのが美しい。"sys_load_five" は5分間の平均値のため瞬間的なスパイクの影響は受けなくなる、短時間のスパイクも検知したい場合は1分間隔の "sys_load_one"、15秒間隔の "sys_load" もある。「kernel 2.6 の頃、Load Average が低めに出てしまうというバグがあり作られた」とのことだが、CPUバウンドとdiskバウンド以外にネットワークバウンドも検知する点は Load Average にはないが重要な機能が追加されている。「software interrupt を受けているCPUの使用率(NICからの割り込みを受けているCPUの使用率)*2」まで見ているのは匠だと思う。「もちろん、sysloadは万能ではありません」はその通りだが、1項目で負荷の指標を見れるようにしているのは素晴らしく、GREEの環境で実用性も実証されている sysload がOSS公開されて感謝です。

動かしてみる

cpustats.py はこのまま ganglia で sysload を集計するためにも使えるのですが、コマンドラインから実行することも可能です。

6年くらい前に自作した metric がそこそこ有用だと思うので、OSSで公開します | GREE Engineers' Blog

とのことなのでEC2で動かしてみた。

インストール
  • sysload と負荷ツールをダウンロードする。
$ sudo yum -y install git stress 
$ git clone https://github.com/gree/sysload.git
CPU負荷をかけてモニタリングしてみる
  • CPUに負荷をかける。
$ stress --cpu `grep -c 'processor' /proc/cpuinfo` &
  • cpustats.py を実行して sys_load_five をモニタリングする。
$ cd ~/sysload/ganglia
$ python cpustats.py
(中略)
value for sys_load is 100.000
value for sys_load_one is 100.000
value for sys_load_five is 25.000 ★
value for sys_load_fifteen is 8.333
IO負荷をかけてモニタリングしてみる
$ stress --hdd `grep -c 'processor' /proc/cpuinfo` --io `grep -c 'processor' /proc/cpuinfo` &
  • cpustats.py を実行して sys_load_five をモニタリングする。
$ cd ~/sysload/ganglia
$ python cpustats.py
(中略)
value for sys_load is 100.000
value for sys_load_one is 100.000
value for sys_load_five is 26.925 ★
value for sys_load_fifteen is 8.975

sysload/cpustats.py at master · gree/sysload · GitHubのソースはちゃんと読めていないのでまた読みたいと思います(特に「NICからの割り込み」の計上まわり)。

余談

  • B.Gregg の The USE Method はコンピュータのCPU、メモリ、ディスクなどのコンポーネント毎に使用率、サチュレーション、エラーの3つの観点で見ることでボトルネックをシンプルでシステマチックに特定するメソッドだが、sysload は一つの指標に集約していて非常にシンプル。
  • 「sysloadでは、InnoDBのmutexの競合やspinlockやthreadのconcurrencyやdirty pageのflushやその他諸々の監視はできません」については、アクティブセッション数と DB Time + Wait Event が MySQL + InnoDB で取れればどんな性能問題が発生しても時間ベースでシンプルな評価が可能になる。*3

さいごに

今回はmonitoringの話をさせていただきましたが、MySQLでディープなネタが2つくらいありますので、今後、blogなりスライドなりで公開したいなぁと思ってます。興味のある方は気長にお待ち下さい。

6年くらい前に自作した metric がそこそこ有用だと思うので、OSSで公開します | GREE Engineers' Blog

sysload は話を聞いてから4年くらい待ったので、オリンピック周期くらいで公開されることを楽しみにしておりますw

*1:監視は少ない項目で、稼働統計情報としては原因追求できるよう多数の項目を詳細に記録する必要がある

*2:「/proc/interrupts をみて、eth{0,1,2,3} に割り込んでる CPU をチェックする、bonding してると active 側の NIC が eth0 と eth1 で切り替わるので、eth0以外からの割り込みもチェックする、eth{0,1,2,3} からの割り込みをチェックして、割り込まれてるNICごとに CPU をグループ分けする、もし割り込まれてないNICがあれば、結線されてないと考えて、監視対象から外す」といった緻密な実装には驚きました

*3:当り前だが、アクティブセッション数自体を取得できないようなハングは検知できないので、ハング検知は別途行う必要がある