存储IO分析

2020-05-17  本文已影响0人  Yves_Chen
IO分析

IO Path

App IO

App

主动发起IO
读、写;
大、小;
连续、随机;
顺序、并发;

Network IO

          大话存储上一个读IO请求立马对应一个Response,异步变同步,但笔记本测试中还是异步IO。

        - No Buffered Read

          程序IO大小被透传到CIFS Server,CIFS Server返回同样大小的IO包。

          IO在CIFS Client不会命中缓存或产生Page Fault,但IO在CIFS Server上可能命中或产生Page Fault导致读惩罚。

    - 写行为

        - Buffered Write

            - WT

              写IO写入Client Cache,再产生一个Page IO传到Server,Server刷盘,回Client写IO成功。
              无论在Client还是Server,IO写入Cache前都可能产生一个Page读,NFS不会?。

            - WB

              IO写入Client Cache就返回应用程序IO写入成功,Client根据算法定时将Cache刷到Server。

        - No Buffered Write

          写IO透传到CIFS Server,IO写入Server Cache,若Cache中没有对应页面,先读入cache,写入数据,返回客户端IO写成功,不用刷盘。

- 总结

  使用CIFS时,使用No Buffered模式避免读写惩罚,同时保证iosize为4KB的整数倍,杜绝从Client到Server端整个IO路径中的惩罚现象。

  

  考虑使用Buffered IO情况:小块连续读、小块连续写。

  

  WT模式不考虑使用。

OS IO

File System

Volume

IO Manager

- note

  Buffered IO IRP,用户程序Buffer会被Swap机制复制到硬盘,以腾出物理内存空间供其他程序使用。
  DIO模式用户程序Buffer被锁定。
  猜测是Buffered IO模式,层层都会耗费内存,所以采用了SWAP机制节省内存。

Device Driver

  总线驱动通过总线FDO扫描总线感知到PCI设备,

  为感知到的PCI设备创建PDO,由于总线驱动不知道如何使用PCI设备,不能为其创建FDO;

  

  如PCI设备是SCSI适配卡:

  内核将SCSI Port/Miniport驱动(SCSI控制器驱动)加载到其PDO上,并为其创建FDO,之后便可以感知到SCSI卡后端SCSI总线连接的SCSI Target设备了,并为SCSI Target创建PDO;

  内核再加载Storage Class Dirver

  

- Storage Class Driver

  1.为每个具体设备生成FDO对象,如果设备存在分区,则为每个分区生成PDO和FDO。

  2.获取每个设备属性信息,比如是否支持Write Cache及其模式、最大传输单位等。

  3.处理上层下发的IRP,将IRP映射翻译成包含CDB的SRB下发。

  4.维护每个请求的超时机制。

  5.根据底层反馈的所能接受的每个请求的最大传输单元,分割上层IRP请求。

  

    - SCSI PassThrough

      用户程序可以直接生成CDB发向底层设备,Class Driver收到CDB后会做格式检查和IO Size分割,然后将CDB封装到SRB中发送给Port Driver。

    - Command Queue

      Class Driver没必要对上层发来的IRP做Queue处理,Queue处理由下层的Port Driver负责,Class Driver通过设置下发给Port Driver的标记,控制Port Driver对该请求的Queue处理,如放到队首、队尾等。

    - 获取设备属性信息

      1.SCSI/IDE控制器的最大传输单元,即每次IO的最大可读写扇区长度。

      2.是否SCSI/IDE控制器在DMA时可以读写不连续的物理内存Page,数量是多少。

      3.SCSI/IDE控制器对Buffer边界对其的要求信息。

      4.SCSI/IDE控制器是否支持SCSI的TCQ以及是否支持基于每个LUN的TCQ。

      5.SCSI/IDE控制器是否支持WriteBack模式的写缓存,具体类型是什么,比如是否有电池保护等。

    - 请求重试

      大部分的IO请求重试由Port Driver来做,比如设备繁忙,总线RESET,上层Class Driver不知道也不关心,如果Port Driver重试多次依然失败,需要将错误上报给Class Driver,此时Class Driver不应该再次发起重试。

      但如果是上层逻辑错误,如Check Conditions等,需要上层Class Driver解决逻辑问题并重试。

- Storage Miniclass Driver

  用来针对特殊设备实现特殊功能,有厂家自行开发。

