问题描述
设备内核从3.x升级至5.x后,同样的系统配置,磁盘,用fio测试时发现IO性能下降,在ssd上体现尤为明显。
用blktrace+btt分析,对比老内核,新内核在D2C过程有较大延时,初步定位是新内核驱动侧的差异导致。
磁盘驱动流程梳理
blktrace的D2C,表示IO请求从block层提交给驱动到收到数据IO请求结束的过程。设备使用的是usb外接磁盘,IO请求在block层以下各驱动层接口大致如下。
IO请求通过调用q->mq_ops->queue_rq()进入scsi层处理,在scsi层将io请求转换为最终的scsi命令,再调用host->hostt->queuecommand()进入底层驱动层处理,在usb层将scsi命令转换为usb数据并发送至usb总线,等待数据返回。
数据返回时触发中断,通过一路上注册的回调函数处理数据,并通知block层IO请求已完成。
由分析可知IO请求在D2C流程中会经过scsi,usb,中断等模块,将这些模块的事件加入跟踪进一步分析D2C延时。
Ftrace分析
使用ftrace接口,打开blk tracer基础上,增加下列事件跟踪,对比新老内核D2C流程的延时差异。
echo 1 > /sys/kernel/debug/tracing/events/scsi/scsi_dispatch_cmd_start/enable
ec