連載
» 2002年08月20日 00時00分 UPDATE

実用qmailサーバ運用・管理術(11):qmailのパフォーマンス・チューニング (1/2)

qmailanalogなどでログを管理していると、ボトルネックが見えてくる。では、ボトルネックを改善するにはどうすればよいのだろうか? 今回は、qmailのさまざまなチューニング方法を紹介する。

[鶴長鎮一,@IT]

 前回紹介したqmailanalog/qmailmrtg7はお試しいただけたでしょうか。こうしたツールを有効に使ってqmailサーバの稼働状況を適切に把握できるようになれば、サーバの増強計画も根拠のあるものとなり、より具体的に計画を遂行できます。恵まれた状況であればメモリやCPUを増設することも、バックボーンをより高速なものに移行することも可能ですが、多くの場合は思いどおりに運ばないものです。そこで、まずはqmailの設定を見直すところから始めましょう。

配信処理の上限を上げる

qmailのローカル/リモート配信プロセス数

 qmailでは、メッセージの送受信を処理するプロセスの同時起動数の上限が決められています。ローカル配信を処理するプロセスは「10」、リモート配信は「20」に制限されています。

 安易にこれらの値を上げる前に、現状でどれくらいのプロセスが使用されているかを確認します。daemontoolsのmultilogを使用している場合もsplogger経由でsyslogdを使用している場合も、qmail-sendのログに次のような記録を見つけることができます。

@400000003d4e760b0bXXXXXX status: local 0/10 remote 0/20
/var/log/qmail/currentの例

 上記のメッセージは、次のような意味を持ちます。

status: local l/L remote r/R ...
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のインストール時にパッチを当てる必要があります。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
conf-spawn

 以降は、第1回 qmailによるSMTPサーバの構築を参考に再インストールを行います。

注:ファイルディスクリプタの制限を上げるには、次のファイルの該当個所を変更します。変更に際しては、各ファイルのオリジナルを別名で保存しておくことをお勧めします。

/usr/include/bits/types.h
#define __FD_SETSIZE 2048

qmailソース中の/conf-cc
cc -O2 -D__FD_SETSIZE=2048

OSに対する拡張

 ここまで上限を上げると、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
Bシェル系でTurbolinux 8(カーネル2.4系)の場合
# 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
Bシェル系でTurbolinux 6.x(カーネル2.2系)の場合
# limit
cputime         unlimited
filesize        unlimited
datasize        unlimited
stacksize       8192 kbytes
coredumpsize    1000 kbytes
memoryuse       unlimited
descriptors     1024
memorylocked    unlimited
maxproc         4095
openfiles       1024
Cシェル系でTurbolinux 8(カーネル2.4系)の場合

 プロセス数の上限(max user processesまたはmaxproc)がカーネル2.4系では4095、カーネル2.2系では2048に制限されているのが分かります。これらの値以上にconcurrencylocal/concurrencyremoteを設定しても、有効にならないので注意が必要です(コラム「カーネルのプロセス制限」参照)。

コラム カーネルのプロセス制限

 OS自体のプロセスの上限を上げるには、ulimit(Cシェル系はunlimit)コマンドを次のように使用します。ただし、これが有効なのはroot権限で起動されたプロセスだけで、一般ユーザーによる起動では制限を拡張できません。

# ulimit
Bシェル系の場合
# unlimit maxproc
Cシェル系の場合

 同時プロセス数の上限変更を一般ユーザーでも有効にするには、カーネルを再構築する必要があります。カーネルが2.2系の場合は、/usr/src/linux/include/linux/tasks.hファイルの下記の部分を書き換えます。

#define MAX_TASKS_PER_USER      XXXX
XXXXに上限を指定

 ヘッダファイルを書き換えたら、カーネルを再構築します。

 カーネル2.4系ではコードによる同時プロセス数の制限が解除されており、必要なだけ拡張可能です。ただし、long 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にも同時起動可能プロセス数の上限があります。ログを見ると、

@400000003d50ebf218XXXXXX tcpserver: status: 0/40
/var/log/smtpd/currentの例

のように、tcpserverの同時接続数の上限が40であることが分かります。これは、tcpserver起動時に-cオプションを指定することで変更可能です。

参考:第1回 qmailによるSMTPサーバの構築「tcpserverのインストールとcdbの作成」

       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。