IMAPサーバを動かしているサーバのロードアベレージが70ぐらいになって、大変なことになっていた。
- IMAPサーバ:dovecot-0.99.11-9.EL4 (ファイルシステムext3)
- IMAPクライアント:2.0.0.17
状況は、ps axuするとIO待ちのimapプロセスが大量に存在する。
原因がわかったので、書いておく。
今回の場合、Trashフォルダに数万件のメールがあり、何かのメールを削除するとThunderbirdがTrashフォルダに
新規スレッドでアクセスする。
ファイルが大量にあるMaildirを見ると以下のように、ディレクトリ自体の容量が大きい。
% ls -al drwx------ 2 matsu matsu 95M Sep 20 10:19 cur drwx------ 2 matsu matsu 7.9M Sep 20 10:19 new drwx------ 2 matsu matsu 9.1M Sep 24 08:00 tmp
そのスレッドの処理にimapサーバが長時間かかる。
また、メールを削除するたびにサーバ側でimapスレッドが生成されてしまう。
そのため、ファイル削除に加えて、ディレクトリの再作成をすれば回復する。
% cd ~/Maildir/.Trash/
以下のスクリプト実行する。
for target in cur tmp new do find $target -type f -exec rm {} \; rmdir $target mkdir $target chmod 700 $target done
ファイルを削除するだけだと、だめ。inodeのフラグメントがあるらしく時間がかかるからディレクトリを再作成してあげる必要がある。
暴走したプロセスをkillするためのコマンドメモ。
# ps axuwwf | grep imap | grep matsu | grep -v ps | grep -v grep | gawk '{print $2;}' | xargs sudo kill -9
ユーザ名部分の”matsu”を適宜置き換えてください。
killのsignalは(9)KILLじゃないと落ちてくれないです。
Comments