管理している Mailman サーバで、ディスクがあふれて配送が止まるトラブルがありました。調べてみると、/var/lib/mailman/archives/private/ 配下の保存書庫が異常にディスクを消費していました。
/var/lib/mailman/archives/private/ 以下には、基本的にはメーリングリスト1つに対して2つのディレクトリがあります。ひとつは mbox 形式で投稿されたメールを保存し、もうひとつは投稿されたメールから HTML で閲覧できるページを作って格納しています。
今回、問題になったのは後者の方でした。以下のように、mbox 形式書庫が2GB程度しかないのに、HTML 形式書庫は57GBものディスクを消費していました。
$ du -sm /var/lib/mailman/archives/private/LISTNAME*
57219316 /var/lib/mailman/archives/private/LISTNAME
2053 /var/lib/mailman/archives/private/LISTNAME.mbox
この問題の原因は、まだ分かっていません。とりあえずの対処療法としては、HTML 形式書庫を再作成すれば問題は解決します。
$ sudo -u list mmarch --wipe LISTNAME
--wipe オプションは、既存の書庫を掃除してから再作成する、という意味だそうですので、今回の場合は必ず必要です。
再作成すると、以下のようにごく自然なディスク消費量に修正されました。
$ du -sm /var/lib/mailman/archives/private/LISTNAME*
1929 /var/lib/mailman/archives/private/LISTNAME
2053 /var/lib/mailman/archives/private/LISTNAME.mbox
原因不明なので、とりあえず当面の間は、以下のようなスクリプトを cron で定期実行しておくことにしました。
# !/bin/sh
PATH=/usr/sbin:/sbin:/usr/bin:/bin
basedir=/var/lib/mailman
listdir=${basedir}/lists
archivedir=${basedir}/archives/private
ignorelimit=20480
ratio=4
for mboxdir in ${archivedir}/*.mbox; do
listname=`basename "${mboxdir}" .mbox`
htmldir="${archivedir}/${listname}"
if [ -d "${listdir}/${listname}" -a -d ${htmldir} ]; then
mboxsize=`du -s "${mboxdir}"|cut -f1`
htmlsize=`du -s "${htmldir}"|cut -f1`
if [ "${mboxsize}" -gt "${ignorelimit}" -a "${htmlsize}" -gt `expr "${mboxsize}" '*' "${ratio}"` ]; then
echo "The HTML archive of ${listname} is reconstructed."
sudo -u list mmarch --wipe --quiet "${listname}"
fi
fi
done
このスクリプトは、HTML 形式書庫のディスク使用量が、mbox 形式書庫のディスク使用量の4倍(ratio変数)を超えた場合に、HTML 形式書庫を再作成します。ただし、mbox 形式書庫のディスク使用量が20MB(ignorelimit変数)以下の場合には、ディスク使用量の比が正しく出ない1ため、再作成は行いません。
-
HTML 形式書庫は、メール本体以外に、スレッドを作成するための Message-Id などのデータベースファイルを含むため、mbox 形式書庫に比べてもともとディスク使用量が大きくなる傾向があります。 ↩