マルチプロセスについて
マルチプロセス機能は、PMailServer2本体(pmservice.exe)を複数起動し、処理を分散する為の機能となります。

- 各プロセスで接続できるクライアント数は、基本設定の同時接続数に準じます。
- シングルプロセスで起動した場合、SMTPの同時接続数が 100 の場合、接続できるクライアント数は最大 100 接続となります。
- マルチプロセスで起動した場合、SMTPの同時接続数が 100 でプロセス数が3の場合、接続できるクライアント数は最大 300(100接続xプロセス数)接続となります。
- 同時に起動できる子プロセス数は、スタンダード版で2(親プロセスを入れて3)、プロ版で5(親プロセスを入れて6)、エンタープライズ版で無制限となっています。
- 子プロセスの監視する
マルチプロセス時に子プロセスが起動しているか否かを確認し起動していない場合に、新しく子プロセスを起動させます。(監視と再起動は接続があった時点で行われます)
- 不応答時に子プロセスを再起動
マルチプロセス時に子プロセスがなんらかの理由によりフリーズ等をしている場合に該当する子プロセスのみを再起動します。
注意点としては、子プロセスを3つ起動している場合に、2つ目のプロセスで IMAP4プロトコルのみが応答しなかった場合、その時に SMTP に接続中の MUA があったとしても強制的に再起動されます。
なんらかの問題が発生した際に比較的短時間で対応できる場合は不要ですが、すぐにメンテナンスができない場合や、問題が発生しても極力サーバーを止めたくない等の場合に利用します。
- プロセス割当方式
マルチプロセスモード時の接続をどのように振り分けるかを指定します。(Pro版のみ。スタンダード版はシーケンシャルになります)
シーケンシャルとラウンドロビンのどちらを選択するか?の基準ですが、例えば接続数がさほど多くない場合は、パフォーマンス的にシーケンシャルの方が比較的高速に接続処理を行います。
ただし、1つのプロセスに接続が集中しますので、同時接続数を多く設定している場合に接続数が多いと1つのプロセスに負荷が集中します。
ラウンドロビンは、接続数が多い場合、上記の1つのプロセスにアクセスが集中することを分散することにより均等に負荷を分散することができます。
ただし接続数が少ない場合は、逐一各プロセスの状況を監視して分散処理を行う為、パフォーマンスが落ちる場合があります。
それぞれに一長一短があり、同時に起動するプロセス数、各プロセスで受け付ける接続数、実際に発生する同時接続数、ストレージや CPU パワーによって最適解は変わりますので、ご利用の環境に合わせて設定を変更して下さい。
各プロセスの役割について

