|
ストーリーは勝手に編集しています。関係者の方、気を悪くなされないようお願いいたします。 sendmail と qmail の配送再試行間隔についてのディスカッション BBS雑記帳で、ドコモへのメールが遅延している事を日記として起票した。 かつさんがすかさずフォローを起こしてきた。 どうやらかつさんも気になっていたらしく、独自に調査と実験を開始していた。 遅延、そう、しばらく前にめちゃくちゃ遅延して大騒ぎになっていたのだがそれも徐々に落ちついて来ていた。 最近すっかり安定したと思っていた。 それがここへ来てまた変だ。ちょこっと数分、なんだか数時間、ほんとかよ数日と、支障を感じるくらい遅れて届く事が多くなってきた。 ドコモの配信が遅れるのは、どんなに議論しても所詮、我々にはどうにもならない。 どうにもならないのではあるが...調査をして現状を把握することに関して情熱がわき上がる、なんなんだろう。 かつさんは定期的にメール自動配信をし遅延状態を測っている。 そしていずれその結果が明らかになるだろう。この時点で第二次の調査計画が発表されているから。きっと... と思っていたらUPされてました。こちらに 更に、かつさんのこのレポートには情報が追加されていてます。それはDoCoMo向けのメールがSMTPサーバーではじかれる事例です。詳細は上記のリンク先をご覧ください。2002.8.11追記
で、ここからはメールサーバーに関しての記載になります。 かつさんはテストを実施するに当たって、メールの配送時間を変更して運用している。 かつさんのメールサーバーはsenmail。 標準のリトライ間隔は次の通りだ(かつさん情報より) ・再送間隔1時間 かつさんのチューニングによってsendmailは次のようにしてあるという。 ・10分間隔で再送 かわいそうにsendmail、全体的に忙しくはたからされている。 きっとご主人が早く食べる癖になってしまったからでは無いか?と思う。(ここのNo99に書いてありました、ぜひ参照して投票を!)。 さて私は、というと、このサーバーの説明を見ていただいた通り、qmail ってやつを使っている。 リトライはどうなってんだ? そういえば設定した覚えがないぞ、ちょっとあせった。 とりあえず、BBSからは姿を消して調査することにした。ここで答えるべく意地が、すこしはある。 調べても調べても・・・・そんなインターバルどこにも見当たらない。 その件で疑問に思っている人は・・・いない? なんで? みんな気にならないのか?
さて、このへんから qmail のお話しになってしまいます。といっても、私自身 qmailに特別詳しい訳ではありませんのでそこそこに割り引いてお読みください ね。 qmailの配送エージェントは qmail-send ってプログラムだ。 そもそも qmail はその本体だけでなく -send や -pop3d 、 -popup 、 -smtpd 、 -inject 、 -remote などという細かなソフトがそれぞれ分業して動作している。qmail-xxxxの前を省略して記載しました。 配送に関してはその qmail-sendだ。 そのパラメーターを調べてみる。ここ リトライに関する項目でみつけられるのは一つだけ。転記させて頂く。 queuelifetime -- [604800 (7日)] -- キューに滞在できる秒数
さてかつさんの記載に照らし合わせると ・xx分間隔で再送 一項目だけは分かったぞ。 でもかつさんにならって一日にしてしまおう。 3日も4日もたって届かなかったよ、ってエラーメールが帰ってきても困るし。 【操作】 ファイル qmailの再起動手順、ここは手順書のページではないけど書いておこう。 pa aux | grep qmail で表示された qmail-send のプロセスIDを覚えておいて kill -HUP プロセスID これでOK ・xx分間隔で再送 こうなった。 以上で報告は終わりです、かつさん。
いいのかな?そこまででいいのか?
間隔はどうなのかな?
sendmailに負けた気がした。 間隔は、そうだ、サンプルがあった。 ここのところ仮称 j-p の携帯宛メールがしばしば蹴られている。先方のサーバが忙しいらしい。 そのリトライの情報がちょうど手元にあった。 エラー表示の時間は 22:45 それぞれインターバルとして差を算出すると 7分 こんなところでいいでしょうかねぇ〜 すっきりしない。 本格的に調査を開始しよう。調べるところは一つ、見たくないけど・・・・・・・・・そうだよ、ソースだよっ qmail-send.c みます。 ソース冒頭にインターバルタイムについて幾つか宣言されている。 SLEEP_TODO 1500 /* check todo/ every 25
minutes in any case */ よくわからない。 ソースをもう一度見直す。 インターバルを static datetime_sec squareroot(x) /* result^2
<= x < (result + 1)^2 */ y = 0; yy = 0; この関数で計算しているのがわかる。 しかたない、これを検証してみるとしよう。 さてそうすると、このルートのインターバルを使った関数をあちこち拾い集め、統合すると次の式にまとめられる。 Interval=B+(20+sqrt(A-B))^2 でも式がわかったから、先のJ-P宛のリトライと比較して、一致する変数を探してみればいいですね。 簡単です。こういう時にはExcelって最高です。 Aをゼロ(なんでゼロだかはわかりません) Bを for(B=0;;B+=800) とする
ぴったり一致です。そうです。qmailはこうやって初期のリトライインターバルを算出していたんですねー多分。 ソースコード最初の定義ってどこで聴いているのかわかりません。 とりあえずここまでわかったので、ちょっと満足しました。 ・上記の可変インターバルで再送 不明なところがありますが、報告を終了させていただきます。 2002.7.29 追記 どこかで見つけました。インターバルのリストです。 http://www.lamer.de/maex/creative/software/qmail/times.html |
||||||||||||||||||||||