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はどこかではじめから使用されていると考えられるのでそれを鑑みるとあんまり変わらない気がする。
というかよくわからんし眠たいから寝る。
以上。