さとうです。 CentOS7.5でPostfix-3.4.6(tarballからインストール)とmilter-manager-2.1.5(yumでインストール)を利用して、ウイルスチェック用のmilterと、milter-managerが提供するmilterのライブラリを利用して作った独自のmilterとを、多段に使ったシステムを構築しています。 負荷テストをしていたときに、2段めにある独自milterが処理されずに素通りされるケースがあり、その解決方法について相談させてください。 再現する条件を簡単にするため詰めていったところ、milter-manager経由で、milterのライブラリを利用したごく単純なmilterが1段だけであっても、同時アクセス数がある程度以上だとこの状況が起こることが確認できました。 以下、テスト用設定ファイルとmilterのコードです。 milter-manager.local.conf --- define_milter("test-milter") do |milter| milter.connection_spec = "inet:20025 @ localhost" milter.fallback_status = "temporary-failure" end --- test-milter.rb --- require 'milter' class Session < Milter::ClientSession def initialize(context) super(context) @subject = "" end def header(name, value) case name when /Subject/i @subject = value end end def end_of_message puts("TEST: " + @subject) $stdout.flush change_header("Subject", 1, "[TEST] " + @subject) end end command_line = Milter::Client::CommandLine.new command_line.run do |client, _options| client.register(Session) end --- test-milterは下記のように起動しています。 --- ruby test-milter.rb -s inet:20025 -v --- このmilter-managerを経由する設定にしたメールサーバ対して、同時に20件くらいのメールを投げると、20件中15件くらいはSubjectに[TEST]とつくものの、5件くらいが素通りしてしまいます。 素通りする件数や、何件目が素通りするかはこれという法則性はみつけられませんでした。 最初、簡単なスクリプトでlocalhostから、シーケンシャルにpostfixにメールを投げてテストしていたのですが、その際にはすべて問題なく処理がされていました。 その後、負荷を掛けるため、外のpostfixを経由して一気に100件とか投げたときにこの問題が発見されました。同時送信件数を減らしていって10~20件程度でも出ることがわかりました。 そのことから、同時処理件数が一定数以上であることがこれが起きる条件ではないかと考えています。 その際のmilter-managerのログを確認すると --- [children][error][message-processing] None of milters are processing message. [leader][error] None of milters are processing message. --- のエラーがでており、素通りしてしまった件数に近い数だけこのエラーが対で出ています。 上記エラーは以前MLで、spamass-milterの話で出たことがありましたが、今回の場合、呼ばれる独自milterには条件がかかっていないこと、少し負荷が掛かったときだけ出ること、などからまた違う理由なのではないかと思いました。 なにか解決に至るヒントがあれば教えて下さい。 あと別件と思うのですが、この件を調べているときに、いくつか気にかかったことがりましたので、下記に質問です。 - ドキュメントには「temporary-failure」とあるが、ソース見ると「temporary_failure」が正しい?どっちで書いてもshow-configすると「temporary-failure」になるからどっちでもいい? - 「profile」っていうログレベルは存在しない?ドキュメントには記述があるがソースにはない気がする。 - milterを書くチュートリアルでは「milter/client」をrequireしているが、milter-test-client.rbでは「milter」をrequireしている。どちらでも動いたが、どちらを使うのが良いのか。 -- 佐藤 潔 (Kiyoshi SATOH) <satoh****@hakub*****>