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

        所有成熟的操作系统内核都将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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值