当前LINUX社区SCSI层错误处理在整个错误处理期间是阻塞整个SCSI HOST上所有的IO的,也就是即使仅某个盘的IO出错,在错误处理阶段会阻塞所有的盘的IO(即使其他的盘都是正常的),会造成业务的暂时停顿,这是目前SCSI错误处理存在经常让人诟病的问题。
分析完SCSI层的错误处理,个人认为可能可以优化,将基于SCSI HOST的错误处理变为基于SCSI DEVICE的错误处理(即尽可能只阻塞SCSI DEVICE的IO,而不是直接阻塞SCSI HOST的IO):
- 对每个盘单独创建一个错误处理线程,处理本盘的错误处理,当本盘出错时,仅阻塞本盘的IO,不影响其他盘的运行;
- 每个盘的错误处理中,恢复操作流程仍为:abort某个IO,若失败,对盘执行recover_lun/I_T_nexus_reset等恢复操作(SCSI DEVICE part恢复操作),若这些操作无法恢复错误,说明不仅仅是本盘的问题,升级到阻塞HOST上所有IO,待整个HOST所有IO状态明确后,进入SCSI HOS part恢复操作(控制器复位等)。
目前只是初步考虑认为可行,真正实施修改需要考虑的细节应该有很多,待有时间再尝试。