开始新对话

未解决

此帖子已超过 5 年

7190

2012年7月10日 07:00

关于SCSI设备timeout设置的一些疑问

不知道有没有人对Linux(RHEL)下,每个scsi设备的timeout设置有研究的?

最近碰到一些相关的问题。

当SAN 链路有点抖动,或是阵列端出现某种异常,

或是主机端对HBA卡发起一个issue_lip操作(echo 1 > /sys/class/fc_host/host7/issue_lip),

并且主机的IO压力有点大,IOPS超过1000,

这时候,会发生一些事情:

主机的message日志会出现这样的日志:

Jul 10 21:59:05 dbtest_r910 kernel: qla2xxx 0000:05:00.0: scsi(7:3:17): Abort command issued -- 1 41eb37 2002.

Jul 10 21:59:05 dbtest_r910 kernel: qla2xxx 0000:41:00.0: scsi(8:2:17): Abort command issued -- 1 63ef27 2002.

每当发生这个的时候,就悲剧了,IO会hung住一段时间,这个时间就是由scsi 设备的timeout参数控制的

具体可以这样看到:/sys/block/sdab/device/timeout

当修改这个参数以后,IO hung的时间就会跟着改变。

看起来像是hba驱动程序向target端发送出一个IO以后,恰好这时候target端没有及时响应,然后主机端会等待timeout设置中的时间,比如60s,在这60s内,target端可能早就恢复了,但是主机端不知道为什么,不能感知到,直到60s结束以后,会打印一条日志:Abort command issued,

同样的场景下,我将timeout设置成5s,IO hung了5s后,就会出现Abort command issued,并且就恢复了。

因此,让我感觉这个IO在传输过程中,被弄丢了,才导致主机端迟迟没有响应。

哪位大侠对这个比较有研究,可以为我解释下这个问题的前因后果吗?

109 消息

2012年7月10日 15:00

这个是SCSI驱动相关的问题啊,我觉得联系操作系统的厂商会比较好...

89 消息

2012年7月10日 19:00

这个文件是linux kernel的scsi_mod的预定义值,用来控制当链路发生问题是,需要用多长时间来终止或取消该scsi命令。60s应该是2.6.18的内核默认的值,就是redhat5版本使用的。你将timeout改成5s,就说明如果你在5s没完成这个scsi命令,就触发个abort。

42 消息

2012年7月10日 19:00

我想知道,在timeout的60s内,驱动都在做啥呢,链路问题早就恢复了(5s内),它也没有感觉到,还在一直等着。

白白让IO hung了这么久。

42 消息

2012年7月10日 20:00

有powerpath,但是没有任何多路径软件层面的切换

我模拟的故障是发起一个issue_lip操作,会有短暂的链路中断

然后通过应用层观察的,Oracle或者dd操作都可以。

89 消息

2012年7月10日 20:00

你怎么判断链路恢复的?还有你上面是不是还有powerpath?

89 消息

2012年7月11日 01:00

592         lpfc_set_loopback_flag(phba);            

593         if (mbxstatus != MBX_TIMEOUT)            

594                 mempool_free(pmboxq, phba->mbo   

595                                                  

596         if (mbxstatus == MBXERR_ERROR)           

597                 return -EIO;                     

598                                                  

599         return 0;          

这个是issue_lip在内核中的部分源码,还有一个值。 MBXERR_ERROR的时间为16.

109 消息

2012年7月11日 04:00

这是Emulex的驱动。xulei最初的问题里面出现的HBA卡是qlogic的。

对于原先的问题我理解为“在一个I/O请求的超时时间内,经历链路的中断以及恢复的情况下,I/O请求的处理”。这个问题可能确实要从驱动代码里面找一下。作为用户的话还是咨询一下操作系统/HBA驱动的厂商看看比较好一点。

找不到事件!

Top