IO设备、磁盘和RAID


I/O设备

image-20210827103229503

分层架构:物理布局及造价成本。如外设I/O总线便宜,可以连接大量设备。

设备与协议

一个标准设备包含两部分:向系统或者其他部分展现的硬件接口,和内部结构。

简化的设备接口包含三个寄存器:

  • 状态寄存器:读取并查看设备当前状态。
  • 命令寄存器:通知设备执行某个具体任务。
  • 数据寄存器:收或发数据。

操作系统与该设备的交互:轮询设备(status),不忙了写入数据(data),OS将命令写入命令寄存器(command),设备知道数据准备好了,执行命令,OS轮询设备(status)是否完成命令。

中断

轮询太低效,可以用中断减少CPU开销,操作磁盘的时候CPU可以运行别的进程。有些情况,如与CPU进行交互的设备很快,那么还是轮询效率高。混合策略:先轮询一段时间,设备没有完成工作再中断。

还有一个最好不要使用中断的场景就是网络:网络收到大量数据包,都中断的话,可能会发生活锁(忙着切换上下文了,无具体响应)。

有一个基于中断的优化是设备抛出中断前等待一段时间,其他请求可能完成,多次中断就可以合并为一次中断,等待时间需要权衡。

DMA

Direct Memory Access。协调完成内存和设备之间的数据传递,NO CPU。因为内存与磁盘的数据传递功能比较单一,又一直要用到,占用CPU属于杀鸡用牛刀,所以可以用一个DMA单元完成。

磁盘驱动器

大致形状(盘片上面涂上薄薄的磁性层,可永久存储数据位):

image-20210827120005462

驱动器由大量扇区组成,每个扇区可能是512KB,可以多扇区操作,但是只保证每个扇区的写入是原子的。

$ fdisk -l
Disk /dev/vda: 53.7 GB, 53687091200 bytes, 104857600 sectors
Units = sectors of 1 * 512 = 512 bytes

这个图还挺清晰的,旋转速率典型值:7200 ~ 15000 RPM,一个同心圆称为磁道(track),数百个磁道只有头发的宽度。磁头读取数据或者改变数据,可以寻道(seek)。

磁道偏斜:给寻道反应时间,如下图:

image-20210827121231649

磁盘驱动器缓存,一般8MB或者16MB,写入策略两个选择:写到内存算写入还是磁盘算写入。

随机读取很慢,顺序读取还可以,如两个磁盘例子:

image-20210827140600593

磁盘调度

磁盘请求需要的时间是可以猜测的,SJF(shortest job first)。

最短寻道优先(Shortest Seek Time First)。

SCAN。跨越磁道来回扫描。

SPTF(Shortest Positioning Time First)。最短定位时间优先。

现代操作系统,调度程序通常会选择它认为最好的几个请求(如 16),将它们全部发送到磁盘。磁盘利用其磁头位置和详细的磁道布局信息等内部知识,以最佳可能(SPTF)顺序服务于这些请求。

I/O合并,减少了发送到磁盘的请求。

RAID

廉价冗余磁盘阵列(Redundant Array of Inexpensive Disks),使用多个磁盘一起构建更大,更快,更可靠的磁盘系统。硬件RAID像一个计算机系统,专门管理一组磁盘,内部由多个磁盘、内存以及处理器组成。可靠,快速(并行多个磁盘)。

透明支持部署:原来用磁盘怎么用,用RAID还怎么用,对外部来说不必改变什么,不用担心兼容问题。

故障模型,如故障-停止故障模型“

  • 磁盘状态:正常或故障(认为永久丢失)
  • 假定:故障容易检查到

评估RAID

  • 容量,没有冗余,N,保存副本的话,N/2,一般方案容量介于这之间。
  • 可靠性
  • 性能

RAID 0级:条带化

无冗余。

image-20210827161427142

通过轮转的方式将磁盘阵列的块分布在磁盘上:如访问连续数组,这种方法能获取最大的并行性。

一行的块称为条带,如0、1、2、3。

这个块也可以不止一个。

容量N个磁盘就有N个磁盘的有用容量,可靠性没有,丢了就丢了,性能很好,可以并行使用所有磁盘。

RAID 1级:镜像

每个块,不同磁盘上保留多个副本(解决可靠性问题)。

image-20210827162549790

读一个块的数据可以从任一副本,写都要写,写入可以并行进行。

镜像级别为2情况下容量N/2,成本高,可靠性容许任一磁盘故障,性能比单个磁盘略差。

RAID一致更新问题。掉电了,两个磁盘上同一个副本内容不一样。一般方法,使用预写日志,先记录接下来的操作,崩溃之后运行恢复进程,没做完重新执行。大多数RAID包含少量非易失RAM,用于执行这个。

顺序读取也只有一半的带宽,因为磁盘0和磁盘1必然有一个跳过块2,其他也一样,而跳过不读也是要耗费旋转时间的。

RAID 4级:通过奇偶校验节省空间

镜像容量至少少一半。奇偶校验牺牲性能减少容量使用。P为奇偶校验:

image-20210827163915998

如校验是异或函数:

image-20210827164427228

一块磁盘故障了,可以从P磁盘恢复。

通过这种方式,容许一个磁盘故障,包括P磁盘,重新生成就好了。

P需要实时更新:

  • 加法奇偶校验:更新一个磁盘的块时,先读取所有其他块的数据,然后并行写入数据和校验数据。
  • 减法奇偶校验:更新一个磁盘的块时,先读这个块的老数据,和P的老数据,如果新数据和这个块的老数据不同,就翻转P的校验位。

小写入问题:磁盘可以并行写入,但是P校验磁盘还是串行的。(大块数据可能位于同一行上,同一个P块。)

RAID 5级:旋转奇偶校验

image-20210827165913074

奇偶校验块跨驱动器旋转。

随机写入性能比4显著提高,其他与4基本相同,基本替代了RAID 4。

归纳

  • 性能,不关心可靠性:条带
  • 随机I/O性能和可靠性:镜像,代价容量下降
  • 容量和可靠性:旋转奇偶校验

参考

OSTEP