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

ここ最近、サーバが過負荷で処理効率が極端に落ちる現象が多発していました。効率が落ちるだけでサービスを提供してくれるならまだマシなんですが、それを通り越して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にするとか。

Track Back

Track Back URL

Comments [2]

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

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

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

コメントする

公開されません

refresh captcha

画像の中に見える文字を入力してください。

このページの上部へ

About

tetsuの日記・雑記です。
日々経験したことを記録していきます。

広告

サイト内検索

最近のピクチャ

  • リアディレーラ

月別アーカイブ

最近のコメント