NVME: I/O QID timeout completion polled问题

  • 问题分析

在系统使用过程中,内核dmesg有nvme: I/O QID timeout,completion polled信息报出。

先看报Warning的代码:

static enum blk_eh_timer_return nvme_timeout(struct request *req, bool reserved)

{

... ...

if (__nvme_poll(nvmeq, req->tag)) {

                dev_warn(dev->ctrl.device,

                         "I/O %d QID %d timeout, completion polled\n",

                         req->tag, nvmeq->qid);

                return BLK_EH_DONE;

}

... ...

}

可以看出Warning是在IO的timeout处理函数报出的,其原因是:系统在下发一个IO后长时间没有收到IO回复,此时会触发一个timeout来处理,但是timeout在处理过程中发现这个IO实际上回来了(也就是处于NVMe的nvmeq中),但是系统一直没有处理这个IO,没有处理的原因是系统漏掉了这个中断。具体步骤如下:

  1. 应用下发一个IO,此时会触发一个定时器来检测这个IO完成情况
  2. 底层设备完成了这个IO,并把结果放在nvmeq中,然后通过中断告知内核
  3. 内核把这个中断漏了,导致nvmeq中的IO完成结果不处理
  4. 定时器到期,检查到IO完成结果在nvmeq中,定时器处理函数会处理这个IO的完成结果,返回IO完成状态给内核给应用层,并报一个Warning

从上面具体步骤分析可以看出,漏中断报这个Waring不会导致IO丢失,但是会导致IO的延迟加大。

问题解决

通过构建测试环境发现在ARM64下(鲲鹏、飞腾都有测试),在调用set_irq_affinity后会有很小很小的概率miss中断,此外,通过核外的/proc/irq/smp_affinity接口也可以复现(写一个脚本不停地改中断的亲和性,再用dd写盘,就有一定的概率出现),此问题应该是ARM64 gic-v3的硬件缺陷(测试发现社区5.6内核都能复现出来),目前最新的麒麟内核修复了这一问题。

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烈日下的奔跑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值