unoh.github.com

ext3の dir_indexを試す

Tue Jul 31 01:14:42 -0700 2007

こんにちは、佐藤です。kernel 2.6系のext3からdir_indexというものがサポートされたようなのでどのような状況でパフォーマンスが向上するか実験してみました。

環境は以下です。

uname -a; cat /etc/issue.net
Linux 2.6.18-8.1.3.el5 #1 SMP Mon Apr 30 19:55:44 EDT 2007 i686 i686 i386 GNU/Linux
CentOS release 5 (Final)

まず/dev/sdb1にext3領域をを作ってみます。

sudo mkfs.ext3 -j /dev/sdb1
sudo tune2fs -l /dev/sdb1  # 詳細表示
....
Filesystem features:      has_journal resize_inode dir_index filetype needs_recovery sparse_super large_file
....

dir_indexという項目があるので、このバージョンでのmkfs.ext3はデフォルトでdir_indexが適応されるようです。

比較のためにdir_indexが無い領域も作成します。

sudo mkfs.ext3 -j -O none /dev/sdb2
sudo tune2fs -l /dev/sdb2
...
Filesystem features:      has_journal needs_recovery
...

適当な場所にマウントします

 sudo mount /dev/sda /home/unoh/sdb1
 sudo mount /dev/sda /home/unoh/sdb2

テストのため計測プログラムを書きました。

g++ -o disktest disktest.cpp
./disktest 
-c N: create files
-a N: random access files
-d N: delete files
オプション -c で N個のファイルを作成します
オプション -a でN個のファイルの中からランダムに 2000個アクセスします
オプション -d でN個のファイルを削除します
操作はすべてカレントディレクトリに対して行います。

結果に影響ができないようにテストの度に以下のコマンドで ページ,dentry,i-nodeキャッシュを解放します。

sudo sysctl -w vm.drop_caches=3; sudo sysctl -w vm.drop_caches=0;

結果

ファイル作成

ファイル数 15000 30000 60000 120000
dir_index無し 19364 msec 43919 msec 120990 msec 337845 msec
dir_index有り 2443 msec 7006 msec 15320 msec 31793 msec

ファイルアクセス

ファイル数 15000 30000 60000 120000
dir_index無し 1219 msec 4746 msec 18579 msec 27791 msec
dir_index有り 43 msec 77 msec 1683 msec 5467 msec

ということで、ファイルの作成についてはdir_indexが無い場合ファイル数が増えるにつれて指数的にアクセスが遅くなっているのがわかります。

dir_indexがある場合は、ファイル数が増えても時間は比例的に増えます。

ファイルのアクセスについても同じような結果になっています。

これを見る限り dir_indexは非常に有効そうです。

ちなみに、bonnie++ というソフトウェアでも同じようなテストができるようです。