- マルチプロセスモードの場合、各プロセスの役割(プロトコル)を指定することができます。(*1)
- 各プロセスともに SMTP/POP3 及び IMAP4(対応版のみ)が指定できます。
- 1つのプロセスに複数の役割を割り当てることが可能です。
- また、1つのプロセスに特定の役割のみを割り当てることも可能です。
設定のワンポイント
- 運営しているサーバーで負荷の多いプロトコルに多く割り当てることにより、その接続数を増やすことができます。
- 特に IMAP4 は1つのクライアントから複数の接続がある場合が多い為、IMAP4 に多く割り当てるなどが考えられます。
- 各プロトコルを複数割り当てることにより各プロトコルのバックアップにもなります。
例として(どのプロトコルも重要ですが)SMTPが停止した場合、外部からのメールが受け取れなくなります。多くの場合、再送信が行われますが、そのままメールが不達になる場合もあります。このようなケースの場合は SMTP に複数のプロセスを割り当てると 2nd プロセスがバックアップになります。
*1 MTA は最後のプロセスにのみ割り当てが行われ、これは変更することはできません。(サーバー全体で MTA 処理をするプロセスは1つのみとなります)
マルチプロセスモードの動作
- まず SCM(Service Control Manager)に登録された pmservice.exe が親プロセスとして起動します。
- 親プロセスとして起動した pmservice.exe が指定された数だけ、子プロセスとして pmservice.exe を多重起動します。
- 親プロセスは子プロセスの監視(*1)と接続の割り振りを行う為に待機状態になります。
- クライアントから接続があると、親プロセスが接続の割り振りを行い子プロセスに引き継ぎます。以降の処理は子プロセスが担当します。
(*1) 親プロセスは接続の度に子プロセスの生存確認を行います。もし子プロセスがなんらかの理由により終了している場合、子プロセスの再起動を行います。
- 親プロセスは各プロトコル処理は行いません。接続のみ担当します。
- 子プロセスは親プロセス以外からは接続を受け付けません。
割り振りはあくまでも親プロセスが担当します。
- 接続の割り振りは、プロセス割当方式に従い割当が行われます。
- マルチプロセスで起動した場合、MTA は最後のプロセスが担当します。
SMTP/POP3/IMAP4/MTA を有効にした状態でプロセス数に3を指定した場合
プロセス0(親プロセス) | 全ての接続のみを担当 |
プロセス1 | SMTP/POP3/IMAP4 を担当 |
プロセス2 | SMTP/POP3/IMAP4 を担当 |
プロセス3 | SMTP/POP3/IMAP4 と MTA を担当 |
接続は若いプロセスから優先的に埋められていく為、接続数がプロセス3まで必要にならない限りプロセス3は MTA のみに専念する形となります。
マルチプロセスのメリット・デメリット
PMailServer2 は1つのプロセスにつき各プロトコルで同時に 100接続(スレッド)まで受け付けるようになっています。
1つの PMailServer2 のプロセスは、全てのプロトコル及び MTA を有効にした状態で、最大 400スレッド+メインスレッド+ログチェックを利用している場合は+4スレッド、サービス管理用のスレッドが1、メーリングリストを使用している場合は1の最大400スレッド+αを使用します。(全てのプロトコルに同時に接続があった場合での最大値です)
Windows OS に搭載されているメモリや OS のエディション(32bit / 64bit)、他の実行されているアプリケーションの状況によって左右されますが、1プロセス辺り最大 2048スレッド(32bit版 Windows OS での理論値)まで生成できますが、現実として、ここまで生成した場合、非常に負荷が高くなる。各スレッドが非常に遅くなる等の理由により正常に動作しなくなります。
マルチプロセスを有効にする変わりに、1プロセス辺りのスレッド数を減らすことにより、各プロセスの負荷を減らし、また同時接続数を増やすことができます。
それ以外にも、1つのスレッドで致命的なエラーが発生した場合、プロセスが異常終了する場合がありますが、マルチプロセスにより、1つのプロセスが異常終了しても、引き続き他のプロセスが処理を続行することも可能となります。
ただし、マルチプロセスにすれば無制限に増やすことができる訳では無く、特にメールサーバーの場合は、ファイル I/O 処理が非常に大きいので(データベース等であれば、キャッシュする、オンメモリ等で処理を行う等ができますが、メールサーバーは、メールを受信したらディスクに保存しなければなりませんし、メールの送信や転送等で都度ファイルの生成等が必要になりますので、接続数の規模にあった形でのメモリや高速なストレージを用意する必要があります。
極端な例ですが、SSD上で同時に 100スレッド処理を行っても、FDD上で動かす 1スレッドよりも早い。ということになります。
ただし、マルチプロセスはメリットだけでは無くデメリットもありますので「必ずマルチプロセスが有利」という訳でもありませんので、ご注意下さい。
マルチプロセスに必要なスペック
どのプロトコルにどの程度の接続があり、且つ、どの程度の送受信が発生するかで変わってきますので、一概に「これくらいのスペックがあれば、これくらいの接続数を処理できます」という明確な答えがありません。
起動するだけであれば、最大数まで起動しても処理に問題はありません(無駄にメモリを消費するくらいです)

上記は、開発段階でのテスト中の様子ですが、CPU Corei3 (2.4GHz) / Memory 4G / Windows7 32bit / SSD(520GB) で、1Gbps での LAN接続を行った別の端末から、専用のストレスソフト(SMTP は接続、メール送信(1KByte)、切断。POP3 はメールボックス内の 20通のメールを全て受信。IMAP4 はメールボックス内の 20通のメールを FETCH しています)で負荷状況を確認している状態です。
右下にある数値は「同時接続数」になります。(注:IMAP4 が限界値500を超えているのはテスト版でプロセス数の限界を超えて設定できるようにしている為です。)
CPU 負荷も高くなりますが、100% に張り付くことはありませんでした。
ただし、前項にもありますようにストレージ速度の影響を大きく受けます。これが HDD である場合は、数値が下がる可能性があり、ネットワークドライブの場合は更に下がると思われます。
マルチプロセス機能での問題に関して
マルチプロセスモードはサーバー本体(親プロセス)から、サーバー本体(子プロセス)を起動し、各プロセスが同期を取って動作します。
起動状況は、Logs フォルダの作成される、startup.log に記録され、問題が発生した場合、発生場所によっては別途 Worker_error.log というファイルが生成されます。
問題点をご連絡頂く際には、上記2つ(Worker_error.log は無い場合もあります)を必ずお送り下さい。
これらのログファイルについてはファイル名は固定でローテートも行われません。サイズ自体は小さいのでそのままにしておいて頂いて問題はありませんが、不要であれば定期的に削除を行って下さい。
マルチプロセス機能を利用する際の注意事項
- マルチプロセスを利用する際に、プロセス間での共有の為、仮想メモリを利用します。
仮想メモリを使用しない設定になっている場合の動作保障はありませんのでご注意下さい。また起動に失敗する場合、仮想メモリの容量が足りない可能性があります。その場合は仮想メモリの最大値を増やしてください。
- マルチプロセスを利用する場合、各プロトコルごとのログファイルの先頭に2桁のプロセス番号が自動で付与されます。
ログの同期でパフォーマンスが落ちる為、現時点では、このログを1つにまとめることはしません。(将来的にオプションを追加するかもしれません)
- マルチプロセスを利用する場合、原則としてコマンドラインからのインストールは原則として行うことはできません。サーバーマネージャーからインストールを行って下さい。
- 設定にも寄りますが、マルチプロセスは多数のサーバー本体を起動する為、システムに大きな負担がかかる場合があります。アクセスの多い Web サーバーとの共有等を行う場合は注意して下さい。
CPU負荷が上がり、どちらもパフォーマンスが低下する場合があります。
- プロセス数を変更する場合は、サーバーを停止した後、サービスをアンインストールし、再度インストールを行って下さい。
- なんらかの理由により、親プロセス自身が異常終了した場合、子プロセスが起動したままになる場合があります。
そのまま親プロセスが再起動した場合、新たな子プロセスが起動しますが旧子プロセスはメモリ上に残ったままになります。
この場合は、親プロセスからの管理下から離れる為停止しません。タスクマネージャー等からプロセスの終了を行って下さい。
また、残った子プロセスですが、基本的になにもしません。(接続状態で親プロセスが異常終了した場合、その接続は維持されますが、新規の接続は受けません。)その為、残ったままの状態で、新規に起動する子プロセスには影響はしません。ただしメモリ上では起動したままになりますので、異常があった場合は、一旦サービスを停止して、残った子プロセスを停止させた後に、再度親プロセスを起動して下さい。
マルチプロセス機能を利用する際の FAQ
- Q1 タスクマネージャーでページフォルトが増え続けます。
- 正常な仕様です。Version 2.36a 以降、セッション管理部分を仮想メモリで共有する方式に変更した為、ページフォルトが以前よりも多く発生するようになっています。
ページフォルトは、元々物理メモリ中に無いデータを要求された場合に、仮想メモリへアクセスの為に発生する「割り込み」の事ですので、不具合ではありません。
- Q2 プロセスの最大数をもっと増やせませんか?
- 上位のエンタープライズ版のリリースを行いました。
エンタープライズ版はプロセスの起動数に制限はありません。
- Q3 マルチプロセスでお勧めの設定は?
- Windows OS としては、1プロセスで大量のスレッドを処理するよりも、1プロセスで処理するスレッド数を減らし、複数のプロセスを起動した方が安定します。
仮に、スタンダード版でシングルプロセスモードで、同時接続数を 100 にするよりも、マルチプロセスモードで同時接続数を 50 にして2プロセス起動した方が安定すると思われます。
また限界まで設定するのではなく、サーバーのスペックと比較し、余裕をもった設定をすることが安定動作に繋がります。(接続が多いからと言って、最大に設定するのでは無く、サーバーのスペックを超えると思われる場合は、潔くクライアントを拒否するのも1つの手です。1分1秒を争うメール受信というシチュエーションは殆ど無いのですから。)
- Q4 各プロセスの役割を設定できませんか?
- 予定済みです。時間が無いのです。Version 2.36b にて実装を行いました。
- Q5 ログファイル多すぎ。
- パフォーマンスが下がる前提で、まとめるようにするオプションを追加するかもしれません。Version 2.36e にてログファイルの分離を設定できるようにしました。