使用しているdovecotのバージョンは以下の通り。
# dovecot --version
2.0.9
CentOS 6マシンで動作させている。
■DovecotへのIMAP接続でタイムアウトする問題への対処
ThunderbirdをIMAPサーバー(dovecot)のクライアントとして使用していたところ、
Thunderbird側で当IMAPサーバーとのコネクションがタイムアウトする問題が生じた。
これについて、dovecotのログ(/var/log/maillog)を見てみると問題の生じた時刻に次の問題が発生していることがわかった。
dovecot: master: Warning: service(imap-login): process_limit reached, client connections are being dropped
ようするに、dovecot側でのチューニングが甘かったということだ。
この問題に対処するために、次のファイルの項目を編集し、dovecotを再起動した。
# vi /etc/dovecot/conf.d/10-master.conf
service imap-login {inet_listener imap {#port = 143}inet_listener imaps {#port = 993#ssl = yes}# Number of connections to handle before starting a new process. Typically# the only useful values are 0 (unlimited) or 1. 1 is more secure, but 0# is faster. <doc/wiki/LoginProcess.txt>#service_count = 1service_count = 0# Number of processes to always keep waiting for more connections.#process_min_avail = 0# If you set service_count=0, you probably need to grow this.#vsz_limit = 64Mvsz_limit = 256M}
(説明)
◯ service_count は、ログインを司るサービスにおいて、「performance mode」と、「secure mode」とを切り替えるための値を設定する。
今回は、デフォルトの設定値「1」で、process_limit reached が警告されIMAP接続ができなくなる問題が発生したわけである。
そこで、次のようにパフォーマンスモードに切り替えた。
「0」を設定することによって、パフォーマンスモードとなる。
これにより全てのコネクションが単一インスタンスで処理されるようになる。
(次に挙げる、セキュアモードに比べるとセキュリティーは強くない。)
一方、「1」に設定すれば、セキュアモードとなる。
クライアントからのコネクションは、一つ一つ別々のインスタンスで処理される。
クライアントが切断するまでインスタンスは残り続けるため、上限が存在する。
これを超過すると、process_limit に到達したとの旨が警告され、新しい接続が拒絶される。
今回はこの問題が発生し、クライアントからの接続がタイムアウトしたのだった。
◯ vsz_limit は、万が一メモリリークが発生した場合に備えてプロセスが使用できる上限を設定するものである。これを超過するプロセスはカーネルによってkillされる。
パフォーマンスモード に切り替える場合は、これにより上限を設定しておいたほう良い。
設定値がわからないので、とりあえずデフォルトの64MBの4倍の量とした。
利用環境により設定値を変える必要があるだろう。
そして、dovecotを再起動した。
# service dovecot restart
Stopping Dovecot Imap: [ OK ]Starting Dovecot Imap: [ OK ]
■Inotify instance limitを超過したとの警告への対処
上記のクライアントからの接続不能問題とは関係なさそうだが、
さらに、/var/log/maillogに、他にも次のような警告を見つけた。
dovecot: imap([email protected]): Warning: Inotify instance limit for user 5000 (UID vmail) exceeded, disabling. Increase /proc/sys/fs/inotify/max_user_instances
警告は、/proc/sys/fs/inotify/max_user_instances の値を増やせと伝えている。
まず値を調べた。
# cat /proc/sys/fs/inotify/max_user_instances
128
Inotify とはファイルやディレクトリの変更を監視する仕組みである。
何か変更があればカーネルから通知をもらえる。詳細はわからないが、dovecotはこの仕組みを利用しているのだろう。
上記警告は、vmailユーザーに関するInotifyのためのリソースが設定限度を超過したとのことである。
たとえば、vmailユーザーのプロセスにより上流からdovecotはメールを受け取っているとすると、vmailユーザーのプロセスのディスクへの書き込み変更がdovecotに通知される必要があるだろう。
こういう仕組みが機能しない状態になれば何か困ることがあるに違いない。
さて、どのくらい増加させればよいかよくわからない。
設定手順は次のファイルを編集(行の追加)して、読み込ませる。
# vi /etc/sysctl.conf
fs.inotify.max_user_instances = 512
# sysctl -p
そして、dovecotを再起動した。
# service dovecot restart
Stopping Dovecot Imap: [ OK ]Starting Dovecot Imap: [ OK ]
設定値を変更した後、ログの警告が消えるかどうか調べ、値を調整するとよいと思う。
また今度、対処することにしよう。
■
ところで、次のコマンドでは上記以外の警告は見つけられなかった。
# grep Warning /var/log/maillog* | grep -v max_user_instances | grep -v process_limit | less
<参考>
・Dovecot: “Warning: service(imap-login): process_limit reached, client connections are being dropped”
< https://serverfault.com/questions/629612/dovecot-warning-serviceimap-login-process-limit-reached-client-connection > 2021年5月26日
・service(imap-login): process_limit (100) reached (bug?)
< https://talk.plesk.com/threads/service-imap-login-process_limit-100-reached-bug.337563/ > 2021年5月26日
・Dovecot performance tuning
< https://wiki.dovecot.org/PerformanceTuning > 2021年5月26日
・Problem: Dovecot Warns about “Inotify instance limit for user 120 (UID dovemail) exceeded”
< https://help.univention.com/t/problem-dovecot-warns-about-inotify-instance-limit-for-user-120-uid-dovemail-exceeded/13572 > 2021年5月26日
・Warning: Inotify instance limit for user 2000 (UID vmail) exceeded, di
< https://forum.iredmail.org/topic9653-iredmail-support-warning-inotify-instance-limit-for-user-2000-uid-vmail-exceeded-di.html > 2021年5月26日
・Unable to access mail: Warning: Inotify instance limit for user exceeded
< https://support.plesk.com/hc/en-us/articles/115002673113-Unable-to-access-mail-Warning-Inotify-instance-limit-for-user-exceeded > 2021年5月26日