sylpheed の瞬間的な高速化2009年01月17日 00時34分23秒

普段は、sylpheed を愛用している。bogofilter でスパムメールの処理をしている。スパムメールも簡単に目を通すのだが、面倒なので定期的にはしていない。そんなこんなで、一万通にも達する程の未読メールが spam フォルダにたまってしまった。

一通毎に目を通して、それを削除する。まずタイトルと送信者を軽く見て、本文は目で流す程度。気になるメールがくるまでは ctrl-D か「削除」アイコンの連打である。気になる題名と送信者であれば、本文を読む。それでも怪しかったら、ヘッダ情報を吟味する。実は sylpheed は各メールフォルダ内に .sylpheed_cache と .sylhpeed_mark を保持している。これらのファイルが、一通ずつゴミ箱に移動する度に更新される。一万通もあると、この処理もバカにならない。一通当たりに 5MB/s もの書き込みが行なわれる程の処理だ。geli を通しており、また sylpheed の描画と更新を待つのを入れると、10MB/s になると苦しくなってくる。

流石に遅くて辛い。どれくらいのメールがあるのかを調べてみた。


% du -sh Mail
1.5G    Mail

1.5 GB なら、物理メモリにぎりぎり載る範囲なので、mdconfig -t swap を使うことにした。5MB/s を一万回繰り返したら、合計 50GB なので rsync での複製の方のコストの方が最終的に安くつく。

root で作業する。


$ mdconfig -a -t swap -s 2G
md2
$ newfs -i 32 -b 4096 /dev/md2
$ mount -oasync,noatime /dev/md2 ~uyota/tmp
$ chown uyota:uyota ~uyota/tmp

物理メモリも 1.5GB なので、スワップされるのは覚悟の上で、2GB を割り当てる。inode 等にも使われるので、だいぶ余裕を持った。newfs の -i 32 で inode の数を増やし、-b でブロックサイズを最小にする。メールは細かいファイルが多いので、ブロックサイズを細かく取る。-i は小さい数ほど、多くの inode を作成する。softupdate の -U は使わない。

自らのアカウントでメールをコピーする。


% rsync -av Mail/ tmp/

バックアップを取っても良いが、mdconfig の領域から書き戻さなければ、元の状態のままなので、この作業の為には特別なバックアップは行なわないことにした。もちろん、推奨ではある。

root で、~uyota/tmp を ~uyota/Mail に移す。メモリ上にある md デバイスなので、sync でも動作は速いのが予想されるが、わざわざ遅くする理由もない。async を使う。


$ umount ~uyota/tmp
$ mount -oasync,noatime /dev/md2 ~uyota/Mail


% sylpheed

GUI の更新と、自分の目と指の早さがボトルネックとなった。三十分かけて目を通した。やはり、ディスクアクセスが全くないと段違いに速い。

さて、今回の作業をディスクに書き込む。今回は、rsync も含めて root で作業した。


$ umount ~uyota/Mail
$ mount -oasync,noatime /dev/md2 ~uyota/tmp
$ rsync -auv --delete ~uyota/tmp/ ~uyota/Mail/
$ umount ~uyota/tmp
$ mdconfig -d -u 2

最後にメモリを開放する。

なお同様の高速化は、mount/umount を使わずともシンボリックリンクを使ったり、mdconfig で無くとも tmpfs を使っても出来る。今回は、ただの気まぐれでこの形をとった。