磁盘物理结构
主要包括:
- 磁盘盘片:存储实际数据;
- 主轴:转动盘片;
- 读写磁头:读写盘片上的实际数据;
- 转动手臂:伸展磁头,让磁头位于要读取数据的盘片位置;
- 转动轴:负责转动手臂的伸展;
每个磁盘有一到多个盘片,每个盘片有上下两个面用来存储数据,对应有上下两个磁头负责读写。
磁盘相关术语
- 磁道:盘面上有很多半径不同的同心圆,每个同心圆为一个磁道;
- 扇区:每个磁道被等分成若干个弧段,每个弧段为一个扇区;
- 柱面:多个盘面上半径相同的同心圆组成一个柱面;
存储容量=磁头数×磁道(柱面)数×每个磁道扇区数×每个扇区字节数
影响磁盘性能的主要因素
- 寻道时间:将读写磁头移动到正确的磁道上方需要花费的时间,毫秒级;
- 旋转时间:主轴将请求的数据所在的盘面扇区移动到磁头下方所花费的时间,毫秒级;
- 数据传输时间:完成数据传输所需要的时间;
一次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中;