メール送信サーバの負荷試験を行うに辺り、受信用メールサーバでのメール処理がボトルネックになるとメール送信サーバ側でメールが滞留してしまい性能を正しく測ることができません。
受信用のメールサーバを大量に用意して分散する前に、まずは単体のメールサーバのパフォーマンスを最大限まであげ、解決しない場合に初めて増設を検討します。
負荷テストにおいて受信用メールサーバで注意したいこととして、
大量にメール受信した場合に、I/Oがボトルネックにならないようにする必要がありますので今回はこの問題を解決し、その他Linux Kernelやpostfixのチューニングに関しては割愛致します。
今回受信用メールサーバの構成は以下になります。
OS: CentOS 8.3
Middleware: postfix-3.3.1
1. postfix設定
まずはPostfixのメールスプール処理でI/Oが発生しないように/var/spool/postfixをtmpfsに設置し、メモリ上で処理します。
1-1. tmpfsを/mnt/spoolにマウント
# mkdir /mnt/spool
# mount -t tmpfs -o size=256M tmpfs /mnt/spool
1-2. postfixのメールスプール保存先にtmpfsを指定。
--- /etc/postfix/main.cf.orig 2020-12-19 16:18:47.264686621 +0900
+++ /etc/postfix/main.cf 2020-12-19 16:19:34.745687975 +0900
@@ -28,7 +28,8 @@
# See the files in examples/chroot-setup for setting up Postfix chroot
# environments on different UNIX systems.
#
-queue_directory = /var/spool/postfix
+#queue_directory = /var/spool/postfix
+queue_directory = /mnt/spool/postfix
# The command_directory parameter specifies the location of all
# postXXX commands.
1-3. postfixのPIDファイル保存先を変更します
--- /usr/lib/systemd/system/postfix.service.orig 2020-12-19 16:25:11.974758482 +0900
+++ /usr/lib/systemd/system/postfix.service 2020-12-19 16:25:36.594764623 +0900
@@ -5,7 +5,7 @@
[Service]
Type=forking
-PIDFile=/var/spool/postfix/pid/master.pid
+PIDFile=/mnt/spool/postfix/pid/master.pid
EnvironmentFile=-/etc/sysconfig/network
ExecStartPre=-/usr/libexec/postfix/aliasesdb
ExecStartPre=-/usr/libexec/postfix/chroot-update
1-4. postfixを起動
systemctl daemon-reload
systemctl start postfix
2. メールボックスへのメールを保存しない
次に受信したメールをメールボックスに保存せずに/dev/nullに捨てる専用アカウントを用意します。
2-1. devnull@[DOMAIN]へメールを/dev/nullに捨てる
devnull: /dev/null
## /etc/aliase.dbへ反映
# newaliases
3. メールログをtmpfsに移動
大量のメール受信時にはメールログへの書き込みにも配慮が必要ですので、メールログもtmpfsへ書き込みます。
3-1. rsyslogの設定変更
--- /etc/rsyslog.conf.orig 2020-09-30 22:19:06.000000000 +0900
+++ /etc/rsyslog.conf 2020-12-19 16:55:48.292582516 +0900
@@ -57,7 +57,7 @@
authpriv.* /var/log/secure
# Log all the mail messages in one place.
-mail.* -/var/log/maillog
+mail.* -/mnt/logs/maillog
# Log cron stuff
3-2. メールログを/mnt/logsへ出力
# mkdir /mnt/logs/
# systemctl restart rsyslog
# systemctl restart postfix
設定はここまでで完了。
メール送信サーバからdevnull@[メール受信サーバのドメイン]へメールを送信し、I/Oが発生しないことを確認して下さい。
以上です。