2007年6月13日水曜日

sm-mta[プロセスID]: rejecting connections on daemon Daemon0: load average: 数字

FreeBSD 6-STABLEなマシンの/var/log/maillogを見たら、こんなログがたくさん出ていました。

sm-mta[プロセスID]: accepting connections again for daemon Daemon0
sm-mta[プロセスID]: rejecting connections on daemon Daemon0: load average: 25
sm-mta[プロセスID]: rejecting connections on daemon Daemon0: load average: 28
sm-mta[プロセスID]: rejecting connections on daemon Daemon0: load average: 26



sm-mtaってなんだろう?ああ、たぶんsendmailのことか。
ってことで、/etc/mail/sendmail.cfにこんなのがありました。



# load average at which we just queue messages
#O QueueLA=8



# load average at which we refuse connections
#O RefuseLA=12



# log interval when refusing connections for this long
#O RejectLogInterval=3h



# load average at which we delay connections; 0 means no limit
#O DelayLA=0



これを見るに、どうやら、load averageが12以上の場合は、sendmailが接続を拒否するみたいですね。へぇ~知りませんでした。



実はこのマシンでは、apache httpdが動いていて、ちょっと重いWebアクセスを処理していて(phpで、postgresqlにあれこれしたり)、しかもそれがわりと数多く発生してたので、load averageが30くらいと、かなり派手なことになっていたのでした。



Xeonが2個のったSMPなマシンではありますが、20~30程度になると、さすがに、ちょっと重いかな、と体感で気がつくようになります。しかし、さすがFreeBSDだけあって(そうなのか?!笑)、まあ、それでも、新たにsshでログインしたり、シェルであれこれコマンドを実行したりと、インタラクティブな操作をしていても、それなりのレスポンスで動くんですよね。



きっと何かのパラメータの調整しだいで違いが出てくるだけのことだと信じたいのですが、以前、RHELなサーバーにログインしてお仕事をしてたとき、load averageがたったの2.0程度になっただけで、うわ重すぎ・・・もうダメだ・・・って状態になったことがありました。





(2007/6/22 追加)

・・・というわけで、どうやって設定変更するかの方法。

/usr/share/sendmail/cf/README を見ると


confQUEUE_LA            QueueLA
[varies] Load average at which queue-only function kicks in. Default values is (8 * numproc) where numproc is the number of processors online (if that can be determined).


confREFUSE_LA
           RefuseLA
[varies] Load average at which incoming SMTP connections are refused.  Default values is (12 * numproc) where numproc is the number of processors online (if that can be determined).

という説明が載っています。そこで・・・

/etc/mail/(ホスト名).mcに、以下を追加。なお、「(ホスト名).mc」がないときは、「freebsd.mc」をコピーして使います。

define(`confQUEUE_LA',  `15')
define(`confREFUSE_LA', `20')

そして、sendmail.cfを作って置き換える、いつもと同じ手順。

# cd /etc/mail/
# make
/usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/cf/   /usr/share/sendmail/cf/m4/cf.m4 (ホスト名).mc > (ホスト名).cf

# make install
install -m 444 (ホスト名).cf /etc/mail/sendmail.cf
install -m 444 (ホスト名).submit.cf /etc/mail/submit.cf

# make restart
Restarting: sendmail sendmail-clientmqueue.

sendmail.cfの中の該当箇所を確認してみると、ちゃんと変更されています。

# load average at which we just queue messages
O QueueLA=15

# load average at which we refuse connections
O RefuseLA=20


うごいてるか確認してみると・・・

# ps axww | grep sendmail
30067  ??  Ss     0:00.00 sendmail: rejecting connections on daemon Daemon0: load average: 31 (sendmail)
30071  ??  Is     0:00.00 sendmail: Queue runner@00:30:00 for /var/spool/clientmqueue (sendmail)

プロセッサが2個載ってるマシンだったので、numproc倍、つまり2倍してくれるのかと思ったのですが、そういうわけじゃないらしいので、*.mcファイルで指定した値を2倍にして、やりなおし。

今度は、なんかよさそうです。

# ps axww | grep sendmail
33836  ??  Ss     0:00.00 sendmail: accepting connections (sendmail)
33840  ??  Is     0:00.00 sendmail: Queue runner@00:30:00 for /var/spool/clientmqueue (sendmail)
34012  p0  R+     0:00.00 grep sendmail


ログファイルを確認してみると・・・

(ホスト名) sm-mta[30067]: restarting /usr/sbin/sendmail due to signal
(ホスト名) sm-mta[33836]: starting daemon (8.13.8): SMTP+queueing@00:30:00
(ホスト名) sm-msp-queue[30071]: restarting /usr/sbin/sendmail due to signal
(ホスト名) sm-msp-queue[33840]: starting daemon (8.13.8): queueing@00:30:00
(ホスト名) sm-msp-queue[33840]: runqueue: Skipping queue run -- load average too high

なんかまだダメですね・・・

ソースコードみちゃいました(笑)。このあたりで出てるメッセージですね。

SM_GET_LA(now);

if (!bitset(RWG_PERSISTENT, flags) &&
    shouldqueue(WkRecipFact, Current_LA_time))
{
        char *msg = "Skipping queue run -- load average too high";

        if (bitset(RWG_VERBOSE, flags))
                message("458 %s\n", msg);
        if (LogLevel > 8)
                sm_syslog(LOG_INFO, NOQID, "runqueue: %s", msg);
        return false;
}


うーんと・・・?なんだこれは・・・こんなコード、わけわからんです(笑)。


結局、結論としては、すごく単純なことを忘れていて、

submit.cf」のほうも同じように変更しなくちゃいけない!!!

ということでした。

というわけで、「(ホスト名).submit.mc」についても、先ほどと同様のことを繰り返します。「(ホスト名).submit.mc」が無い時は、これもまた同様に「freebsd.submit.mc」をコピーして使います。

これで、ようやく、メールキューにたまってたメールが送り出されました。

# mailq -Ac
/var/spool/clientmqueue is empty
                Total requests: 0


ちなみに、メールの内容は、nagiosというサーバ監視ソフトが出した、load averageが高すぎるぞ、という通知でした(笑)。



0 件のコメント:

コメントを投稿