Posted at
SensuDay 18

check/metrics を増やして( ゚д゚)ってなった話

More than 3 years have passed since last update.

まずは環境から。


  • sensu-client:社内仮想サーバ(not AWS, 64bit 8コア 320GB)x 8台

  • sensu version:0.14.0


  • sensu-community-pluginからmetricスクリプトを拝借


  • sensu_influxdb_handlerを使用して、InfluxDBにmetric送ってGrafanaで描画してます

  • checkの間隔は30秒に1回、metricは10秒に1回

  • Tomcat & Apacheは起動しているものの、LBから切り離されてて本番投入はされてない

という状態です。

この時、Grafanaでポチポチグラフ作ってたら、sensu-clientのサーバのloadが高くなる謎現象に遭遇しました。

8コアなのでこれぐらいなら全く問題ないのですが、ちょっと気持ち悪かったのと本番投入前で無茶できたので、内緒でいろいろイジってみました。


  • 固定値を返すdummyスクリプトを用意(ruby、bash)して、sensu-clientに配置

rubyはこんなん


dummy.rb

#!/usr/bin/env ruby

puts "server01.dummy.hoge 1.00 #{Time.now.to_i}"


bashはこんなん


dummy.sh

#!/bin/bash

echo "server01.dummy.hoge 1.00 `date +%s`"



  • sensu-server側の設定でdummyを走らせるようにする


    • metricは10秒間隔で30並列、checkは30秒間隔で30並列実行するように設定



    "dummy_metrics01" : {

"type": "metric",
"handlers": ["influxdb"],
"command": "/etc/sensu/plugins/dummy-metrics.rb",
"interval": 10,
"subscribers": [ "servers" ]
},
"dummy_metrics02" : {
"type": "metric",
"handlers": ["influxdb"],
"command": "/etc/sensu/plugins/dummy-metrics.rb",
"interval": 10,
"subscribers": [ "servers" ]
},

って感じで01〜30まで用意しました。


  • 組み合わせ4種類([ruby, bash] * [metric, check])それぞれ時間帯変えてしばらく放置


    • ruby metric

    • bash metric

    • bash check

    • ruby check



結果、こんな感じになりました。

さすがにloadが5になってるのでヤバいですねw

RabbitMQからメッセージを受け取ったsensu-clientは、メッセージの内容を元にプロセスをフォーク※するので、プロセスの処理内容によってはloadが高くなると考えられます。

bashよりrubyの方がloadが高いのは、バイトコード生成等を行うインタプリタの影響かな・・・と思ってます。

(インタプリタ周りは無知なので、アドバイスいただけると助かります><)


https://github.com/sensu/sensu-spawn/blob/master/lib/sensu/spawn.rb#26 の concurrency の値変えると変わるかも・・・?


footprintを小さくするという意味においては、Go言語をコンパイルしてバイナリ化したものを実行するという方法は有用だと思われます。

(今回時間がなかったのと、この実験で使ったサーバをすでに本番投入したので比較できませんでした。すみません)


まとめ


  • metricの間隔を極端に短くしすぎない

  • metricの種類を極端に多くしすぎない

  • 問題になるようなら、pluginをrubyからgolangやshell scriptあたりに乗り換える