磁盘相关技术
讲讲磁盘相关。不是什么新鲜的东西,主要是自己作下笔记……
为什么需要磁盘调度
机械手臂换道速度很慢,单纯地按照FCFS来执行操作的话,性能太差,所以需要调度策略。
但调度也需要磁盘控制器支持。因为磁盘控制器是按照顺序将指令发给磁盘,如果读出的数据与指令顺序不一致,磁盘控制器就乱套了。
所以预先读出来的数据只能先存放在磁盘驱动器的缓存之中,然后等磁盘控制器主动拉取
无序传输技术
因为磁盘只能朝着一个方向旋转,所以考虑这样一种情况:控制器发出一条指令要读某个数据,该数据当然位于某个扇区中,但如果此时磁头刚好位于这个扇区的偏尾部位置,如果要按顺序读的话,那么就需要等待磁盘旋转几乎一整圈,才能从扇区头部开始读数据。
为了解决这个问题,会有无序传输的机制,磁盘会先把尾部的数据读出来,通过DMA放到内存中,等后面旋转到扇区头部后,再把头部的数据读出来发给控制器,这样就避免了浪费时间
几种磁头扫描的算法
- FCFS 不多解释
- SSTF(Shortest Seek Time First) 每次选择距离当前磁道最近的磁道来移动,缺点是对于远距离的磁道会有饥饿问题
- SCAN 类似于电梯算法,磁头来回摆动
- C-SCAN(单向扫描)磁头由内圈向外圈扫描,然后马上回到内圈
- LOOK 类似于SCAN,磁道不需要走到最边缘的磁道,只需要走到所有请求的最边缘
- C-LOOK 类似于C-SCAN
磁盘接口协议
- SATA
- SCSI
- NVMe
RAID
- RAID 0:不冗余,不备份
- RAID 1:RAID 0 数据不安全,一块盘坏掉,整个阵列就坏了.因此RAID 1 拿另一磁盘做备份,即一次性写两份.
- RAID 2:将原本一个扇区的数据以一位为单位(即条带长度为1)分在多块物理磁盘中。使用Hamming Code ECC进行校验,只能允许一块磁盘出错,如果>=两块出错,这个阵列就坏了。
- RAID 3:使用亦或特性求校验值,一般条带为文件系统的block大小
- RAID 4:加大条带长度,增加IO读写的并发性
- RAID 5:将校验数据分散在各个磁盘上
- RAID 6:增加一个校验盘
如果随机小块IO多,则适当加大条带深度;如果连续大块IO多,则适当减少条带深度.
RAID按照实现的位置,也分为软件层和硬件层的实现
- 软件层的实现:由OS实现,缺点是占用CPU资源(比如计算校验码),而且安装操作系统的那个磁盘不能做成RAID模式
- 硬件层的实现:RAID卡。缺点是扩展时不灵活。
为了解决扩展不灵活的问题,引入一个中间层:逻辑卷管理(Logical Volume Manager LVM),其作用是将RAID卡虚拟出来的逻辑磁盘(其实在OS看来,那就是物理磁盘了)进行切分管理
LVM相关概念
- PV(physical volume):OS识别到的物理磁盘
- VG(volume group):多个PV的集合,卷组
- PP(physical partition):将VG分割成逻辑上连续的小块,但物理上不一定连续
- LP:逻辑区块。多个PP的集合
- LV:多个LP组成的逻辑卷
一些数据
10000转的SCSI磁盘,内部传输速率为100MB/s(内部传输速率就是,完全不换道时的理想速度,实际上使用起来只有80MB/s左右)
IO延迟:控制器发出IO指令,到IO完成所消耗的时间。 一般认为,20ms以内的延迟,是可以接受的
意思是一秒可以处理50个IO请求,怎么可能只有这么点
实际上当IO请求很少时,IO延迟很低,可能不足1ms。而且控制器会有批量发命令的机制,批量的个数与Queue Depth的大小有关