ロードアベレージを監視するシェルスクリプトを作成してみた
このブログを運用している Linux サーバの負荷が高い状態になってました。
何か被害にあったとかではなく原因はボクにあったのでひと安心でしたが、反省の意味も含めて今後こういうことがあった場合に警告してくれるスクリプトを作成してみました。
photo credit: Some rights reserved by Nomadic Lass
目次
1. 監視スクリプト作成の背景
先日このブログを運用している Linux サーバでちょっとした作業を行いました。
作業中、処理が重たく感じたので top
コマンドで CPU などのリソース類の状態を確認すると、CPU のユーザプロセスがほぼ100%の状態になっていました。
100%になっていた原因はウィルスとかではなくボクにあったので、とりあえずひと安心なのですが監視ツールの必要性を実感しました。
Nagios などの監視ツールをインストールしてさらりと済ませようかと考えましたが、監視スクリプトを自作することにしました。
ツールをインストールして良からぬ副作用が発生したら面倒だなぁってのがあったのと、リッチなものではなくシンプルな監視スクリプトで充分だったってのが理由です。
2. 監視処理の内容
シンプルにロードアベレージだけを監視する内容にしました。
なぜロードアベレージなのかというと、その理由を引用しておきます。
語弊を恐れず言えば Load Averageが高い ≒ サーバ負荷が高い ≒ 重い ≒ 応答速度が遅い
ロードアベレージを取得して、その値が CPU の数を超えていたら通知します。
再び同じ記事からの引用になりますが、CPU の数と比較するのは次の理由からです。
コマンド(uptimeなど)でLoad Averageを表示した場合に Load Averageの値がCPUの数より大きい場合、「Load Averageが高い」( 負荷が高い、重い )
通知手段はボクだけに知らせればいいのでメールにしました。
3. 監視スクリプト
作成したスクリプトは次の通りです。
#!/bin/sh LOAD_AVERAGE=`uptime | sed -e 's/.*average: //g' -e 's/,//g' | awk '{print $2}'` LOG_FILE=/path/to/directory/`basename $0 | sed -e 's/.sh//g'`.log echo `date +"%Y/%m/%d %H:%M:%S"`,${LOAD_AVERAGE} >> ${LOG_FILE} THRESHOLD=`grep 'processor' /proc/cpuinfo | wc -l` # カーネルが認識する CPU 数。閾値として使用 # 参考 http://d.hatena.ne.jp/kakurasan/20110117/p1 COMPARE=`echo "${THRESHOLD} < ${LOAD_AVERAGE}" | bc` if [ ${COMPARE} = 1 ]; then # 閾値を超えたのでメールで通知 MAIL_ADDRESS=mail@add.ress SUBJECT="${HOSTNAME} サーバ: CPU のロードアベレージ(${LOAD_AVERAGE})がしきい値(${THRESHOLD})を超えました" BODY="" echo ${BODY} | mail -s ${SUBJECT} ${MAIL_ADDRESS} fi
uptime | sed -e 's/.*average: //g' -e 's/,//g' | awk '{print $2}'
の部分でロードアベレージを取得しています。
直近5分のロードアベレージを取得しています。
5分のものにしている理由は、この後に書きますが、このスクリプトを5分間隔で実行するからです。
取得したロードアベレージは動作確認の意味も含めてログに出力します。
cron
で運用するため吐かれたログを見て、スクリプトが正常に動作しているかを確認します。ログはとても大事。
ログファイルは "/path/to/directory" と書いているディレクトリに作成されます(実際には適切なパスに変更しています)。
ファイル名はこのスクリプトファイル名の拡張子を log に変換したものとなるようにしました。
このログファイルに次のような内容でログが出力されていきます。
2014/07/01 10:00:01,0.00 2014/07/01 10:05:01,0.01 2014/07/01 10:10:01,0.04
CPU の数は grep 'processor' /proc/cpuinfo | wc -l
のようにして取得できます。
CPU の数は環境が変わらない限り固定値なので、毎回取得しなくてもいいんじゃないかって感じがしますが、環境が変わるたびにスクリプトを修正するのも面倒なのでこのようにしています。
大した負荷になるとは思えないのでこれでいいかなと。
取得したロードアベレージと CPU の数を比較するには bc
コマンドを使用します。
test
コマンドは小数点以下の値に対応していないようで、小数点以下の値が含まれる場合は bc
コマンドを使うようです。
bc
コマンドは、渡される式が正しい場合は 1 が返り、偽の場合は 0 が返る仕様になっています。
メール送信には mail
コマンドを使います。
本文なし・件名のみのメールを送信するので、s オプションを付けて実行します。
上記のように echo
などで本文を渡さないと、本文が入力されるまで待機してしまうので、空白文字を渡してやります。
4. cron 設定
最後にこのスクリプトの cron
設定です。
このスクリプトを5分間隔で実行したいので設定は次のようになります。
*/5 * * * * /path/to/script
"path/to/script" の部分をこのスクリプトの絶対パスで置き換えます。
あとは、このスクリプトのパーミッションを適切なものに設定すれば5分間隔で動きます。
5. まとめ
以上、シンプルなロードアベレージ監視シェルスクリプトの作成についてでした。
Linux の知識に乏しいこともあって、この程度のシェルスクリプトを作成するだけでもいろいろと調べることがたくさんありました。
- サーバの負荷状態を知る手がかりとしてロードアベレージを参照する
- その際、CPU の数を考慮して状態を判定する
6. その他 Linux に関する記事
その他の Linux に関する記事は次の通りです。
気になる記事があったらぜひチェックしてみてください!
- シェルスクリプトでcdしたいパスにスペースが入っている場合の対処法
- CentOSにRubyのBundlerをインストールして使い始める人向けの簡単なまとめ
- amazon-ecsを使った検索のエラー原因を確認する
- CentOS6.5にGitをソースコードからインストールする
- CentOSのバージョン6.5(64ビット)にamazon-ecsをインストールする
- CentOSのバージョン6.5(64ビット)にRuby2.1.2をインストールする
- mp3splt を実行して "undefined symbol: mp3splt_u_check_if_directory" と出力されたときの対処法
- 検証用の CentOS をインストールした直後に行う初期設定手順
- 64ビット版のCentOSをVMwareにインストールできない場合の対処法
- 参照可能な yum リポジトリを確認する yum コマンドとワンライナー
- yum のリポジトリ ATrpms を参照できるように設定する
- scp を使ってファイルのコピーを実行したら "command not found" と表示されたときの対処法
- scp コマンドを yum を使って CentOS にインストールする
- yum が参照するミラーサイトの baseurl を変更して日本国内のものに設定する
- CentOS に yum-plugin-priorities プラグインをインストールする
- Linuxでmp3をお手軽に結合する
- シェルスクリプトでメールを送信する
- no space left と表示されたときの対処法
Googleアドセンス用(PC)
関連記事
-
-
検証用の CentOS をインストールした直後に行う初期設定手順
職場でも自宅でも Linux で検証したい作業があったので VMware に 64 ビット版の Ce
-
-
Sublime Text3 で JavaScript を書くために設定したプラグインとキーバインド
プロフィール にもあるように、ボクは Java をメインとしたプログラマです。 IDE には Ecl
-
-
IE9 のキャッシュ対策
どのようなバグだったのか POST で送信した内容を確認する画面で、最新の内容が表示されないという
-
-
Vagrantで起動したCentOS上のOctopressをホストOSから確認する設定
タイトルの通りだが、Vagrant を使って起動した CentOS に Octopress をインス
-
-
シェルスクリプトでcdしたいパスにスペースが入っている場合の対処法
cd したいパスにスペースが入っていると、パスの先頭からスペースまでを「移動したいパス」と解釈されて
-
-
Sublime Text3 のインストール直後に行った設定メモ
突発的に自宅のマシンにインストールしてあった Sublime Text2 を 3 にアップデートしま
-
-
no space left と表示されたときの対処法
タイトルの "no space left" とは「書き込みたいけど、ディスクの飽
-
-
VPS に Redmine を設置したときに対処したトラブル
Redmine のインストール自体は Redmine 2.3をCentOS 6.4にインストールする
-
-
64ビット版のCentOSをVMwareにインストールできない場合の対処法
Linux で検証したい作業が多かったので VMware に検証環境を作りました。OS は Cent
-
-
GoogleGuavaのRangeを使って範囲判定を簡潔に書く
次のような判定処理を if 文で書くことがよくある。 もし 100 よりも大きければ(=大小判定