- - PR -
4:02の定時作業の後にロードアベレージが下がらない現象
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-09-28 23:13
はじめまして。ここでの質問は初めてです。
宜しくお願い致します。 環境は IBM xSeries 306 Intel Pentium4 3GHz Memory 1GB RedHat Linux 7.3 サーバーの用途はコミュニティサイト公開でサーバーソフトウェアは Apache/1.3.31、サイトの殆どはmod_perl(1.29)による動的なページです。BBSやユーザーデータベース、メールアカウント等のデータ管理は全てMySQLで行っています。メールサーバー(Postfix)も立ち上げていますが、管理人数人によるアクセスしかありません。 CGIなどは7月から運用しており、全て自作のものですが致命的なバグはこれまで見つかっていません。 つまり、このサーバーの主なプロセスは、mod_perlで肥大化したApacheの子イメージと、MySQLのデーモン達です。とはいっても、Apacheの設定をぎりぎりまで絞ってあるので Timeout 60 KeepAlive On MaxKeepAliveRequests 64 KeepAliveTimeout 10 MinSpareServers 8 MaxSpareServers 10 StartServers 10 MaxClients 32 MaxRequestsPerChild 8000 21時頃のピーク時でApacheのプロセス数が20-24、MySQLがそれ+5くらいです。ロードアベレージはピーク時でも一貫して0.2-0.3程度に収まっています。メモリにも常に余裕があり、スワップを書き出すことはありません。 このサーバーなのですが、先日朝4:02の定時作業の後にロードアベレージがそのままうなぎのぼりになり、3.0前後で上昇は止まり、そののち再起動するまで二時間ほど3.0前後を維持するという状況になりました。 その二時間の間、散々試行錯誤してみたのですが、ロードアベレージが3まで行っている原因を突き止められなく、再起動するに至りました。 通常時の朝4:02の定時作業では、一瞬の間ロードアベレージが上がることはあっても、0.5位です。以上が発生した4:02という時間により、まずcron.dairyを疑ったのですが、cronで予定されている動作は全て正常に完了していました。ログのローテーション、アクセスログの解析、rpmの依存関係のチェック等全て平常でした。 次に考え付く限りのログファイルを見てみたのですが、おかしな様子はありませんでした。httpdやftpd等に対して負荷をかけるようなアクセスもありませんでした。 4:02から約二時間、再起動するまではずっとロードアベレージ3前後だったのですが、その間の状況は、 プロセス数はいたって平常。時間帯もあり、かえって少ないくらい。 メモリもいたって平常。スワップを書いているプロセスも無し。 ApacheやMySQL、xinetdやメールサーバー等再起動してみたが状況は変わらず。 ps aux 等で見てみても、暴走しているようなおかしなプロセスはない・・・ まったくもって、いつものプロセスしかない。 なのにロードアベレージだけ高い・・・ Webページにアクセスした感じではあまり平常時と差は感じられなかった。 (ロードアベレージ3.0なのに重くない) といった感じで原因をつきとめることが出来ず、再起動するに至りました。 再起動後、同じ現象は起きていません。 このような状態になる原因等や調べるべきことなどありましたら、些細なことでかまいませんのでお教えいただけないでしょうか。 サーバー管理自体日も浅く、色々おぼつかない点もあるかと思いますが、ご指摘いただければ出来る限り勉強するつもりですので、宜しくお願いいたします。 | ||||||||||||
|
投稿日時: 2004-09-29 06:50
ロードアベレージが3くらいなら、重くなくても不思議はない気が
しますが、それはさておき。 症状をみるに、なにかがデッドロックに陥っていてビジーウェイト していたのではないかと思うですが... それ以上のことはなんとも 分からんです。そこで動いているプロセスについてよく知ってないと。 | ||||||||||||
|
投稿日時: 2004-09-29 17:40
お返事が遅くなり申し訳ありません。
ロードアベレージの仕様等についても色々読んでみました。 素人考えで間違ったことを想像しているのかもしれませんが、単に待ち行列?に勝手に入ってしまっているプロセスがあったりすると、CPUに負荷はかかっていなくてもロードアベレージだけ高くなるような状態がありえるように思いました。 今までの経験では、デッドロックやループに至ったプロセスというのはCPUにも負荷をかけるものだと思い込んでいましたので、プロセスを一通り見たときにもCPU値を主に見ていました。もしかして、CPU値がほぼ0でも、ロードアベレージを上げる要因になるようなプロセスがあるのでしょうか? もしそうだとしたら、そういったプロセスを見つけるためには何に注目して探せばよいのでしょうか。また、今後同じようなケースが再現した場合、真っ先に調べるべきことなどありましたらお教え頂けると幸いです。 どのようなプロセスが走っているかについてはこんな感じです。(pstreeの結果) init-+-bdflush |-courierlogger---authdaemond.mys---3*[authdaemond.mys] |-4*[courierlogger] |-4*[couriertcpd] |-crond |-httpd---17*[httpd] |-keventd |-khubd |-6*[kjournald] |-klogd |-kscand/DMA |-kscand/HighMem |-kscand/Normal |-ksoftirqd_CPU0 |-kswapd |-kupdated |-master-+-pickup | |-qmgr | `-tlsmgr |-mdrecoveryd |-6*[mingetty] |-mysqld_safe---mysqld---mysqld---31*[mysqld] |-3*[perl] |-snmpd |-sshd---sshd---sshd---bash---pstree |-syslogd |-xinetd `-yaa.pl---yaa.pl #sqlrelayとか考えた方がいいのかしら・・・ | ||||||||||||
|
投稿日時: 2004-09-30 00:13
私も素人で、いいかげんなことを言っているだけですが スケジューリングはカーネルの機能の中核ですから、そこであんまり ヘンなことが起こっている可能性は低いだろうと思います。 バグがあるとすれば、カーネルが記録した情報を表示する側のほうが あやしそうです。
なるほど、CPU 使用率は低いんですね。だとすると、もろにビジーウェイト しているわけではないですね。 低い CPU 使用率でロードアベレージが上がり得るかというと... 一般論としては、そういうこともあります。 極端なケースとしては... 多数のプロセスがいっせいに起床して、 わずかな数の命令を実行した後すぐに寝てしまう、という状況だと、 いっせいに起床した瞬間の runq にひっぱられてロードアベレージは 大きな値を示しますが、各プロセスはほとんどの時間寝ているだけなので CPU 使用率としては低い値になるはずです。
それについてはなんとも>< [ メッセージ編集済み 編集者: ぽんす 編集日時 2004-09-30 00:16 ] | ||||||||||||
|
投稿日時: 2004-09-30 00:45
私が最近いじってたプログラムはNFSがボトルネックになって、マシンのロードアベレージが爆発してました。
この状態ではロードアベレージが100超でもCPUはスカスカです。 | ||||||||||||
|
投稿日時: 2004-09-30 13:34
こんにちは。
全く以って当てずっぽうですが… MySQL の replication とか。 バックアップとかが動いていそうな時間帯なので、cron でなければこのあたりかなぁと (^^; でも LA だけ上がるものなのかしら… # すいません、DB 関係は突っ込まれても全然詳しくないです(爆) ログでは、何か普段とは違った形跡が見られないでしょうか。 |
1