やられる前に受け身をとれ!サーバ過負荷時の自動再起動

ここ最近、サーバが過負荷で処理効率が極端に落ちる現象が多発していました。効率が落ちるだけでサービスを提供してくれるならまだマシなんですが、それを通り越してSSHでログインできないこともしばしば…。家にいれば簡単に再起動できるんですけど、そうじゃなかったら長期間サーバが実質死亡状態で放置されることになってしまいます。

それを回避するために、過負荷で処理できなくなる前にさっさと再起動するようなスクリプトを書いてみました。まずはそのスクリプトを見てみてください。

#!/usr/bin/perl

$threshold = 50;

open( LOAD_AVERAGE, "</proc/loadavg" );
$value = <LOAD_AVERAGE>;
close( LOAD_AVERAGE );

$value =~ s/\..*//;

if( $value >= $threshold ) {
        print "I'm rebooting now!! [load average]$value";
        system("reboot");
}
exit;

これを、/etc/cron.hourly の中に放り込んで、rootの実行権限を追加すれば出来上がりです。でも、このソースはちょっと間違えるとえらいことになるので取扱注意です。 *1

(2007/11/21 追記)
この内容に近い話として、カーネルパニック時に再起動させる方法もあるようです。
[web] カーネルパニック時には自動的に再起動するようにしたい - ITmediaエンタープライズ

(2007/11/21 追記)
ぜんさんから、Shell版のスクリプトを教えてもらいました!ありがとうございます。

#!/bin/sh

if (($(sed 's/\..*//' /proc/loadavg) >= 50))
then
        echo rebooting
        reboot
fi

(2007/10/23 追記)
Perlのスクリプトを単純にしてみました。機能自体はあまり変わらないです。

*1 : 例えば、$threshold = 1にするとか。

トラックバック(0)

このブログ記事を参照しているブログ一覧: やられる前に受け身をとれ!サーバ過負荷時の自動再起動

このブログ記事に対するトラックバックURL: http://trialpc.net/mt/mt-tb.cgi/1437

コメント(2)

ぜん :

厳密に同じ動きではありませんが、こんなんでどうでしょう?

if (($(sed 's/\..*//' /proc/loadavg) >= 50)); then echo rebooting; reboot; fi


tetsu :

なるほど~!
まだsedの使い方がよく分ってなかったりするので、
その方がスマートですねヽ(´ー`)ノ
後で訂正しておきます。ありがとうございます。


コメントする

Advertizement

このブログ記事について

このページは、tetsuが2007年11月21日 02:36に書いたブログ記事です。

ひとつ前のブログ記事は「無味乾燥―失われる感情」です。

次のブログ記事は「研究と雑用のあいだ―もうピヨりそう」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 5.0

カウンタ

リンク