Linuxは、ファイルの作成時刻、最終更新時刻、最終アクセス時刻を記録する。しかし最終アクセス時刻の記録は、ファイルを読んだだけのときにも、システムが最終時刻の記録のためにファイルのディレクトリエントリを更新するため、通常はファイルのアクセス速度の低下を招くことになる。書き込みによって速度が低下することがあるということは、この更新を行うのをやめてしまえば性能が向上するはずだ。
このスピードアップを実現するためには、ファイルシステムのマウント方法を変更すればよい。そのためにはまず、ルートとして「cat /etc/fstab」を実行してみよう。わたしの場合、以下のような結果になった。
/dev/hda3 / reiserfs acl,user_xattr 1 1
/dev/hda1 /boot ext2 acl,user_xattr 1 2
/dev/hda2 swap swap defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs noauto 0 0
debugfs /sys/kernel/debug debugfs noauto 0 0
usbfs /proc/bus/usb usbfs noauto 0 0
devpts /dev/pts devpts mode=0620,gid=5 0 0
/dev/fd0 /media/floppy auto noauto,user,sync 0 0
/dev/hdd1 /media/disk2 reiserfs defaults 1 2
最適化するのに最も適したハードディスクのパーティーションは、/と/dev/hdd1だ。というのも/bootは起動時にしか使用されず、/swapは立ち入り禁止となっていて(Linuxカーネルが特別の目的に使用するため)、そのほかはハードディスクではないためだ。
変更するのは簡単だ。好きなテキストエディタで4列目のオプションに「,noatime」を追加し、その後「mount -a」コマンドを実行して全ファイルシステムを再マウントすれば良い。
性能はどうやってテストすればよいだろうか。わたしの場合、まずはbonnie++パッケージを使ってみたが、bonnie++の行うテストは特にファイルアクセスを重視しているわけではないため、結果は何とも判断しがたいものだった。
そこで代わりに再び自作のテストを行うことにした。まず1,000個のファイルを作成しておき、その後、その中身を/dev/nullにコピーするのにかかる時間を測った。ファイルは以下のようにして作成した。
for ((i=0;i<1000;i++)) do ls >$i ; done
コピーにかかる時間は以下のようにして測った。
time cp * > /dev/null
そしてnoatimeオプションをつけた場合と付けなかった場合の両方で前記の2つを実行した。その結果、わずかだが性能の改善が見られた。ファイルアクセスの度に最終アクセス時刻を更新することがなくなったので、当然の結果だ。
この時点で、ハードディスクが可能な限り高速に動くようになったのに加え、ファイルアクセスも最適化できた。そこで最後に、コマンドのロード時間を短縮するための最適化をしよう。
Copyright © 2010 OSDN Corporation, All Rights Reserved.