(1/2)qmailanalogなどでログを管理していると、ボトルネックが見えてくる。今回は、qmailのさまざまなチューニング方法を紹介する。});前回紹介したqmailanalog/qmailmrtg7はお試しいただけたでしょうか。したツールを有効に使ってqmailサーバの稼働状況を適切に把握できるようになれば、サーバの増強計画も根拠のあるものとなり、より具体的に計画を遂行できます。恵まれた状況であればメモリやCPUを増設することも、バックボーンをより高速なものに移行することも可能ですが、多くの場合は思いどおりに運ばないものです。そこで、まずはqmailの設定を見直すところから始めましょう。配信処理の上限を上げるqmailのローカル/リモート配信プロセス数qmailでは、メッセージの送受信を処理するプロセスの同時起動数の上限が決められています。ローカル配信を処理するプロセスは「10」、リモート配信は「20」に制限されています。安易にこれらの値を上げる前に、現状でどれくらいのプロセスが使用されているかを確認します。daemontoolsのmultilogを使用している場合もsplogger経由でsyslogdを使用している場合も、qmail-sendのログに次のような記録を見つけることができます。上記のメッセージは、次のような意味を持ちます。...lローカル配信待ちプロセス数Lローカル配送を同時に行う最大数rリモート配信待ちプロセス数Rリモート配送を同時に行う最大数ここで、配信待ちプロセス数が上限に近い値であるようなら、/var/qmail/controlディレクトリ下に次のファイルを作成し、上限値を上げます(注)。注:ファイルの変更後はqmailを再起動する必要があります。concurrencylocalローカル配送を処理するプロセスの同時起動数の上限を指定0を指定した際は、ローカル配送は停止されます。通常のqmailのインストールでは120までに制限されています。concurrencyremoteリモート配送を処理するプロセスの同時起動数の上限を指定0を指定した際は、リモート配送は停止されます。通常のqmailのインストールでは120までに制限されています。それぞれの上限を120以上にする場合は、qmailのmake時にconf-spawnファイルを修正し、再度インストールし直すことで、最大255プロセスまで対応できます。120プロセスでも相当数のメッセージを処理できるため、これ以上の調整は当然ながらサーバやネットワークといったリソースの許容量も同時に上げることが前提になってきます。具体的にどの程度の性能とスループットが必要かを一概に論じることはできませんが、こういうときこそqmailanalog/qmailmrtg7の結果を反映させるように段階を踏み、徐々に調整を行います。適正量以上の薬が体によくないように、むやみにプロセス数の上限を上げても、サーバやネットワークがそれに見合っていなければ、かえってボトルネックを発生させることになるので注意が必要です。状況によっては、255以上のプロセスを同時に立ち上げてメッセージの処理を行わせたい場合もあるでしょう。255以上のプロセスを立ち上げるには、qmailのインストール時にパッチを当てる必要があります。Erdfelt氏の提供するbig-concurrency.patch(http://www.qmail.org/big-concurrency.patch)ファイルを利用すると、最大65000プロセスまで上限を引き上げることが可能です。インストールは次のとおり、qmail-1.03のソースを展開したディレクトリでパッチを適用します。パッチを保存したディレクトリ/big-concurrency.patchbig-concurrency.patchを当てると、chkspawn.c、conf-spawn、qmail-send.c、spawn.cファイルが書き換えられます。conf-spawnには「1000」が指定されます。実際のインストールではファイルディスクリプタの制限で「509」が最大になるため(注)、修正します。qmailによるSMTPサーバの構築を参考に再インストールを行います。注:ファイルディスクリプタの制限を上げるには、次のファイルの該当個所を変更します。変更に際しては、各ファイルのオリジナルを別名で保存しておくことをお勧めします。-D__FD_SETSIZE=2048OSに対する拡張ここまで上限を上げると、OS自体の制限や限界を加味する必要があります。ulimitコマンド(Cシェル系はlimitコマンド)で現在の制限値を確認します。processesまたはmaxproc)がカーネル2.4系では4095、カーネル2.2系では2048に制限されているのが分かります。これらの値以上にconcurrencylocal/concurrencyremoteを設定しても、有効にならないので注意が必要です(コラム「カーネルのプロセス制限」参照)。カーネルのプロセス制限OS自体のプロセスの上限を上げるには、ulimit(Cシェル系はunlimit)コマンドを次のように使用します。これが有効なのはroot権限で起動されたプロセスだけで、一般ユーザーによる起動では制限を拡張できません。同時プロセス数の上限変更を一般ユーザーでも有効にするには、カーネルを再構築する必要があります。カーネルが2.2系の場合は、/usr/src/linux/include/linux/tasks.hファイルの下記の部分を書き換えます。XXXXXXXXに上限を指定ヘッダファイルを書き換えたら、カーネルを再構築します。7.xのカーネルを再構築するにはカーネル2.4系ではコードによる同時プロセス数の制限が解除されており、必要なだけ拡張可能です。integerの範囲(2147483647)内です。拡張するには、/proc/sys/kernel/threads-maxファイルに必要な値を書き込みます。qmail-pop3dやqmail-smtpdプロセス数qmail-sendやqmail-sendをトリガに起動されるリモート/ローカルそれぞれの配信プロセスは、前述の方法で上限を上げることができます。そのほかのプロセスはどうでしょうか?inetdやxinetdを利用してqmail-pop3dやqmail-sendを制御している場合は、inetd/xinetdを効率よく動作させる必要があります。本連載を読んでいただいている方の多くはtcpserverを利用されていることと思います。tcpserverにも同時起動可能プロセス数の上限があります。0/40/var/log/smtpd/currentの例のように、tcpserverの同時接続数の上限が40であることが分かります。これは、tcpserver起動時に-cオプションを指定することで変更可能です。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。