在上一篇文章《新建一个空文件是否占用磁盘空间?占用多少》我们了解了一个空文件的磁盘开销。今天我们再思考一个问题。如果我们只向文件写入1个字节,那么这个文件的实际磁盘使用量是否也是1个字节?查看一个1字节的文件和上一篇一样,先不讲原理,直接操作。#mkdirtempDir#cdtempDir#du-h0.#touchtest#du-h0.在目录下创建空文件后,du命令看到的文件夹占用空间没有变化。这符合我们之前的理解,因为空文件只占用inode。好了,我们修改文件,添加一个字母echo"a">test#du-h4.0K。保存后,再次查看目录的空间使用情况。我们发现它从0增加到4K。所以不管文件里的内容多小,哪怕是一个字节,操作系统其实都会给你分配4K。哦,当然,你还要统计上面提到的文件夹数据结构中存储的inode和文件名所占用的空间。所以,不要在你的系统中维护很多损坏的文件。文件再小,实际占用的磁盘空间也很大!注意,我的实验环境是在ext文件系统下进行的。如果是xfs,性能可能会略有不同。继续讨论这个4K,然后在linux源码文件fs/ext2/ext2.h中找到inode的定义,我们找到指向数据节点的结构中定义的block数组:structext2_inode{......__le32i_block[EXT2_N_BLOCKS];#指向存储文件数据的块数组...当文件没有数据可存储时,此数组为空。而当我们写入1个字节时,文件系统需要申请一个块来存储它。应用完成后,指针就放在这个数组中。即使文件内容只有一个字节,也会分配一整块Block,因为这是文件系统的最小工作单元。那么这个块的大小是多少?可以通过ext下的dumpe2fs查看。#dumpe2fs-h/dev/mapper/vgroot-lvroot......Blocksize:4096在我的机器上,一个Block是4KB。文件内容比较大怎么办?不知道大家有没有注意到inode中定义的block数组的大小只有EXT2_N_BLOCKS。我们再看看下这个常量的定义,发现它是15,相关内核中定义如下:#defineEXT2_NDIR_BLOCKS12#defineEXT2_IND_BLOCKEXT2_NDIR_BLOCKS#defineEXT2_DIND_BLOCK(EXT2_IND_BLOCK+1)#defineEXT2_TIND_BLOCK(EXT2_DIND_BLOCK+1)#defineEXT2_N_BLOCKS(EXT2_TIND_BLOCK+1)根据4K的block大小,15个block只够存放15\*4=6个文件我相信你一定对这个文件大小不满意。如果存一个大的avi文件,那就值G了。Linux是如何实现大文件存储的?好吧,其实上面的宏定义过程已经告诉你,直接存放块指针的数组只有12个,其余的用作间接索引(EXT2_IND_BLOCK)、二级间接索引(EXT2_DIND_BLOCK)和三级索引(EXT2_TIND_BLOCK)。这样,文件可以使用的空间呈指数级增长。当文件较小时,使用直接索引,磁盘IO较少,性能较好。当文件较大时,访问一个block可能需要先3次IO,性能稍慢,但在OS层面pagecache和directoryitemcache的支持下也不错。结论文件系统是以块为单位进行管理的,所以不管你的文件多小,即使只有一个字节,也会占用一整块。这个块大小可以通过dumpe2fs等命令查看。如果你想改变这个块大小怎么办?抱歉,只能重新格式化。练内功练硬盘特技:1、开盘:剥去机械硬盘的硬外衣!2.磁盘分区也暗示技术水平。3、机械硬盘速度慢,容易坏,如何解决?4.拆解SSD结构5.一个新的空文件占用多少磁盘空间?6.一个只有1字节的文件实际占用多少磁盘空间?7、为什么文件太多时ls命令会卡住?8.理解格式化原理9.读取文件一个字节实际会发生多少磁盘IO?10.文件写入一个字节后什么时候开始写磁盘IO?11、机械硬盘的随机IO比你想象的要慢。12、服务器配置固态硬盘比机械硬盘快多少?我的公众号是《练内功》。在这里,我不是简单地介绍技术理论,也不是只介绍实践经验。而是理论联系实际,用实践加深对理论的理解,用理论提高技术实践能力。欢迎关注我的公众号,分享给你的朋友吧~~~
