Advertisement

大话存储-学习总结6-系统IO路径及优化

阅读量:

理解主机端IO路径架构

应用程序层

1. NFS下的缓存机制

  • 默认mount参数下的IO
    默认条件下使用异步(async)方式,rsize=wsize=65535。内核不会透传程序的IO给NFS Server,对于写IO会延缓执行,积累一定的时间以便合并上层的IO。不管读还是写,async方式都会具有一定的效果,尤其是连续的IO地址。
    Linux下使用NFS,对于写操作,不管offset是否为Page或者512B对其,都没有任何写惩罚存在,对于读操作,也只在随机读的情况下出现了读惩罚,其他任何情况下都没有惩罚.

可以采用dd命令进行测试操作,并发现在使用过程中发现一些问题。
dd if=/mnt/3 of=/dev/null bs=1500 count=100
dd在运行过程中采用了同步调用加缓冲IO模式的操作方式,在到达底层后内核会整合dd的写入IO数据,并以并行整合发送到NFS服务器。

  • 指定同步(sync)参数设置
    针对Buffered IO模式下的同步写、异步写、异步读操作具有特殊意义。
    在读操作实现即时处理时,并不意味不可以执行Prefetch和Cache Hit操作;但对于写操作而言,则必须确保待处理数据即时可用。

对于NFS的IO逻辑不起任何作用

*使用O_DIRECT参数
Linux环境下NFS展现出显著的预读能力。仅在小随机读操作时伴随读惩罚,在这种情况下写操作几乎不产生惩罚。因此DIO选项的应用相对较少。

  • 在多进程环境中实现缓存一致性管理的方法,在Linux系统中NFS协议的缓存一致性管理上采取了从严格到不严格的分级策略。具体而言,在严格级别下采用的方式依次包括:通过DIO模式进行操作;通过noac选项配置mount;将actime threshold设定得更低;直至设置至最低水平。默认配置下的mount参数能够确保良好的性能表现。GETATTE方案在多客户端环境下实现了对NFS协议缓存一致性的高效管理。

文件系统层

文件系统的最大任务是建立并管理逻辑文件与其对应的底层存储设备之间的对应关系,并致力于优化这些对应关系的质量。此外,在这一过程中还需要完成一系列功能需求的具体实现工作:首先是为上层系统提供一系列基础功能的API接口支持;其次具体涉及预读缓冲区(PreRead)、Write Back/Write Through以及Flush操作的实现;再次通过日志记录(Log)、自校验(FSCK)等手段确保数据的一致性与完整性;最后同时管理并更新文件权限设置以及磁盘空间分配策略(Quota)。

  • 顶部(接入点)
  • 中部(缓存控制、文件处理)
  • 下部(数据映射、数据一致性、利用卷适配器技术进行底层存储适配)

命中是指输入的数据对应的位置恰好位于之前未被输入的IO数据区域

卷管理层

  • 块设备
    为了弥补底层存储系统的一些不足之处, 例如LUN空间的动态管理等, 卷管理的主要职责是实现对Block级别的映射, 在处理IO操作时, 卷层的功能包括将逻辑块与物理存储区域进行映射, 并负责将访问这些区域的操作进行相应的转发以及反向过程操作。
    即使上层应用发送来的IO请求大小不是4KB对齐, 系统依然会强制将其转换为符合4KB大小的要求。

Read Penalty
当某个读操作的大小无法被操作系统页大小或磁盘扇区大小整除时 该操作将导致 Read Penalty 的发生 即使边界不与 4K 对齐 Read Penalty 仍可能发生。
Write Penalty
每次 write operation incurs both additional reads and writes 这种 write overhead is notably greater than the penalties associated with read operations。

  • 字符设备

  • 概述
    传统类型的字符设备属于一类能够接收字符流的物理终端和键盘装置。这类装置可以直接执行底层操作而无需缓存,并规定每次输入输出(IO)操作必须以单个字符为单位。
    通过卷取后的抽象化处理仅保留了原始字符设备的基本特性。在执行IO操作时需遵循底层数据处理的基本规则。例如,在卷取处理中每个有效的IO长度只能对应扇区大小的规定。
    在不同层次之间传递的数据量保持一一对应的关系。

    • 裸设备
      字符设备又被称为裸设备。寓意在于可以直接对裸设备进行IO操作,只不过需要自行维护数据,如扇区映射以及预读缓存等。由于使用文件系统缓存以及内核缓存容易造成数据的不一致性且容易造成读写惩罚,对于IO性能要求高的程序,可以直接操作底层的物理设备。 * Direct IO
      如果即不想使用FS的缓存以防造成读写惩罚,又想利用文件系统的其他功能,则可以使用DIO模式。
      这里要注意一个概念,操作系统内有很多缓存,而用户程序的第一处缓存并不是通常理解的FS缓存,而是SystemBuffer。因为每发起一个IO请求,操作系统会根据程序IO请求的空间在操作系统内存空间分配相同大小的内存用于充当SystemBuffer,然后再往下才是文件系统缓存。

设备驱动层

  • SCSI设备驱动链
    其流程图如下
这里写图片描述

采用iostat工具进行I/O状态观察。此外可以通过blktrace实现对块级I/O数据的追踪。

Linux通过一种LibATA库来处理将SCSI协议转化为ATA协议,并发地传递给ATA控制器驱动程序

请注意,在底层IO Scheduler可能导致IO操作出现乱序的情况下,在发生系统不可恢复性故障时(即当系统发生宕机情况),会导致文件系统的数据一致性无法得到保障。因为文件系统通常基于块设备构建(即它依赖于块设备作为基础),因此FSCK作为一种恢复机制用于维护文件系统的元数据一致性。然而,在关键应用程序中(即那些对可靠性和稳定性要求极高的应用),通常会采用完全透传程序接口来发送字符设备的I/O请求。

  • 在IO路径上定义的 Queue Depth与 Queue Length 两个关键指标
    其中 Queue Depth被定义为队列的最大容量参数值,
    而 Queue Length则表示当前队列的实际占用量。
    从侧面观察发现,
    在一定程度上 Queue Length能够反映系统运行状态,
    并且可以用来评估系统的繁忙程度。
    监测结果表明,
    当检测到的 Queue Length持续增长时,
    则表明队列积压现象严重,
    从而影响单个IO操作的时间开销。

IO Latency 等于(Queue Length + 1)乘以 IO Service Time。
同样等于(Queue Length + 1)乘以其下一层的 IO Latency。

当前IOPS未达到理论最大值而队列堆积,则表明磁盘成为系统性能瓶颈;一旦IOPS达到理论极限,则说明存储控制器处理速度受限;若网络带宽成为限制因素,则传输介质成为瓶颈。

time [-p] command [arguments…]
time命令可以统计命令执行的时间

  • Queue Length 和 IOPS的关系
    IOPS = Queue Length / Average Response Time(ART)

随着IO Size的增大,在读取与写入盘片的过程中以及数据传输所花费的时间也会相应增加。尽管如此,在Write Merge操作中虽然会增加每个I/O操作所需的时间消耗,但这种做法显著提升了系统的处理效率,并成功地将吞吐量提升了一个数量级。值得注意的是,在网络技术领域中存在如Infineband这样的先进解决方案,在其设计中通过极小化传输单元实现了对小型I/O操作的高度响应速度优势;然而,在整体吞吐量的表现上却未必能够超越其他同类技术方案。

  • 面向SSD的Queue优化
    需要更大的Queue Depth。

全部评论 (0)

还没有任何评论哟~