- Storage Port Driver

  驱动外部总线控制器,如SCSI卡、FC卡、RAID卡。

  为Class Driver屏蔽下层的LUN到适配卡的物理链路,不管LUN是通过FC网络、IP网络或是SCSI总线到达。

  

  可以认为,Port Driver是适配卡的驱动,Class Driver是具体磁盘或者LUN的驱动。

    - SCSI Port Driver

      1.提供驱动的适配器属性给上层Class Driver,如最大传输单元的限制以及Write Cache属性信息等。

      2.确保适配卡所连接的所有设备处于正常状态,未上电设备不会被上层使用。

      3.为Class Driver提交的IRP异步请求维护队列,发生底层设备错误或设备繁忙时重试。

      4.提供给接口给上层来控制自身的Queue。

- SCSI Miniport Driver

  1.发现适配器并探寻其各种属性。

  2.初始化适配器。

  3.执行数据IO过程。

  4.处理中断、总线Reset等事件。

  5.维护超时计时器。

Queue中只要有存货,就证明对应的下层处理存在瓶颈,Queue Length越大,瓶颈越大。从主机应用层到底层设备驱动层,再到底层存储设备内部,任意两个模块间的Queue都遵循此原则。

上层多个模块共同访问下层模块,如多个主机通过一个端口共同访问一台存储设备,各个主机的适配器Queue Depth之和要等于存储设备端口的Queue Depth,以保证不会饿死任何一台主机。

对于SSD,由于SSD可并发执行IO,那么适配卡的Queue Depth要大于等于该并发度。

- 文件系统建立在块设备之上?777

Storage IO

Disk

Disk organization

后端磁盘控制器/适配器层

RAID管理层

LUN管理层

前端接口设备及驱动层

缓存管理层

数据前处理和后处理层

IO诊断

1

症状:存储系统每秒接收到的IO数远未达到系统标称值,链路带宽也远未达到,前段接口的Queue Length远小于Queue Depth,并没有严重挤压现象,存储系统后端磁盘繁忙程度很低。主机端程序的IO延迟很低,但是吞吐量以及IOPS并未满足要求。
可能病因:IO源头并发度不够,程序使用了单线程同步IO。
治疗:修改程序使用异步IO或多线程设计。

2

症状:

存储系统美妙接收到的IO数远未达到系统标称值,链路带宽也远未达到,前段接口的Queue Length之接近Queue Depth,显示有挤压的IO,存储后端磁盘繁忙程度很低。主机程序的IO延迟很低,但是吞吐量以及IOPS并未满足要求。

可能病因:

主机端适配卡驱动或存储系统前段接口适配器驱动Queue Depth不够。

治疗:

调节以上两处Queue Depth。

3

症状:

存储系统检测到Cache Hit率极低,磁盘几乎百分百繁忙,而前端IOPS和带宽很低,业务所要求的响应时间无法满足。

可能症状:

IO随机读过大。

治疗:

治标,使用更高速高规格的磁盘或SSD,或缓存LUN等技术;

治本,改善程序的IO设计降低IO随机读。

4

症状:

从主机端或者存储系统端监测到的主机内核发出的IO从数量和容量上都表现为较高的值,通过计算理论上可以满足程序的需求,但是程序层却表现的很迟缓,IO延迟、IOPS、带宽等皆达不到从存储端监测到的数据所体现的指标。

可能病因:

主机端发生读写惩罚现象。(详见789)

治疗:

在使用内核缓存的情况下,是程序发起的IO Size为Page Size的整数倍且和Page偏移对齐,避免使用Write Through加重惩罚;

使用DIO越过缓存避免惩罚。

5

症状:

主机端并未发出大量的IO请求,但是存储系统却忙得不可开交,同时存储系统上并没有诸如Deduplication等Data Cooker的后台操作,主机端IO延迟偏高。

可能病因:

存储端发生惩罚现象。主机端IO Size未Page对齐、LUN不对齐。

6

症状:

存储系统单个RAID组中硬盘很多,转速也很快,存储系统控制器处理能力也很强大,这个RAID组中有多个LUN分配给了多个主机使用。就是不知道为什么,当一台主机访问其上的LUN时,性能很好,但是一旦有另一台主机访问这个LUN,或者访问这个RAID组上其他LUN的时候,性能骤降,两台主机获得的性能之和还不如之前单台主机所获得的性能。

可能病因:

多LUN共享同一RAID组IO冲突。LUN在RAID组中的横、纵、全打散、类文件系统等不同的分布方式,决定了对不同LUN访问时IO冲突的大小。

上一篇 下一篇

猜你喜欢

热点阅读