0%

磁盘IO学习

磁盘物理结构

主要包括:

  • 磁盘盘片:存储实际数据;
  • 主轴:转动盘片;
  • 读写磁头:读写盘片上的实际数据;
  • 转动手臂:伸展磁头,让磁头位于要读取数据的盘片位置;
  • 转动轴:负责转动手臂的伸展;

每个磁盘有一到多个盘片,每个盘片有上下两个面用来存储数据,对应有上下两个磁头负责读写。

磁盘相关术语

  • 磁道:盘面上有很多半径不同的同心圆,每个同心圆为一个磁道;
  • 扇区:每个磁道被等分成若干个弧段,每个弧段为一个扇区;
  • 柱面:多个盘面上半径相同的同心圆组成一个柱面;

存储容量=磁头数×磁道(柱面)数×每个磁道扇区数×每个扇区字节数

影响磁盘性能的主要因素

  • 寻道时间:将读写磁头移动到正确的磁道上方需要花费的时间,毫秒级;
  • 旋转时间:主轴将请求的数据所在的盘面扇区移动到磁头下方所花费的时间,毫秒级;
  • 数据传输时间:完成数据传输所需要的时间;

一次I/O请求耗时 = 寻道时间 + 旋转延迟 + 数据传输时间

旋转时间与磁盘转速有关,大约是磁盘转一圈所需时间的一半。例如:7200rpm的磁盘旋转时间约为60×1000/7200/2=4.17ms。

磁盘性能的衡量指标

  • IOPS:每秒内磁盘的读写次数,理论值计算方法:IOPS = 1000 / (Tseek + Trotate + Transfer);
  • 吞吐量:单位时间内传输的数据量;

机械硬盘的顺序读写性能很好,但随机读写性能很差,这主要是因为:磁头移动到对应的磁道上需要时间,随机读写时,磁头需要不停的移动,时间都浪费在了磁头的移动上,所以性能不高。

操作系统一次IO路径

一次IO请求,在操作系统层面,从上到下大致经过以下几个层次:

  • 虚拟文件系统层(VFS Layer):主要是对不同的文件系统,提供统一的访问接口;
  • 文件系统层(NFS/Ext2/Ext3/NTFS等):Linux系统允许多种文件系统共存,每一个分区使用一种文件系统,可以跨文件系统操作文件;
  • 缓存层(page cache):缓存磁盘上的数据,提高IO读写的性能;
  • 通用块层(Generic Block Layer):对底层块设备的抽象,是粘合所有上层和底层的部分,BIO是其主要数据结构;
  • IO调度层(IO Scheduler Layer):采用合适的IO调度算法,调度IO请求到下层,会对IO请求进行排序合并;
  • 块设备驱动层(Block Device Driver Layer):从上层中取出I/O请求,并根据该I/O请求中指定的信息,通过向具体块设备的设备控制器发送命令的方式,来操纵设备传输数据;
  • 块设备层(Block Device Layery):磁盘设备;

IO性能优化技巧

  • 追加写:保证写性能的情况下优化读性能,类似的有HDFS、Kafka;
  • 合并小文件:大小小于一个block的小文件合并保存在一个block中;
  • 元数据管理优化:减少对元数据的查询操作,将小于1k的文件直接保存在inode中;

参考

  1. http://tech.meituan.com/about-desk-io.html
  2. http://bbs.mydigit.cn/read.php?tid=331754
如果对您有帮助