PRECSの佐々木です。
弊社ではECを主軸にサービスを展開しており、弊社サービスを利用する顧客向けに月間1億通超のメールを取り扱っています。
大量メールを一定時間内に配信するには、高速にメールを配信できるメールサーバーが不可欠です。
弊社では postfix をチューニングし、1 VMあたり100万通/時超の性能のメールリレーサーバーを構築し運用しておりますが、postfixでメールを高速に配信するためのノウハウについて何回かに分けて順次公開いたします。
まずは第1回として、postfixのqueue_directoryをtmpfsに配置する方法について記載いたします。
queue_directory を tmpfs に配置する理由
queue_directory を tmpfs に配置する理由はI/Oボトルネックを減らすためです。
tmpfsは物理メモリ及びスワップ領域を含む仮想記憶上に作成されるファイルシステムです。
メモリ上に配置されるためHDDやSSDに比べ、高速なRead/Writeが行えます。
1時間に100万通超のメール配信を行うには単純計算で、毎秒278通以上のメールをキューに格納する必要があります。
postfixは状態毎に複数のキューがあり、1通のメールを単純に配信するだけでも incoming → activeの遷移を辿り、遅延がある場合は更に active → deferred → active の順に遷移します。
キューに格納されたメールはファイルシステム上に書き込まれるため、Write → Read → Deelete だけで1つのキューにつき単純計算で3回、ファイルやディレクトリを管理しているinodeへのRead/Writeも考慮すると更に複数回のI/Oが発生することになります。
postfixのqueue_directoryをtmpfsに設置することで、I/Oボトルネックを減らし高速化することができます。
又、SSDではなくメモリ配置することで、ストレージの長寿命化も期待することができます。
環境
今回は下記環境で説明します。
- CentOS 7.x
- postfix 2:2.10.x (baseリポジトリ)
設定
1. tmpfs のマウント設定
まず tmpfs のマウントポイントとなるディレクトリを作成します。
sudo mkdir -p /var/tmpfs
次に tmpfsをマウントポイントとなるディレクトリにマウントします。
sudo mount -t tmpfs tmpfs -o rw,noatime,nodiratime /var/tmpfs
マウントできました。
起動直後にマウントされるように、 /etc/fstab にエントリーを記載します。
tmpfs /var/tmpfs tmpfs rw,noatime,nodiratime 0 0
尚、実際に運用している環境ではオプションでsizeも指定していますが、多くの環境で試されることも考慮して上記例では外しています。
必要に応じて適宜記載ください。
2. queue_directory の設定
次にpostfixの設定を変更し、queue_directoryをtmpfsファイルシステム上のディレクトリに設定します。
queue_directory は /etc/postfix/main.cf に設定を記載します。
main.cfには、下記のように記載します。
queue_directory = /var/tmpfs/postfix
main.cfの書き換えはエディタで直接行うこともできますが、設定変更を行うコマンドとしてpostconfコマンドが用意されているため、postconfコマンドでの設定方法で説明します。
sudo postconf queue_directory=/var/tmpfs/postfix
3. queue_directory の初期化
次に queue_directory を初期化します。
tmpfs の場合、再起動後は動作に必要なディレクトリが消えてしまうため、再実行できるようにバッチスクリプトとして用意しておきます。
今回は例として、 /usr/local/sbin/postfix_spool_init.sh にバッチスクリプトを作成することにします。
postfix_spool_init.sh に下記のように記載してください。
#!/bin/bash
mkdir -p /var/tmpfs/postfix
chmod 755 /var/tmpfs/postfix
postfix check
/usr/local/sbin/postfix_spool_init.sh に配置し、実行権を追加します。
sudo cp postfix_spool_init.sh /usr/local/sbin/postfix_spool_init.sh
sudo chown root:wheel /usr/local/sbin/postfix_spool_init.sh
sudo chmod +x /usr/local/sbin/postfix_spool_init.sh
queue_directory 初期化のためバッチスクリプトを実行します。
sudo /usr/local/sbin/postfix_spool_init.sh
4. postfix 起動時に queue_directory を初期化する
postfix 起動時に queue_directory が初期化されるように設定します。
sudo systemctl edit postfix
下記設定を記載します。
[Service]
PIDFile=/var/tmpfs/postfix/pid/master.pid
ExecStartPre=-/usr/local/sbin/postfix_spool_init.sh
上記で postfix 起動時に queue_directory が初期化されるようになります。
おわりに
以上、postfix で高速配信を行うチューニングの方法として、 queue_directory を tmpfs に設置する方法について記載いたしました。
高速配信チューニングについては多数記事を書けるネタがあるため、今後も順次記載していこうと考えています。