読者です 読者をやめる 読者になる 読者になる

inodeの枯渇実験

以下の記事が面白かった。inodeが枯渇するとどうなるのかということなんだが。
http://d.hatena.ne.jp/elf/20111113/1321177077
Ext2/3/4はディスクをフォーマットした時点でinode最大数が固定されてしまう。
一方でbtrfsはinodeを動的に確保できるのでフォーマットした時点では固定されない。
ではどの程度の違いがでるのかが気になるところ。
上記の記事をもとに実験をしてみた。

実験のために10MBの空ファイルをext4/btrfsでフォーマットし、ループバックを利用してマウントする。これで10MBのディスクを仮想的に実現できる。

root@ochimina:~# dd if=/dev/zero of=$PWD/dummy.ext4 bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.00525249 s, 2.0 GB/s
root@ochimina:~# dd if=/dev/zero of=$PWD/dummy.btrfs bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.00943231 s, 1.1 GB/s
root@ochimina:~# mkfs.ext4 dummy.ext4 
mke2fs 1.42.5 (29-Jul-2012)
dummy.ext4 is not a block special device.
Proceed anyway? (y,n) y
Discarding device blocks: done                            
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
2560 inodes, 10240 blocks
512 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=10485760
2 block groups
8192 blocks per group, 8192 fragments per group
1280 inodes per group
Superblock backups stored on blocks: 
	8193

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done
root@ochimina:~# mkfs.btrfs dummy.btrfs 

WARNING! - Btrfs v0.20-rc1 IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using

SMALL VOLUME: forcing mixed metadata/data groups
Created a data/metadata chunk of size 1048576
fs created label (null) on dummy.btrfs
	nodesize 4096 leafsize 4096 sectorsize 4096 size 10.00MB
Btrfs v0.20-rc1
root@ochimina:~# mount -t ext4 -o loop dummy.ext4  /mnt/ext4/
root@ochimina:~# mount -t btrfs -o loop dummy.btrfs /mnt/btrfs/

ここで一度それぞれ(ext4/btrfs)のinodeに関する情報を見る。
ext4は最大で2560個作成できるようにフォーマットされたようだ。しかも11個なぜかすでに使用されている。
一方、btrfsは全く作られていない。(後で述べるが、もしかしたらinodeはカウントできない?)

root@ochimina:~# df -i
Filesystem      Inodes  IUsed   IFree IUse% Mounted on
/dev/sda2      6283264 294449 5988815    5% /
none           2040855      1 2040854    1% /sys/fs/cgroup
udev           2038453    549 2037904    1% /dev
tmpfs          2040855    511 2040344    1% /run
none           2040855      3 2040852    1% /run/lock
none           2040855     10 2040845    1% /run/shm
none           2040855     18 2040837    1% /run/user
/dev/sda1            0      0       0     - /boot/efi
/dev/loop2           0      0       0     - /mnt/btrfs
/dev/loop0        2560     11    2549    1% /mnt/ext4

そしてinodeを枯渇させてみる。

root@ochimina:~# for i in $(seq 1 10000); do touch /mnt/ext4/$i; done
(省略)
touch: cannot touch ‘/mnt/ext4/2737’: No space left on device
touch: cannot touch ‘/mnt/ext4/2738’: No space left on device
touch: cannot touch ‘/mnt/ext4/2739’: No space left on device
touch: cannot touch ‘/mnt/ext4/2740’: No space left on device
touch: cannot touch ‘/mnt/ext4/2741’: No space left on device
touch: cannot touch ‘/mnt/ext4/2742’: No space left on device
touch: cannot touch ‘/mnt/ext4/2743’: No space left on device
touch: cannot touch ‘/mnt/ext4/2744’: No space left on device
(省略)
root@ochimina:~# for i in $(seq 1 10000); do touch /mnt/btrfs/$i; done
(省略)
touch: cannot touch ‘/mnt/btrfs/4867’: No space left on device
touch: cannot touch ‘/mnt/btrfs/4868’: No space left on device
touch: cannot touch ‘/mnt/btrfs/4869’: No space left on device
touch: cannot touch ‘/mnt/btrfs/4870’: No space left on device
touch: cannot touch ‘/mnt/btrfs/4871’: No space left on device
touch: cannot touch ‘/mnt/btrfs/4872’: No space left on device
touch: cannot touch ‘/mnt/btrfs/4873’: No space left on device
touch: cannot touch ‘/mnt/btrfs/4874’: No space left on device
(省略)

それぞれ(ext4/btrfs)のinodeが枯渇したところで再度inodeの状況を見る。
ext4はinodeを使い切ったことがわかるが、
btrfsは全く作られていないように見えてしまう。

root@ochimina:~# df -i
Filesystem      Inodes  IUsed   IFree IUse% Mounted on
/dev/sda2      6283264 294461 5988803    5% /
none           2040855      1 2040854    1% /sys/fs/cgroup
udev           2038453    549 2037904    1% /dev
tmpfs          2040855    511 2040344    1% /run
none           2040855      3 2040852    1% /run/lock
none           2040855     10 2040845    1% /run/shm
none           2040855     18 2040837    1% /run/user
/dev/sda1            0      0       0     - /boot/efi
/dev/loop2           0      0       0     - /mnt/btrfs
/dev/loop0        2560   2560       0  100% /mnt/ext4

btrfsで何個ファイルが作らているのか確認できないので以下の方法で調べる。

root@ochimina:~# echo $(ls /mnt/ext4/*) | wc -w
2550
root@ochimina:~# echo $(ls /mnt/btrfs/*) | wc -w
4186

btrfsのほうが多くのinodeをつくりだしたことがわかる。
多く作れることがすごいというわけではなく、はじめに最大値をきめずに動的に確保できるという点だけが大事なのだ。


ただ追加で実験した内容で少し驚きの結果を得た。

root@ochimina:~# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        95G  6.8G   83G   8% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            7.8G  4.0K  7.8G   1% /dev
tmpfs           1.6G  892K  1.6G   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            7.8G  1.3M  7.8G   1% /run/shm
none            100M   20K  100M   1% /run/user
/dev/sda1        93M  121K   93M   1% /boot/efi
/dev/loop2       10M  1.6M  4.5M  26% /mnt/btrfs
/dev/loop0      8.7M  134K  8.1M   2% /mnt/ext4

作られたファイル数がbtrfsのほうが多いとしても、このディスク使用量の差には驚かされた。
Ext4のほうが空ファイルを使ったときのディスク使用量が極めて少ない。
ただしext4はSizeが8.7ということで1.3はどこかではじめから使用されていると考えられるのでそれを鑑みるとあんまり変わらない気がする。
というかよくわからんし眠たいから寝る。

以上。