qmailとPostfixのパフォーマンス比較

今の環境がqmailで、今後どちらを使うか?と言われるとPostfixなのですが、心置きなく移行するために速度の比較を行ってみました。ベンチを取るならPostfixsmtp-sourceというソフトがついているのですが、実際に送信した時のパフォーマンスが見たかったので、実験サーバ計4台とDNSを立ち上げて普通の環境に近い形で比較しました。

実験環境(送信サーバ)

  • OS:CentOS5.2(素カーネル2.6.18)
  • CPU:Xeon X3220 2.4GHz core*4
  • メモリー:4GB
qmail-1.03
  • /var/qmail/control/concurrencyremote
  • /var/qmail/control/concurrencylocal

上二つを120で作成し、配送プロセス数の上限を120にしました。

postfix-2.3.3-2
  • default_process_limit = 100

をmain.cfに追加しました。プロセス数は100。他、パフォーマンスに影響ありそうな項目はデフォルトのままです。

メール送信スクリプト
#!/usr/bin/perl

$from = "test@from.local";
$to = "test@send1.local";

for($i=0;$i<100;$i++){
   $data = $data."012345678901234567890123456789012345678901234567890123456789012345678901234567890\n";
}
for($i=0;$i<4000;$i++){
   open MAIL, "| /usr/sbin/sendmail -f $from -t $to ";
   print MAIL "From: $from\n";
   print MAIL "Subject: This is a test mail.\n";
   print MAIL "\n";
   print MAIL "$data";
   close MAIL;
}

約9KBのメールをでっち上げてます。

実験1 4000通の送信

同一サブネットのローカルサーバ1台宛に送信スクリプトを実行します。ループは4000回なので4000通の送信です。サーバのスペックは同一で、受信MTAはデフォルトのsendmailです。どちらも余計なプロセスは走ってませんし、帯域も余裕です。

同じ結果になりました。キューに入らずに送信されちゃったので、送信プロセスの限界っぽい。

実験2 2000通×3の送信

サーバを2台追加して、3台宛に送信してみます。ループは各2000なので合計6000通。送信プロセスは3つになります。

  • qmail  132秒
  • postfix 37秒

約3倍の差がつきました。postfixの結果が実験1より良いのはマルチプロセスで送信しているからでしょう。

実験3 4000通×3の送信

実験2と同じ環境で送信数を4000通に変更します。合計12000通

  • qmail  274秒
  • postfix 83秒

こちらも約3倍の差です。

実験4 4000通×1の正常系と4000通×2の異常系

環境は実験3と同じで、2台宛のアドレスを無効にしてバウンスメールを受け取ります。12000通送信し、8000通のローカル配送を受け取ることになります。

  • qmail  571秒
  • postfix 187秒

これも3倍差か〜

まとめ

そんなわけで、Postfixの方が優秀という結果になりました。サーバ負荷もPostfixの方が軽めです。qmailはキューに格納する時のオーバヘッドが大きいような気がします。全てがキューに格納されてしまえば後は早いのですが。

実験2で6000通送信した時のmaillogを使って秒間送信数のグラフを作りました。大量のメールを捌くならPostfixが圧倒的に有利です。