linux 文件系统

Linux 文件系统之问

1、机械磁盘随机读写时速度非常慢,操作系统是采用什么技巧来提高随机读写的性能的?
2、touch一个新的空文件占用磁盘空间吗? 占用的话占用多少?
3、新建一个空目录占用磁盘空间吗?占用多少?和新建一个文件相比,哪个占用的更大?
4、你知道文件名是记录在磁盘的什么地方吗?
5、文件名最长多长?受什么制约?
6、文件名太长了会影响系统性能吗?为什么会产生影响?
7、一个目录下最多能建立多少个文件?
8、新建一个内容大小1k的文件,实际会占用多大的磁盘空间?
9、向操作系统发起读取文件2Byte的命令,操作系统实际会读取多少呢?
10、我们使用文件时要怎么样来能提高磁盘IO速度?

1、机械磁盘随机读写时速度非常慢,操作系统是采用什么技巧来提高随机读写的性能的?
分区的话,根据磁盘的物理结构一般有两个方案:
 方案一: 255个盘面,C盘是0-100盘面, D盘是101-200个盘面,……
 方案二:3263个柱面,C盘0-1000个柱面,D盘1001-20001个柱面,……
要想选取两种方案较高效的一个,我们先来看一下磁盘IO时的过程。第一步,首先是磁头径向移动来寻找数据所在的磁道。这部分时间叫寻道时间。第二步,找到目标磁道后通过盘面旋转,将目标扇区移动到磁头的正下方。第三步,向目标扇区读取或者写入数据。到此为止,一次磁盘IO完成,故:

单次磁盘IO时间 = 寻道时间 + 旋转延迟 + 存取时间。

同一分区的数据经常会一起读取,所以再来看看两种方案,如果使用方案一的话,磁头就需要在多个磁道间不停地跳来跳去,这样磁盘的寻道时间就会翻倍,磁盘性能就会下降。对于方案二的话,磁头只需要在较少量的磁道移动即可,大大降低了寻道时间。

所以,方案二的分区方式可以降低磁盘IO时间中的寻道时间部分,所以所有的操作系统采用的都是方案二,没有用方案一的。

在Linux下使用过fdisk进行分区的话可以注意到以下信息,这充分证明了操作系统是采用方案二的。

回到开篇提出的问题1,操作系统是采用什么技巧来降低随机读写的性能问题的呢?操作系统通过按磁道对应的柱面划分分区,来降低磁盘IO所花费的的寻道时间 ,进而提高磁盘的读写性能。

2:touch一个新的空文件占用磁盘空间吗? 占用的话占用多少?
当touch一个新文件时其实是占用磁盘空间的,实际占用是一个inode的大小,inode的大小在文件系统格式化的时候就已经确定。
3、新建一个空目录占用磁盘空间吗?占用多少?和新建一个文件相比,哪个占用的更大?
再来说新建目录,同样,使用df -i命令来查看: 可以看出,新建一个空目录也会占用一个inode。所以,现在开篇的第三个问题也有答案了,新建一个空目录时,占用的空间是1个block+1个inode。其中空目录初始占用4KB,空文件不占block,所以,4K还是没什么变化。

4、你知道文件名是记录在磁盘的什么地方吗?

这时在空目录下创建更多的文件名长的空文件:这时,4K就变成了12K。占用了3个block。所以开篇的第四个问题就有了答案,文件名是存在目录所占用的block中的。

5、文件名最长多长?受什么制约?
文件名最长多长呢?linux系统为了避免程序员不节制地使用长文件名,强加了个限制,不能超过255byte。
6、文件名太长了会影响系统性能吗?为什么会产生影响?
文件名太长对系统性能当然会有影响,因为这可能会导致更多的磁盘IO。如果文件名特别特别长,文件数量相当大的时候就要考虑文件名是否导致目录所占的block太多。占空间大小倒是小事,磁盘便宜,但是你得考虑下在目录下查找文件时操作系统的感受,操作系统可需要用你你提供的文件名进行字符串比较,而且运气不好的话需要将其名下所有block都搞一遍才行啊。(当然了,你的文件名长度不变态,而且数量没有达到十万数量级的话实际上这个开销也不会太大,但是这个开销你还是知道的为好)
7、一个目录下最多能建立多少个文件?
一个目录下能创建多少个文件?其实这个最多是受限与你目录所在分区的inode数量。有一百万个inode,你最多就可以新建一百万个文件。但是,单个目录下文件数量最好不要过万,否则会带来系统性能的问题。
8、新建一个内容大小1k的文件,实际会占用多大的磁盘空间?
操作系统分配空间时是以block为最小单位。也就是说只要你的文件数据不为空,操作系统就至少会给你分配一个block来存储,直到你超过了4KB,操作系统再给你分配下一个block。新建一个1K大小的文件实际会占用一个block大小的空间。

9、向操作系统发起读取文件2Byte的命令,操作系统实际会读取多少呢?

文件系统在向磁盘发起IO请求时也是一block size为单位的,向操作系统发起读取文件的2byte,操作系统会一次性读给你1个block大小。因此磁盘的IO很慢。

10、我们使用文件时要怎么样来能提高磁盘IO速度?
使用文件时要怎么样来能提高磁盘IO速度?原理就是尽量将一个文件的block连续一些。这个前面有讲到。如果知道要新建的文件大概有多大,就在创建时给操作系统说一下,将文件的大小预留下来。这样就尽可能的为一个文件分配到连续的block,再读取文件时磁头就会省去很多寻道时间,IO速度就会明显快一些。

11、我们大家有个经验就是目录下小文件太多的情况下,往其它地方拷贝的话,速度会非常的慢,我们这时往往会把目录压缩一下再拷贝。现在你能说出这样做为什么会快吗?
文件的名字是存放在 父目录的 data block中,而文件的状态 atime,ctime, mtime, owner,group, perm, size等信息,都是存放在文件的inode中。因此,在遍历父目录的data block的时候, 也需要访问文件自身的inode信息。由于文件数量非常大, inode信息不一定连续, 可能会产生大量的随机IO, 并且每次的IO数据量都很小, 短时间内也无法进行合并读。随机IO多了, 性能就会下降,但是数据量其实非常小。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值