qmailanalogなどでログを管理していると、ボトルネックが見えてくる。では、ボトルネックを改善するにはどうすればよいのだろうか? 今回は、qmailのさまざまなチューニング方法を紹介する。
前回紹介したqmailanalog/qmailmrtg7はお試しいただけたでしょうか。こうしたツールを有効に使ってqmailサーバの稼働状況を適切に把握できるようになれば、サーバの増強計画も根拠のあるものとなり、より具体的に計画を遂行できます。恵まれた状況であればメモリやCPUを増設することも、バックボーンをより高速なものに移行することも可能ですが、多くの場合は思いどおりに運ばないものです。そこで、まずはqmailの設定を見直すところから始めましょう。
qmailでは、メッセージの送受信を処理するプロセスの同時起動数の上限が決められています。ローカル配信を処理するプロセスは「10」、リモート配信は「20」に制限されています。
安易にこれらの値を上げる前に、現状でどれくらいのプロセスが使用されているかを確認します。daemontoolsのmultilogを使用している場合もsplogger経由でsyslogdを使用している場合も、qmail-sendのログに次のような記録を見つけることができます。
@400000003d4e760b0bXXXXXX status: local 0/10 remote 0/20
上記のメッセージは、次のような意味を持ちます。
status: local l/L remote r/R ...
l | ローカル配信待ちプロセス数 |
---|---|
L | ローカル配送を同時に行う最大数 |
r | リモート配信待ちプロセス数 |
R | リモート配送を同時に行う最大数 |
ここで、配信待ちプロセス数が上限に近い値であるようなら、/var/qmail/controlディレクトリ下に次のファイルを作成し、上限値を上げます(注)。
それぞれの上限を120以上にする場合は、qmailのmake時にconf-spawnファイルを修正し、再度インストールし直すことで、最大255プロセスまで対応できます。ただし、120プロセスでも相当数のメッセージを処理できるため、これ以上の調整は当然ながらサーバやネットワークといったリソースの許容量も同時に上げることが前提になってきます。
具体的にどの程度の性能とスループットが必要かを一概に論じることはできませんが、こういうときこそqmailanalog/qmailmrtg7の結果を反映させるように段階を踏み、徐々に調整を行います。適正量以上の薬が体によくないように、むやみにプロセス数の上限を上げても、サーバやネットワークがそれに見合っていなければ、かえってボトルネックを発生させることになるので注意が必要です。
状況によっては、255以上のプロセスを同時に立ち上げてメッセージの処理を行わせたい場合もあるでしょう。255以上のプロセスを立ち上げるには、qmailのインストール時にパッチを当てる必要があります。Johannes Erdfelt氏の提供するbig-concurrency.patch(http://www.qmail.org/big-concurrency.patch)ファイルを利用すると、最大65000プロセスまで上限を引き上げることが可能です。
インストールは次のとおり、qmail-1.03のソースを展開したディレクトリでパッチを適用します。
# patch -p1 < パッチを保存したディレクトリ/big-concurrency.patch
big-concurrency.patchを当てると、chkspawn.c、conf-spawn、qmail-send.c、spawn.cファイルが書き換えられます。conf-spawnには「1000」が指定されます。ただし、実際のインストールではファイルディスクリプタの制限で「509」が最大になるため(注)、修正します。
509
以降は、第1回 qmailによるSMTPサーバの構築を参考に再インストールを行います。
ここまで上限を上げると、OS自体の制限や限界を加味する必要があります。まずulimitコマンド(Cシェル系はlimitコマンド)で現在の制限値を確認します。
# ulimit -a core file size (blocks) 1000000 data seg size (kbytes) unlimited file size (blocks) unlimited max locked memory (kbytes) unlimited max memory size (kbytes) unlimited open files 1024 pipe size (512 bytes) 8 stack size (kbytes) 8192 cpu time (seconds) unlimited max user processes 4095 virtual memory (kbytes) unlimited
# ulimit -a core file size (blocks) 1000000 data seg size (kbytes) unlimited file size (blocks) unlimited max locked memory (kbytes) unlimited max memory size (kbytes) unlimited open files 1024 pipe size (512 bytes) 8 stack size (kbytes) 8192 cpu time (seconds) unlimited max user processes 2048 virtual memory (kbytes) unlimited
# limit cputime unlimited filesize unlimited datasize unlimited stacksize 8192 kbytes coredumpsize 1000 kbytes memoryuse unlimited descriptors 1024 memorylocked unlimited maxproc 4095 openfiles 1024
プロセス数の上限(max user processesまたはmaxproc)がカーネル2.4系では4095、カーネル2.2系では2048に制限されているのが分かります。これらの値以上にconcurrencylocal/concurrencyremoteを設定しても、有効にならないので注意が必要です(コラム「カーネルのプロセス制限」参照)。
OS自体のプロセスの上限を上げるには、ulimit(Cシェル系はunlimit)コマンドを次のように使用します。ただし、これが有効なのはroot権限で起動されたプロセスだけで、一般ユーザーによる起動では制限を拡張できません。
# ulimit
# unlimit maxproc
同時プロセス数の上限変更を一般ユーザーでも有効にするには、カーネルを再構築する必要があります。カーネルが2.2系の場合は、/usr/src/linux/include/linux/tasks.hファイルの下記の部分を書き換えます。
#define MAX_TASKS_PER_USER XXXX
ヘッダファイルを書き換えたら、カーネルを再構築します。
カーネル2.4系ではコードによる同時プロセス数の制限が解除されており、必要なだけ拡張可能です。ただし、long integerの範囲(2147483647)内です。拡張するには、/proc/sys/kernel/threads-maxファイルに必要な値を書き込みます。
qmail-sendやqmail-sendをトリガに起動されるリモート/ローカルそれぞれの配信プロセスは、前述の方法で上限を上げることができます。そのほかのプロセスはどうでしょうか?
inetdやxinetdを利用してqmail-pop3dやqmail-sendを制御している場合は、inetd/xinetdを効率よく動作させる必要があります。ただ、本連載を読んでいただいている方の多くはtcpserverを利用されていることと思います。
tcpserverにも同時起動可能プロセス数の上限があります。ログを見ると、
@400000003d50ebf218XXXXXX tcpserver: status: 0/40
のように、tcpserverの同時接続数の上限が40であることが分かります。これは、tcpserver起動時に-cオプションを指定することで変更可能です。
参考:第1回 qmailによるSMTPサーバの構築「tcpserverのインストールとcdbの作成」
Copyright © ITmedia, Inc. All Rights Reserved.