我们用inode,meta-data,block等概念来表示数据文件在系统中的状态
简单的理解:
inode,表示一个文件在整个文件系统中的‘索引’
meta-data,表示存放一个文件信息的在存储单元,例如文件的owner,group,acl,time_stamp等信息
block,表示文件的数据块
当一个文件要求写入计算机磁盘时,文件系统会根据其预先设置的IO Block大小在磁盘上分配相应的空间给文件。
例如:
tune2fs将文件系统的block设置为4K,如果我们要保存一个大小是100KB的文件,文件系统会分配25个IO Block给用户
但是对于物理磁盘,其物理block的大小是由磁盘的硬件厂商设定好的,一般来说磁盘的物理block是以字节为单位的,如256byte,512byte...
如下面的例子所示,当用户写入1字节的文件时,主机文件系统的IO Block为4K,这将要求磁盘分配4K的空间给文件。尽管实际文件只有1个字节,但是由于文件系统的IO单元是4K,所以还是要分配4K空间给文件。
对于磁盘来说,接收到文件系统申请4K的请求,磁盘会根据其物理Block的大小分配相应的Block给用户。
所以,我们看到文件的Blocks是按一个整数的倍数而改变的。
下面的1.dump是1字节的文件,文件系统的IO Block为4K,文件实际Blocks是8,4K除8结果是512字节。
说明这个磁盘的物理block单元是512字节。
了解了以上的内容可以帮助我们基于用户存取文件的特点对文件系统进行优化设置。
假设用户有100GB的磁盘,磁盘的物理BLOCK是512BYTE,那么这个磁盘可用的BLOCK等于200000000
可以简单的理解为:这个磁盘最多可以存放约2亿个文件,即:每个block都存放了小于512字节的一个文件
用户实际应用的环境会出现两种空间使用的问题:
1. 磁盘空间已满,无法写入新的文件。解决办法是做文件迁移或扩容
2. 磁盘空间有剩余,但当创建新的文件时失败,原因是无block可用/inode已经用完
假设用户在一个100GB的linux ext3文件系统上使用4KB的IO Block。
那么对于ext3文件系统来说,可用block数量为2亿/8=25000000,2千500万
对于物理磁盘来说,可用block仍然是2亿
当用户向系统写入2千500万个大小为2KB的文件时,磁盘的剩余空间约为50GB,但是用户无法再创建新的文件。因为每个2KB文件占用了8个物理block, 8*512=4K,可以理解为有一半的block是空的但被文件系统标记为已经占用
针对存放大量‘小文件’在磁盘的用户来说,4KB的IO block是浪费了。
[root@ziyang root]# clear
[root@ziyang root]# dd if=/dev/zero of=1.dump bs=1 count=1
1+0 records in
1+0 records out
[root@ziyang root]# ls -l 1.dump
-rw-r--r-- 1 root root 1 May 12 14:24 1.dump
[root@ziyang root]# stat 1.dump
File: `1.dump'
Size: 1 Blocks: 8 IO Block: 4096 Regular File
Device: 305h/773d Inode: 294373 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2010-05-12 14:16:35.000000000 +0800
Modify: 2010-05-12 14:24:45.000000000 +0800
Change: 2010-05-12 14:24:45.000000000 +0800
[root@ziyang root]# dd if=/dev/zero of=1.dump bs=1 count=4096
4096+0 records in
4096+0 records out
[root@ziyang root]# ls -l 1.dump
-rw-r--r-- 1 root root 4096 May 12 14:24 1.dump
[root@ziyang root]# stat 1.dump
File: `1.dump'
Size: 4096 Blocks: 8 IO Block: 4096 Regular File
Device: 305h/773d Inode: 294373 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2010-05-12 14:16:35.000000000 +0800
Modify: 2010-05-12 14:24:57.000000000 +0800
Change: 2010-05-12 14:24:57.000000000 +0800
[root@ziyang root]# dd if=/dev/zero of=1.dump bs=1 count=4097
4097+0 records in
4097+0 records out
[root@ziyang root]# ls -l 1.dump
-rw-r--r-- 1 root root 4097 May 12 14:25 1.dump
[root@ziyang root]# stat 1.dump
File: `1.dump'
Size: 4097 Blocks: 16 IO Block: 4096 Regular File
Device: 305h/773d Inode: 294373 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2010-05-12 14:16:35.000000000 +0800
Modify: 2010-05-12 14:25:05.000000000 +0800
Change: 2010-05-12 14:25:05.000000000 +0800
[root@ziyang root]# dd if=/dev/zero of=1.dump bs=1 count=8192
8192+0 records in
8192+0 records out
[root@ziyang root]# ls -l 1.dump
-rw-r--r-- 1 root root 8192 May 12 14:25 1.dump
[root@ziyang root]# stat 1.dump
File: `1.dump'
Size: 8192 Blocks: 16 IO Block: 4096 Regular File
Device: 305h/773d Inode: 294373 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2010-05-12 14:16:35.000000000 +0800
Modify: 2010-05-12 14:25:18.000000000 +0800
Change: 2010-05-12 14:25:18.000000000 +0800
[root@ziyang root]# dd if=/dev/zero of=1.dump bs=1 count=8193
8193+0 records in
8193+0 records out
[root@ziyang root]# ls -l 1.dump
-rw-r--r-- 1 root root 8193 May 12 14:25 1.dump
[root@ziyang root]# stat 1.dump
File: `1.dump'
Size: 8193 Blocks: 24 IO Block: 4096 Regular File
Device: 305h/773d Inode: 294373 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2010-05-12 14:16:35.000000000 +0800
Modify: 2010-05-12 14:25:27.000000000 +0800
Change: 2010-05-12 14:25:27.000000000 +0800
阅读(747) | 评论(0) | 转发(0) |