|
小さいファイルがいっぱいある場合のファイルシステム考察
小さいファイルがいっぱいある場合のファイルシステム考察
0.改訂履歴
- 2007.10.25 新規作成
- 2007.11.20 誤字修正
1.はじめに
このドキュメントでは,小さいファイルがたくさん在るファイルで,さらにたくさん増える様な場合に遭遇するinode不足を起こさないためのファイルシステムを考える. ファイルシステムは,稼働中には変更できないので,慎重な計画が必要である.
インターネットで調べると,ファイルシステムとしてReiser3(Reiser4)が向いている様であるが,今後の開発に関して不明確な部分があるので,RedHatの標準ファイルシステムであるext3を利用して考える.
まずは,statコマンドによってファイルがが消費するブロック数を調べて理解し,dumpe2fsコマンドでファイルシステムの状態を確認し,mkfs(mkfs.ext3)で色々なbytes-per-inodeを検証した上で,既存のファイル構成から平均データサイズを算出し調査た上で,方針を決めるまでのものである.
なお,使用しているOSは,RedHat Linux ES上である.
[root@emc03 smallfiles]# ls -la /tmp/1.txt
-rw-r--r-- 1 root root 1 Oct 25 21:23 /tmp/1.txt
[root@emc03 smallfiles]#
|
[root@emc03 smallfiles]# stat /tmp/1.txt
File: `/tmp/1.txt'
Size: 1 Blocks: 8 IO Block: 4096 Regular File
Device: 806h/2054d Inode: 196858 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2007-10-25 21:23:52.000000000 +0900
Modify: 2007-10-25 21:23:52.000000000 +0900
Change: 2007-10-25 21:23:52.000000000 +0900
[root@emc03 smallfiles]#
|
- 8ブロック利用している. 1ファイルあたりの最小単位が8ブロックと言うことになる.
- 次に,4096バイトのファイルの消費ブロック数を確認する.
[root@emc03 smallfiles]# ls -la /tmp/4096.txt
-rw-r--r-- 1 root root 4096 Oct 25 21:29 /tmp/4096.txt
[root@emc03 smallfiles]# stat /tmp/4096.txt
File: `/tmp/4096.txt'
Size: 4096 Blocks: 8 IO Block: 4096 Regular File
Device: 806h/2054d Inode: 196863 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2007-10-25 21:29:36.000000000 +0900
Modify: 2007-10-25 21:29:38.000000000 +0900
Change: 2007-10-25 21:29:38.000000000 +0900
[root@emc03 smallfiles]#
|
- データが1ブロックに収まっているので,1バイトファイルと同じ8ブロック.
- 次に,4097バイトのファイルの消費ブロックを確認する.
[root@emc03 smallfiles]# ls -la /tmp/4097.txt
-rw-r--r-- 1 root root 4097 Oct 25 21:30 /tmp/4097.txt
[root@emc03 smallfiles]# stat /tmp/4097.txt
File: `/tmp/4097.txt'
Size: 4097 Blocks: 16 IO Block: 4096 Regular File
Device: 806h/2054d Inode: 196859 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2007-10-25 21:30:29.000000000 +0900
Modify: 2007-10-25 21:30:35.000000000 +0900
Change: 2007-10-25 21:30:35.000000000 +0900
[root@emc03 smallfiles]#
|
- 16ブロックとなっている.
- つまり,ファイルサイズが4096バイト毎に,8ブロックを消費している事が解る.
3.ブロック数を調べる
- 現在使用しているファイルシステムの,ブロック数を調べる.
- 今回調査対象となるファイルシステムを確認する.
[root@emc03 smallfiles]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda6 23G 6.8G 15G 32% /
/dev/sda1 248M 15M 221M 7% /boot
none 2.0G 0 2.0G 0% /dev/shm
/dev/sda2 97G 54G 38G 60% /files
/dev/sda3 7.9G 101M 7.4G 2% /var
[root@emc03 smallfiles]#
|
- dumpe2fsコマンドで確認する.
- このとき,コマンドを入力したらすぐControl+Cキーを押して止める.
[root@emc03 smallfiles]# /sbin/dumpe2fs /dev/sda2
dumpe2fs 1.32 (09-Nov-2002)
Filesystem volume name: /files
Last mounted on: <not available>
Filesystem UUID: 8f9a87b0-a8ed-4dc8-9ae0-a9aca0de15f5
Filesystem magic number: 0xFE53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal filetype needs_recovery sparse_super large_file
Default mount options: (none)
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 12812288
Block count: 25600000
Reserved block count: 1280000
Free blocks: 11056767
Free inodes: 6453064
First block: 0
Block size: 4096
Fragment size: 4096
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 16384
Inode blocks per group: 512
Filesystem created: Sat Dec 3 01:45:49 2005
Last mount time: Wed Dec 7 19:00:27 2005
Last write time: Wed Dec 7 19:00:27 2005
Mount count: 5
Maximum mount count: -1
Last checked: Sat Dec 3 01:45:49 2005
Check interval: 0 (<none>)
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 128
Journal UUID: <none>
Journal inode: 8
Journal device: 0x0000
First orphan inode: 0
^C
[root@emc03 smallfiles]#
|
- このファイルシステムの場合,4096byte/ブロックとなっている.
- つまり,先ほどのstatでの調査結果を踏まえると,1byte〜4096byteのファイルを1つ作成すると,8ブロック×4096byteが消費されるという事になる.
4.ファイルシステムを検証
- ここでは,ファイルシステムで,「何ブロック毎にiノードを利用するか」の値を変更しながら,ファイルシステムを構築してみる.
4.1.ブロックサイズが4KB(4096byte)の場合の検証
[root@emc03 ujpadmin]# /sbin/mkfs /dev/hda5
mke2fs 1.32 (09-Nov-2002)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
1281696 inodes, 2560351 blocks
128017 blocks (5.00%) reserved for the super user
First data block=0
79 block groups
32768 blocks per group, 32768 fragments per group
16224 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 23 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@emc03 ujpadmin]#
|
- inode数は,約128万個となっている.
- inode per blockを8192バイトで作成してみる.
[root@emc03 ujpadmin]# /sbin/mkfs -i 8192 /dev/hda5
mke2fs 1.32 (09-Nov-2002)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
1281696 inodes, 2560351 blocks
128017 blocks (5.00%) reserved for the super user
First data block=0
79 block groups
32768 blocks per group, 32768 fragments per group
16224 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 32 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@emc03 ujpadmin]#
|
- 値が一緒. つまり,デフォルトは,8192バイトに1つ,inodeが消費される.
- では,4096バイトに1つのinodeが作成されるようにファイルシステムを構成する.
[root@emc03 ujpadmin]# /sbin/mkfs -i 4096 /dev/hda5
mke2fs 1.32 (09-Nov-2002)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
2560864 inodes, 2560351 blocks
128017 blocks (5.00%) reserved for the super user
First data block=0
79 block groups
32768 blocks per group, 32768 fragments per group
32416 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 22 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@emc03 ujpadmin]#
|
- 2倍となる,約256万個となった.
- 次に,2048バイト毎としてみる.
[root@emc03 ujpadmin]# /sbin/mkfs -i 2048 /dev/hda5
mke2fs 1.32 (09-Nov-2002)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
2588672 inodes, 2560351 blocks
128017 blocks (5.00%) reserved for the super user
First data block=0
79 block groups
32768 blocks per group, 32768 fragments per group
32768 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Writing inode tables: done
Writing superblocks and filesystem accounting information:
|
- これは,約258万であるが,8192->4096のような倍増にはならなかった.
4.2.ブロックサイズを変更する
- デフォルトのブロックサイズは4KBであるが,これを2KBとし,inodeも2KB毎に消費する様にファイルシステムを構成してみる.
[root@emc03 ujpadmin]# /sbin/mkfs -i 2048 -b 2048 /dev/hda5
mke2fs 1.32 (09-Nov-2002)
Filesystem label=
OS type: Linux
Block size=2048 (log=1)
Fragment size=2048 (log=1)
5123184 inodes, 5120703 blocks
256035 blocks (5.00%) reserved for the super user
First data block=0
313 block groups
16384 blocks per group, 16384 fragments per group
16368 inodes per group
Superblock backups stored on blocks:
16384, 49152, 81920, 114688, 147456, 409600, 442368, 802816, 1327104,
2048000, 3981312
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 38 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@emc03 ujpadmin]#
|
- 約512万個のinodeが作成された.
- 次に,1ブロック2KBだが,inodeは4KB毎に作成するという場合.
[root@emc03 ujpadmin]# /sbin/mkfs -i 4096 -b 2048 /dev/hda5
mke2fs 1.32 (09-Nov-2002)
Filesystem label=
OS type: Linux
Block size=2048 (log=1)
Fragment size=2048 (log=1)
2564096 inodes, 5120703 blocks
256035 blocks (5.00%) reserved for the super user
First data block=0
313 block groups
16384 blocks per group, 16384 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
16384, 49152, 81920, 114688, 147456, 409600, 442368, 802816, 1327104,
2048000, 3981312
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 20 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@emc03 ujpadmin]#
|
- 約256万個のinodeが作成された.
- この結果は,意味がない.
5.結論
- 小さいファイルが多い場合は,ブロックサイズとiノードを小さくしてファイルシステムを作成する事で,データファイルが増えたときのiノード不足が発生しづらくなる.
6.ファイルサイズを調べる
- あるディレクトリ以下にある全ファイルのサイズを調べて平均値を計算する.
- まずは,ファイル一覧を取得する.
[root@emc03 files]# ls -laR > /tmp/emoji.list.txt
[root@emc03 files]#
|
[root@emc03 files]# cat /tmp/emoji.list.txt|awk '{print$5}'> /tmp/size.txt
[root@emc03 files]#
|
[root@emc03 files]# sort -n /tmp/size.txt > /tmp/sizesort.txt
[root@emc03 files]#
|
- ソートしなくても良いのだけども,ソートした結果をawkで計算して平均値を出す.
[root@emc03 files]# cat /tmp/sizesort.txt | awk '{s = s + $1} END {print s/NR}'
2544.65
[root@emc03 files]#
|
- このディレクトリは,2544.65byte平均だとわかる.
|
|