| 谈谈文件系统中inode对于服务器的影响
由于做过一些有关 filesystem 的 study,在这边对inode做一点说明…
1. inode是作甚么的?
一个filesystem可以粗略地分成inode table与data area两部份。inode table上有许多的inode, 每个inode分别记录一个档案的属性与这个档案分布在哪些datablock上(也就是我们说的指针)。
2. 一个inode有多大呢?
128 byte!
3. inode和data area的关系?
在new filesystem时,通常会有一个参数,用来描述要分配多少比例的空间给inode table。
举例来说 newfs -i 2048
是指filesystem中, 每分配2048 byte给data area, 就分配一个inode。但是一个inode就并不是一定就用掉2048 byte, 也不是说files allocation的最小单位是2048 byte, 它仅仅只是代表filesystem中inode table/data area分配空间的比例是128/2048 也就是1/16。
(换个角度想, 我们可以想成是预前估计filesystem中file平均大小是2048 byte)
如果inode table太小,那么在每个档案都很小的时候,就会发生inode用光而datablock还剩一堆的情形。
4. file allocation的最小单位和inode多少有没有关系呢?
没有关系!FFS中真正的最小单位是fragment size也就是我们在new filesystem时用的 newfs -b 8192 -f 1024 ps: -b 8192 代表 blocksize=8192, 这种"较大单位"是用来加速大档案的存取用的。在FreeBSD中, 内定的是 -i 4096 -b 8192 -f 1024。如果您要架bbs/new的话可以考虑用 -i 1024 -b 4096 -f 1024。
所谓block size & fragment size,这是属于file system的一种解决方案。自4.3 BSD起,BSD用这种方法来解决file fragment的问题。
先假设 a block size= 4K,a fragment size = 256Bytes。(定义单个碎片文件大小为 256,那么1K就等于4个碎片文件)
假如你现在要将一个 1K 的新档案写入 file system, file system会把它存入4个fragment,而不会存入block,一但这个档案继续被append增加到4K时, file system会将它转存到一个 block中, 而原来的 16 个fragments 就会被清除。 因为当你的档案大到 4K 时,它占用了 16 (4K / 256 bytes) 个 fragments。
再举个例子,如果现在又存了一个新的 4.1K 的档案, file system 会分配一个 block 及 4个 fragment 给这个档案。 因为 1 block + 4 fragments = 4 K + 256 bytes * 4 = 4.1K
所以,有此可知,对于一台 news server, bbs, 或是会有大量的小档案存取时,为了降低 file system 的空间耗损率,应该采用 -b 4096 -f 256,而不要采用预设值的 -b 8192 -f 1024,因为大部分的信件都不超过 512 bytes,有些更不超过256bytes, 但是这样可能会降低存取的速度。但我相信不严重有兴趣的人可以试试。 ====================================================================== newfs 时的参数的影响:(以 100MB 的分割去作测试) size: 208845 (about 100MB) 参数 可用空间(1K-blocks) 可用 inode (ifree) -i 1024 91525 102397 -i 2048 96661 61437 -i 4096 100501 30717 -i 8192 102421 15357 -i 16384 103381 7677 -i 32768 103861 3837 -i 16384 -b 16384 -f 2048 103316 7677 -i 16384 -b 32768 -f 4096 103104 8189 -i 16384 -b 65536 -f 8192 102808 8189
|