• 磁盘的架构


    磁盘类型

    磁性旋转盘
    1. 硬盘驱动器 hard disk drive ,HDD
    2. 一块或多块盘片,一条带有电路的机械手臂(一条手臂可能不只一个磁头)
    3. 单位MB成本较SSD低
    4. 磁头寻道时间和盘片旋转时间花费数毫秒——慢I/O的主因
      * 最好的情况是下一个请求的I/O正好位于当前服务I/O的结束位置,磁头不需要寻道或者额外等待盘片旋转,此即为连续I/O;而需要磁头寻道或者等待盘片旋转的I/O则为随机I/O
      * 降低寻道和旋转等待时间的方法:
      a. 缓存
      b.文件系统布置和行为,包括写时复制
      c. 把不同的负载分散到不同的磁盘,避免不同负载之间的寻道
      d. 把不同的负载移到不同的系统(云计算环境可以通过该方法降低多租户效应)
      e. 电梯寻道(磁盘自身执行)
      f. 高密度磁盘,可以吧负载落盘的位置变得更紧密
      g. 分区(或者切块)配置,如短行程
      h. 使用高转速的磁盘

    短行程 只把磁盘外侧的磁道用来服务负载,剩下的部分不用或者留给地吞吐量的负载(归档)。
    扇区分区 磁盘磁道长度各不相同,磁盘中心区域的磁道较短,而外侧磁道较长,相比固定的每磁道扇区数(和位数),由于物理上较长磁道能够写入更多的扇区,扇区分区(又称为多区域记录)增加了扇区个数。因为旋转速度一定较长的外侧磁道比内侧磁道能够带来更高的吞吐量
    扇区大小 一种标准,高级格式 Advanced Format,以支持更大的扇区大小,特指4KB。
    磁盘缓存磁盘共有的一个部件,是一小块内存RAM,用来缓存读取的结果和缓冲要写入的数据。该内存允许I/O(命令)在设备上排队,以更高效的方式重新排序。
    电梯寻道 电梯算法,提高命令队列效率,根据磁盘位置把I/O重新排序,最小化磁头移动。类似电梯,不根据楼层请求的顺序提供服务,而是在大楼里上上下下扫一遍,并在当前请求的楼层停靠。可以通过检查磁盘I/O的跟踪记录进行验证,把I/O按照结束时间和开始时间分别排序,结果并不一致。(根据位置提供服务,磁头在1000偏移量处时,1000偏移量处的密集I/O,影响2000偏移量处的单次I/O)
    ECC磁盘在每个扇区的结尾存储一个纠错码,驱动器可以在数据被读出时进行验证,并有可能纠错。如果扇区数据读得不对,磁头可能会在下次旋转到相同位置时重新读取(可能会重试多次,每次磁头的位置会稍有不同),这可能是导致异常缓慢I/O的原因,检查操作系统和磁盘的错误计数器以确认。
    磁盘数据控制器 机械磁盘提供的一套表明了固定的每磁道扇区数比例和连续的可寻址偏移量范围。磁盘上的一切受磁盘数据控制器(磁盘内部的微处理器)掌控,由固件中的逻辑控制。控制器决定磁盘如何排布这些可寻址的偏移量,其中可以实现一些算法,如扇区分区
    固态驱动器
    固态磁盘 solid state disk, SSD
    通常在不同的偏移量下性能保持一致(没有旋转或者寻道的延时),对于给定的I/O大小也能预测出I/O延时。
    负载的随机和连续特征不再像对旋转磁盘那样影响重大。
    由于内部复杂的操作,碰到性能问题要想理解问题本质会和旋转磁盘一样复杂。
    闪存
    NAND
    使用基于电子的陷阱电荷存储介质,可以在没有能源的情况下永久地存储电子。
    名称里的闪和数据的写入方式有关,要求一次性擦除整个存储块(包括多页,通常每页8k)并重写内容。由于这种写入的开销,闪存的读写性能不对称。(写之前要擦除,黑板?)
    控制器
    SSD的控制器有以下任务:

    • 输入:每个页面(通常8k)的读和写只能写已擦除的页面,一次性擦出32-64页(256~512KB)
    • 输出:仿真一个硬盘驱动器的块接口,任意扇区数的读或写(512B或者4KB)
      对于写负载,特别是写入的I/O尺寸小于闪存块大小时,会造成写放大,块里剩下部分需要在擦除前被复制到其他地方,加上至少一个擦除-写周期。有些闪存驱动器通过一个电池供电的盘上缓冲(基于RAM),缓冲写入稍后再写,不需要担心断电问题。

    寿命
    NAND介质存在燃尽、数据消失和读干扰问题。
    SSD控制器通过移动数据解决这些问题。
    把写散布在不同数据块达到磨损均衡;超量配置存储则预留额外空间在需要时顶替坏块。

    病理学
    闪存可能出现的问题

    • 老化造成的延时离群点,SSD会多次尝试以读取正确的数据(通过ECC检查)
    • 碎片化造成的高延时
    • SSD做内部压缩造成的地吞吐量
    接口

    驱动器支持与系统通信的协议,一般通过一个磁盘控制器实现。

    存储类型
    • 磁盘设备
      服务器里多块磁盘,每一个都由操作系统分别控制。磁盘连接到一个磁盘控制器,控制器可能是主板上的内置电路或者扩展卡,让磁盘设备被发现并可以访问,该架构下磁盘控制器仅仅作为一个管道,使得系统可以与磁盘通信。

    • RAID
      冗余独立磁盘阵列(冗余廉价磁盘阵列)
      把磁盘组合成一个又大又快又可靠的虚拟磁盘,控制器通常包含一个板载缓存(RAM)以提高读和写的性能。
      在这里插入图片描述

    • 存储阵列
      把许多磁盘接入系统。
      使用高级磁盘控制器,提供一个更大的缓存(数GB)以提高读写性能,缓存由电池供电。
      混存在电池有效时以写回模式工作,失效则回到写穿模式,并且由于等待读-改-写周期造成突然写性能下降。
      通常通过外部存储控制器卡连接到系统上,卡与存储阵列之间的传输是IOPS和吞吐量的限制,为提高性能和可靠性,存储阵列一般通过双通道连接(使用两条物理线连接一块或者两块不同的存储控制器卡)

    • 网络连接存储
      NAS
      支持的网络协议NFS、SMB/CIFS 或者 iSCSI
      网络性能是重要的考虑因素,网络拥塞、多跳延时等等。

    操作系统磁盘I/O栈

    磁盘I/O栈里的组件和层次取决于操作系统、版本和采用的软硬件技术。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    I/O调度器使I/O能够排队排序(或者重新调度)以优化发送,具体由附加策略决定,在I/O调度之后,请求被放到块设备列里,等待发送给设备。

    • 空操作: 不调度(noop 是CPU 领域里空操作的称法),在调度被认为没有必要时使用(如RAMdisk)
    • 截止时间: 试图强制给延时设定截止时间,如以毫秒为单位选择读和写的失效时间,对于需要确定性的实时系统交有帮助。可以解决饥饿问题,某些I/O请求因为新发起的I/O插队而一直得不到磁盘资源服务造成延时的离群点,也有可能写把读饿坏了,也有可能是电梯寻道导致一个区域的密集I/O饿坏了其他区域I/O。最后期限调度器通过使用三个队列部分解决了问题:读FIFO、写FIFO和排序队列
    • 预期:截止时间调度器的增强版,通过启发式方法预测I/O性能,提高整体吞吐量。如,由于预测在附近的磁盘位置会有另一个读请求到达在读之后就暂停几毫秒,而不是直接服务写请求,这样可以减少旋转磁盘整体的磁头寻道。
    • CFQ:完全公平队列调度器把I/O时间片分配给进程,类似CPU调度,确保磁盘资源公平使用。允许通过ionice命令对用户进程设定优先级和类别。
  • 相关阅读:
    可靠的可视化监控平台应用在那些场景?
    1.Linux常见指令及权限详解
    vue跨域简易版
    【激光雷达码盘偏摆角的真假点映射关系】
    载波通讯电表的使用年限是多久?
    【Python百日进阶-WEB开发】Day177 - Django案例:09图形验证码(一)
    单调栈的常见用法
    Blind Signature盲签名与fabric区块链结合的应用
    年前端react面试打怪升级之路
    删除负数* -链表
  • 原文地址:https://blog.csdn.net/weixin_42755361/article/details/125511002