Q. 小さいファイルを連続してディスクに書き込むと、すごく遅いのですが。
A. FreeBSD のデフォルトでは、ファイルのデータ本体は遅延書き込みされますが、
i-node (メタデータ) の更新は同期的に行なわれているため、頻繁にファイルの
作成・削除・更新をするような動作は比較的低速です。
これは安全性を考慮した上でのことで、安全性や機能を少し犠牲にすれば
高速化することができます。そのため目的に応じて使い分ける必要がある
でしょう。
1. mount(8) 時に -o async オプションを使用すると、i-node の更新も非
同期に行います。例えば、/etc/fstab に
/dev/ccd0c /a ufs rw,async 0 2
のように書きます。ただし、速くなる代りに信頼性は犠牲にされます。
mount(8) によると
async 指定したファイルシステムのすべての I/O を非同期に行います。
このオプションを指定することは非常に危険ですので、システ
ムクラッシュ時にファイルシステムを作り直す用意ができてい
ないかぎりは使うべきではありません。
とあります。
ちなみに Linux では、この async がデフォルトになっています。
2. 用途によっては -o noatime オプションも有効です。これはファイルへ
のアクセス時に、ファイルの最終アクセス日時を更新しません。ただし、
このアクセス日時を利用するようなアプリケーションは上手く動かない
ので注意が必要です。/etc/fstab には
/dev/ccd0c /a ufs rw,async,noatime 0 2
のように書きます。
3. FreeBSD 3.0-RELEASE からはこれらに加えて softupdates という機能
が加わっています。これは、安全性の犠牲なしにファイル I/O の高速
化を行おうとするもので、場合によってはかなりの効果が期待できます。
softupdates の解説 <URL:http://www.mew.org/~kazu/doc/softupdate>
FreeBSD 4.1-RELEASE 以降は、デフォルトで GENERIC カーネルに
softupdates 機能が含まれています。
a) ファイルシステムに対して softupdates を有効にします。この時
tunefs(8) を使うにはファイルシステムがアンマウントされた状態
でなければなりません。シングルユーザモードで作業すれば良いで
しょう。
# tunefs -n enable /a
b) この機能を使うとき -o async オプションは無意味です。
/dev/ccd0c /a ufs rw,noatime 0 2
また、上手くできたか確認するには mount コマンドをオプションなし
で実行します。
% mount
/dev/ccd0c on /a (local, noatime, soft-updates, writes: ...
^^^^^^^^^^^^
4. これ以外で高速化の鍵となるものは、PCI IDE コントローラのフラグ設
定や、newfs(8) 時のオプション指定の最適な組合せ、及び ccd(4) や
vinum(8) を使用してディスクをストライピングすることも考慮する価
値があるでしょう。
グループ名: raid