本文主要是介绍【存储原理】IO超时处理 块层block-scsi层之间,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在IO下发过程中,IO可能因为软件或硬件问题导致IO无法返回,这时如果没有超时机制,IO会一直阻塞。IO一直阻塞是什么原因导致的?实际上存在超时机制,在达到一定时间IO仍未返回,会触发超时处理。超时时间是否可以减少?命令重试次数是否可以减少,尽量让超时IO和错误IO快速执行完成。
在分配request-queue时,会给每个请求队列分配一个定时器q->timeout,用于检测IO超时,默认30秒。当IO在指定时间没有返回时,会调用超时定时器的回调blk_rq_timed_out_timer(),它调用q->timeout_work。
static void blk_rq_timed_out_timer(struct timer_list *t)
{struct request_queue *q = from_timer(q, t, timeout);kblockd_schedule_work(&q->timeout_work);
}struct request_queue *blk_alloc_queue(int node_id)
{
timer_setup(&q->timeout, blk_rq_timed_out_timer, 0);
INIT_WORK(&q->timeout_work, blk_timeout_work);}
struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set, struct request_queue *q, bool elevator_init)
{INIT_WORK(&q->timeout_work, blk_mq_timeout_work); blk_queue_rq_timeout(q, set->timeout ? set->timeout : 30 * HZ);
}
对于MQ设备,因为request是在初始化request_queue时预分配的,通过tag管理,blk_mq_timeout_work遍历tag,通过bitmap找到request.
static void blk_mq_timeout_work(struct work_struct *work)
{struct request_queue *q =container_of(work, struct request_queue, timeout_work);blk_mq_queue_tag_busy_iter(q, blk_mq_check_expired, &next);
}
这篇关于【存储原理】IO超时处理 块层block-scsi层之间的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!