FreeBSD のデフォルト設定では、ハードディスクへの書き込みに書き込みが完了するまで待ってから次の処理に移る為、Linux 等よりもディスクアクセスが遅くなっている。
ただ非同期 I/O を使うのならば、async でもよいが、ここではより高速化される Soft updates を使ってみようと思う。
Soft Updates を利用するには、カーネルの再構築が必要となる。
また、その際に、ソースが必要なので /stand/sysinstall から、[Configure] - [Distributions] - [src] で、contrib と sys をチェックし、必要なソースをインストールする。
ソースの展開ができたら、Soft updates のソースをリンクしておく。
# cd /usr/src/sys/ufs/ffs # ln -s ../../contrib/softupdates/*.c . # ln -s ../../contrib/softupdates/*.h .
カーネルコンフィグレーションファイルに、options SOFTUPDATES を書き加える。
# cd /usr/src/sys/i386/conf # vi [your config file name] options SYSVSHM #SYSV-style shared memory options SYSVMSG #SYSV-style message queues options SYSVSEM #SYSV-style semaphores options SOFTUPDATES #Softupdates
カーネルコンフィグレーションファイルを変更したら、カーネルの再構築を行う。
# cd /usr/src/sys/i386/conf # config [your config file name] # cd ../../compile/[your conf file name] # make depend all install
ここで再起動を行い、新しいカーネルがきちんと動作することを確認しておく。
# shutdown -r now
ファイルシステムを確認しておく。
# cat /etc/fstab # Device Mountpoint FStype Options Dump Pass# /dev/wd0s2b none swap sw 0 0 /dev/wd0s2a / ufs rw 1 1 /dev/wd0s2f /usr ufs rw 2 2 /dev/wd0s2e /var ufs rw 2 2 /dev/wd4s1 /flash msdos rw,noauto 0 0 /dev/acd0c /cdrom cd9660 ro,noauto 0 0 /dev/wd0s2b /tmp mfs rw,-s=32768 0 0 proc /proc procfs rw 0 0
Soft updates は FStype が ufs のファイルシステムに設定できる。
また、書き込みが発生しないファイルシステムに対しては効果が無い。
念のため / には設定しないで、/dev/wd0s2e, /dev/wd0s2f に設定することにする。
ファイルシステムへの設定は、ファイルシステムをマウントしていない状態で行わなければならない。
shutdown now でシングルユーザーモードに移行して、マウントを解除する。
# shutdown now Enter full pathname of shell or RETURN for /bin/sh:{enter] # umount -a
次に、ファイルシステムに対して、tunefs -n enable を実行する
# tunefs -n enable /var tunefs: soft updates set # tunefs -n enable /usr tunefs: soft updates set
設定が終わったらシングルユーザーモードを抜ける。
# exit
マルチユーザーモードに移行するので、ログインする。
Soft updates が有効になったか確認してみる。
$ mount /dev/wd0s2a on / (ufs, local, writes: sync 12 async 2883) /dev/wd0s2f on /usr (ufs, local, soft-updates, writes: sync 864 async 25920) /dev/wd0s2e on /var (ufs, local, soft-updates, writes: sync 1758 async 10843) mfs:31 on /tmp (mfs, asynchronous, local, writes: sync 5 async 82) procfs on /proc (procfs, local)