从错误处理说Linux SCSI middle layer的缺陷

来源:互联网 发布:fate hf 知乎 编辑:程序博客网 时间:2024/06/03 14:57
        所有成熟的操作系统内核都将SCSI协议的实现分为三层,up layer为特定SCSI设备的驱动,如硬盘的SD驱动、光驱的ST驱动,而Middle layer则是SCSI协议的通用层,通用层下则是SCSI传输层的实现。因此可以理解为SCSI middle layer是一个从传输层到特殊设备的通用实现层。

        由于middle layer的通用性,导致的一个问题就是其复杂度很高。SCSI错误处理的通用做法是在软中断中调用scsi_decide_despoistion来处理传输层和Target返回的错误码,而该处理函数对大多数错误码的处理就是返回SUCCESS,这样SCSI middle layer可以将一个SCSI命令以错误终止掉,然而在scsi_io_complete中继续判断SCSI的返回码。本来设定的最大重试次数就在这个过程中减一、加一,导致不少错误码会出现无限重试。当然对于一个PC,只有一块硬盘,该实现可以保证最大限度的拯救硬盘。而企业级的设计都存在冗余,而这样将IO长期不返回却是不可容忍的。

    SCSI middle layer对超时的SCSI命令的处理流程更让企业级的应用崩溃。该处理流程可以归结如下:

            Abort Command-> Device reset -> Target reset -> Host reset

但整个过程都是在阻塞整个SCSI HOST的情况下执行的,当然PC的硬件,一个SCSI HOST只会有很少的硬盘,阻塞整个HOST出现的问题比较少,但是在企业级的应用下,一个HBA卡接外部阵列或采用expander接大量的盘,将会阻塞很多盘的业务,导致整个读写业务暂停,也是不可容忍的。这样的过程就出现了将出错扩大化的危险。

        从整个错误处理来说,Linux 的SCSI middle layer不能支持性能要求很高的企业级应用。由于企业级的应用大多数存在硬件冗余,这样的冗余本来就是用来保证出错时能将数据恢复,在这样的冗余的设计下,要求的是尽量不阻塞业务。但作为PC,Linux似乎能做好它的工作了。

0 0
原创粉丝点击