FreeBSD QandA 158

FreeBSD QandA

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


間違い・追加情報を見付けた場合は、 修正案の投稿のしかた を読んだ上で、
QandA@jp.FreeBSD.org まで お知らせください。