このドキュメントはPostfix接続キャッシュの実装について記述しています。 これはPostfixバージョン2.2以降で使えます。
このドキュメントがカバーしている話題:
SMTP接続キャッシュを使うと、Postfixは同じSMTP接続で複数のメッセージを配送 することができます。デフォルトでは、ある配送先が active キューに大量のメールを 抱えていると、Postfix 2.2は自動的にSMTP接続を再利用します。
SMTP接続キャッシュはパフォーマンスの機能です。実際にパフォーマンスが 向上するかどうかは場合によります:
複数のメールサーバを持つ配送先にメールを配送する場合には、Postfixが 応答しないサーバを飛ばす助けとなるため、SMTP接続キャッシュによって大きく パフォーマンスが向上する可能性があります。
そうでなければ、SMTP接続キャッシュの利点は小さなものです: TCPハンド シェイク (SYN, SYN+ACK, ACK) のレイテンシをなくし、それに加えてSMTPの 最初のハンドシェイク (220 greeting, EHLO command, EHLO response) のレイテンシも なくします。
SMTPセッションの分解という点では、SMTP接続キャッシュには何の利点も ありません。Postfix smtp(8) クライアントは通常 QUIT コマンドに対するサーバの応答を待たず、TCPの最後のハンドシェイクが完了するのを 待つことは全くありません。
SMTP接続キャッシュにはいくらかオーバーヘッドが入ります: 接続がまだ 使えるかどうかを知るために、次の MAIL FROM コマンドを送る前にクライアントは RSET コマンドを送る必要があります。
それ以外の潜在的なSMTP接続キャッシュの問題点は、このドキュメントの最後にある 制限の議論を参照してください。
Postfixのメール配送方法の概要は、Postfixアーキテクチャの OVERVIEW ドキュメントを参照してください。
Postfix接続キャッシュはPostfixメール配送プロセス間で共有されます。 これにより開かれた接続を再利用する機会が最大化されます。Sendmailやeximの ような他の MTAには非共有型の接続キャッシュがあります。そこでは、接続を作った メール配送プロセスだけが接続を再利用できます。共有接続キャッシュと同じだけ パフォーマンスを向上させようとすると、非共有接続は長時間開き続ける必要が あります。
Internet <--
smtp(8)
<->
scache(8)
<->
smtp(8)
--> Internet
Postfixバージョン2.2で導入された scache(8) サーバは共有接続キャッシュを管理します。Postfixバージョン2.2では、 smtp(8) クライアントだけがこのキャッシュをサポート しています。
SMTP接続キャッシュが有効になっていると (次のセクション参照)、 smtp(8) クライアントはメール処理の後に接続を切らず、 接続を scache(8) サーバに渡し、 scache(8) サーバは限られた時間の間、接続を 開き続けます。
開いた接続を scache(8) サーバに引き渡した後、 smtp(8) クライアントは他のメール配送要求の処理を 続けます。その間、いずれかの smtp(8) クライアント プロセスが scache(8) サーバにキャッシュされた 接続を要求し、メール配送に再利用するかもしれません。
接続キャッシュは配送先のドメイン名 (受信者アドレスの右側部分) と接続先 ホストのIPアドレスによって検索されます。これにより、リモートホストが異なる 名前のドメインのメールサーバであってもPostfixが接続を再利用できるように なります。
Postfix smtp(8) クライアントは2つの接続 キャッシュ戦略をサポートしています:
オンデマンド接続キャッシュ。これはデフォルトで有効になっており、 smtp_connection_cache_on_demand 設定パラメータで制御されます。この機能が有効になっていると、ある配送先が active キューに大量のメールを 抱えている場合にPostfix smtp(8) クライアントは 自動的に接続を接続キャッシュに保存します。
例:
/etc/postfix/main.cf: smtp_connection_cache_on_demand = yes
配送先ごとの接続キャッシュ。これは smtp_connection_cache_destinations 設定 パラメータに明示的に特定の配送先をリストアップすることで有効になります。 選択された配送先への配送が終わると、Postfix smtp(8) クライアントは常に接続を接続キャッシュに保存します。
配送先または擬似配送先のリストをカンマまたは空白で区切って指定します:
メールがリレーホストを使わずに送られる場合: ドメイン名 (Eメール アドレスの右側部分、数字のIPアドレスで [] がついていないもの)、
メールがリレーホスト経由で送られる場合: リレーホスト名 ([] のないもの または非デフォルトTCPポート) で、main.cf や transport マップで指定されたもの、
ドメイン名の書かれた /file/name や上で指定されたようなリレー ホスト名、
ドメイン名やリレーホスト名が左側に書かれた "type:table"。 "type:table" 検索の右側部分の結果は 無視されます。
例:
/etc/postfix/main.cf: smtp_connection_cache_destinations = $relayhost smtp_connection_cache_destinations = hotmail.com, ... smtp_connection_cache_destinations = static:all (推奨できません)
接続キャッシュは広く使われなければいけません。使われないSMTP接続を長時間に わたって開き続けるのは非社会的で、また膨大な数のメッセージを同じ接続で 送るのは賢くありません。SMTP接続キャッシュの問題を避けるために、Postfixは 以下の安全機構を実装しています:
Postfix scache(8) サーバは限られた 時間だけ接続を開き続けます。この時間制限は smtp_connection_cache_time_limit および connection_cache_ttl_limit 設定パラメータで指定します。これにより非社会的な振る舞いをしないようにします。
Postfix smtp(8) クライアントは限られた 回数だけセッションを再利用します。これにより1つのセッションで複数の接続を 扱えない実装のバグに引っかからないようにします。利用回数は smtp_connection_cache_reuse_limit 設定パラメータで制限します。
接続キャッシュはキャッシュされた接続それぞれに明示的に配送先ドメインや IPアドレス情報といったラベルを付けます。接続キャッシュ検索は正しい情報が 指定されたときのみ成功します。これによりメールの配送ミスを防ぎます。
Postfix SMTP接続キャッシュはある種のアプリケーションと衝突します:
保存されたTLSセッション情報は新しい接続が作られたときにしか 使えないため、Postfix共有接続キャッシュはTLSでは使えません (この制限は 接続を作ったプロセスだけが接続を再利用する接続キャッシュ実装には存在 しません)。そのため、Postfix smtp(8) クライアントは TLSを使ったメール配送の試行が完了したら、常に接続を閉じます。
Postfix 接続キャッシュは現在1つのメールサーバに対しての複数の SASLアカウントをサポートしていません。具体的には、Postfix接続キャッシュは SASL証明書は同じメールサーバIPアドレスで同じTCPポートで配送するすべての ホスト名やドメイン名に対して有効であることと、SASL証明書はメッセージ 送信者に依存しないことを想定しています。
scache(8) 接続キャッシュサーバはキャッシュ サイズのピークやキャッシュのヒット率といった統計情報をログに記録します。 この情報は connection_cache_status_update_time 秒ごとと、 最大アイドル時間を超過してプロセスが終了するとき、Postfixがリロードされた ときに記録されます。
ドメインによる接続キャッシュ検索のヒット率によって、接続キャッシュが どれだけ有効かがわかります。
同じMXホストを共有する異なるドメインにメールを送っているのでなければ、 ネットワークアドレスによる接続キャッシュ検索は常に失敗します。
接続キャッシュへのアクセス試行がなければ、統計情報は記録 されません。