アプリ版:「スタンプのみでお礼する」機能のリリースについて

topコマンドでサーバーを監視していると、1日に何回か、
急激にtasks の数が普段130程度なのが急上昇して 200 くらいになり、
同時に load average の値が、普段 0.1から 0.5 程度なのが
20 とか30 まで急上昇します。

急激に増えたtasks が何なのか調べようと

#ps -aux

を打って見ると、それは以下のようにほとんど全てが sendmail で、
迷惑メールがサーバーに流れ込んでいる状態なんだと思います。
そして、そのほとんどの sendmail の STAT が D になっています。
そして高負荷な状態が3分から10分継続します。

STAT COMMAND
D sendmail: sm-acceptingconnections: m48B0GUt030737 static-72-224-7-89.ipcom.comunitel.net [89.7.224.72] (may be forged): RCPT
D sendmail: sm-acceptingconnections: m48B0Gu1030737 maverick.lucnetsolutions.com [67.19.81.178] (may be forged): RCPT TO:<
D sendmail: sm-acceptingconnections: server [148.74.30.182] startup
D sendmail: sm-acceptingconnections: server 61.11.127.123-bb.static.vsnl.eth.net [61.11.127.123] (may be forged) startup
D sendmail: sm-acceptingconnections: server 59-115-193-195.dynamic.hinet.net [59.115.193.195] cmd read
D sendmail: sm-acceptingconnections: server 61-91-154-194.static.asianet.co.th [61.91.154.194] cmd read
D sendmail: sm-acceptingconnections: m48B0N92030737 host-84-223-248-186.cust-adsl.tiscali.it [84.223.248.186]: QUIT


しかし迷惑メールは基本的に一日中流れ込んでいて、sendmailの数が
上昇することはあっても load average が急上昇することはなく、
そのsendmailのSTAT は 大抵 S となっています。 
STAT が D のsendmailプロセスが大量に発生しているときだけ、
load averageが20や30まで急上昇します。

STAT が D というのは 「割り込み不可のスリープ状態」だそうですが、
これはどういう状態なんでしょうか。また何故、発生するのか悩んでいます。
メモリー不足の線も考えましたがスワップが発生しているようでもなく・・
こういう状態になるたびにサーバーが重くなるので困っています。

何かsendmail以外の原因でサーバー負荷が大きくなった結果として
STATがDのsendmailが溜まったのかとも考えますが、
目を凝らしてtopやアクセスログを見てもそれらしい動きはなく
全く分かりません。

どこかチェックすべき点、対処法、sendmailプロセスのSTATがDの意味・・
などアドバイスをぜひ宜しく御願いいたします。

A 回答 (3件)

>topで見ているときのSTATですので、S は sleep 、D も sleep(割り込み不可)だと。



ちゃんと読めていませんでした。すみません。
uninterruptible sleep とは I/O 待ちをしているプロセスが入る状態です。
可能性としては、ディスクI/O、ネットワークI/Oですね。
メールを各ユーザーごと保存するのに時間がかかっているか、接続先(or 元)のMTAの応答が無い(or 遅い)のではないでしょうか。

・ディスクのI/Oが遅い場合は、プロセス数を減らした方が速度が改善する可能性があります。iostat で確認できます。
 RAIDを構成している場合は、ディスク障害の可能性も考えられます。なぜならスペア ディスクが無い状態でディスクが故障すると、パフォーマンスが極めて劣化するためです。
 IDE、S-ATAの場合は、ディスク障害を正確に把握できない場合があるので、目視(聴覚?)点検が必要です。

・ネットワークI/Oが遅い場合は、状況によりますがプロセス数を増やした方が速度が改善する可能性があります。
 softbank 宛てなど携帯メールアドレス宛てが多い場合は、プロセス数を減らした方がよいでしょう。なぜなら同時5接続以上あると問答無用で遮断してしまうからです。topでみるとすべてDの状態になりかねません。
 (docomo, au は同時20接続だったはず。自信なし)

syslog には何かヒントになるようなログはありませんか?

この回答への補足

プロセス数を増やす、減らす、とは具体的にどういうことでしょうか?sendmailプロセスはほとんどがサーバーに流入する迷惑メールですが、STATがDのsendmailが大量に発生してload averageが急上昇するのは本当に突発的で、1日に何回もランダムに発生します。他の通常の大量のsendmailプロセス(迷惑メール)と何が違うのか区別ができません。違いは STATが D。というだけで。。
「メールを各ユーザーごと保存するのに時間がかかっている」ということでSTATがDになっている場合、四六時中だいたい同じ数量で迷惑メールが流れ込んでいるにもかかわらず、なぜそのときは、そうなるのか、違いが分かりません。
メールログ、/var/log/messages, /var/log/secure も、リアルタイムでにらめっこしていますが特に変わった動きもなく何も発見できませんでした。
メールボックスに大量のメールが残っている場合、このメールアカウントにログイン動作をすると、接続までに非常に時間がかかり、このとき負荷が急上昇するような気もします。負荷が上がることでsendmailプロセスがDで滞留してしまう、という可能性は・・

補足日時:2008/05/10 00:10
    • good
    • 0

>プロセス数を増やす、減らす、とは具体的にどういうことでしょうか?



sendmail.cf 内の設定を変更してみてください。
CentOS 5 で見る限り、デフォルトはすべてコメントアウトされています。
---
# maximum number of children we allow at one time
O MaxDaemonChildren=20
# limit on number of concurrent queue runners
0 MaxQueueChildren=50
# load average at which we just queue messages
O QueueLA=8
# load average at which we refuse connections
O RefuseLA=12
---
sendmail.mc の場合は
---
define(`confMAX_DAEMON_CHILDREN', `20')
define(`confMAX_QUEUE_CHILDREN',`50')
define(`confQUEUE_LA', `12')
define(`confREFUSE_LA', `18')
---

mailq なども確認してみてください。

>メールボックスに大量のメールが残っている場合、このメールアカウントにログイン動作をすると、接続までに非常に時間がかかり、このとき負荷が急上昇するような気もします。

iostat -k で状況が確認できるのではないでしょうか。

---
まずは、sendmail のマニュアルを読むことから始めてみてはいかがでしょうか。
    • good
    • 0
この回答へのお礼

かなり勉強になりました。ありがとうございました。

お礼日時:2008/05/24 04:04

S: Sent(送信済)


D: Deferred(送信延期)
ではないかと。

外部からのスパム受信により、User unknown の返信に時間がかかっているか、スパムの踏み台にされているか、フォワード先が無いかのどれかでしょう。

踏み台にされている可能性がある場合は、以下のサイトで確認できます。
http://www.rbl.jp/index-j.php
第三者中継チェックや、ブラックリストチェックができるでこちらで確認してみてください。

この回答への補足

topで見ているときのSTATですので、S は sleep 、D も sleep(割り込み不可)だと。。 relay check は問題なく、ブラックリストも問題ありません。
四六時中サーバーに流れ込んでいるスパムのsendmailプロセスは常時結構な数がありますが、ほとんどがSで負荷は問題ないにもかかわらず、時々大量のDとなりserver loadが上昇します。

補足日時:2008/05/09 10:23
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!