searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

存储插盘动作3秒延迟问题,FPGA侧分析报告

2023-06-21 07:09:04
14
0

紫金存储调试中,测试发现host侧插盘动作有3秒延迟的问题,对此问题进行定位。

这里简单介绍一下插盘动作的过程,即从SOC发起插盘命令开始,host加载其对应的PF,virtio_blk驱动会主动去读后端磁盘的分区表,即会发起读IO操作,IO会经过SOC传输,待到IO返回正常,更新对应的寄存器,即为插盘成功。

不过SOC从开始发起插盘到SOC检测到插盘成功,这个过程耗时有3秒左右,是不正常的现象,因为一般加盘耗时是毫秒级。

这里也简单介绍一下IO在FPGA内部的传输。Host发出一个IO,即为TX通道,FPGA通过各种握手将其传送到SOC,即为SOC的RX通道。待到SOC处理完,会从SOC的TX通道返回给FPGA,最后FPGA将返回的IO,通过host的RX通道,送还给host。

 

现在在FPGA内部加一些时间统计来定位分析。

fpga内部做时间统计分析如下:

 

Host-->SOC 这个方向的时间统计:

  • Host侧TX方向FPGA第一次接收driver ok时间统计;
  • Host侧TX方向FPGA内部第一次notify时间统计;
  • SOC侧RX方向FPGA第一次PCIE TLP 写used index时间统计;

 

SOC-->Host 这个方向的时间统计:

  • SOC侧TX方向FPGA内部第一次收到SOC发送的notify时间统计;
  • Host侧RX方向第一次收到SOC返回的数据时间统计;
  • Host侧RX方向第一次更新used index的时间统计;

 

FPGA内部抓信号的现象如下:

从host tx通道对FPGA发起driver ok开始计数每4ns加1,fpga抓信号可以看到,host --> soc 方向 ,从driver ok 到soc 的PCIE TLP第一次 写usedindex总共耗时0x57f47*4ns=1,441,052ns,也就是差不多1.4ms,这个时间的延迟还是比较正常的。

硬件抓信号截图1如下:

                                                                                         图 1 host到soc方向时间统计

 

同样从host driver ok开始计数,每4ns加1,到soc软件第一个从tx方向下发第一个notify信号,时间统计为0x2ad03f38 * 4ns = 2,873,162,976ns,也就是差不多2.8秒的延迟,这个延迟是非常大的了。硬件抓信号截图2如下:

图 2 host到soc,再soc返回到host时间统计

从以上抓信号基本可以看出来,存储插盘动作出现的延迟3秒左右现象,时间大部分消耗在SOC 这一侧。

进一步结合软件打印分析,SOC软件侧打印显示, 等到SOC轮循检测到FPGA第一次写used index的时候,这已经到2.8s了。当然为了证明FPGA第一次向SOC对应内存空间写used index值是否也存在较大延迟,专门在SOC侧加了一个打印,检测SOC内存中index值是否发生改变,现象是从FPGA第一次通过DMA向SOC写used index值,到打印出内存值变化,这个时间间隔很短,不到毫秒。

结论:

FPGA向SOC第一次写used index值,到SOC轮询机制,真正检测到第一次used index值变化,这其中有2.8秒的延迟。问题应该为SOC软件检测机制出现异常,排除FPGA内部传输数据延迟较大的可能。后续是在soc软件插盘流程上做定位分析。

0条评论
0 / 1000
l****n
6文章数
0粉丝数
l****n
6 文章 | 0 粉丝
原创

存储插盘动作3秒延迟问题,FPGA侧分析报告

2023-06-21 07:09:04
14
0

紫金存储调试中,测试发现host侧插盘动作有3秒延迟的问题,对此问题进行定位。

这里简单介绍一下插盘动作的过程,即从SOC发起插盘命令开始,host加载其对应的PF,virtio_blk驱动会主动去读后端磁盘的分区表,即会发起读IO操作,IO会经过SOC传输,待到IO返回正常,更新对应的寄存器,即为插盘成功。

不过SOC从开始发起插盘到SOC检测到插盘成功,这个过程耗时有3秒左右,是不正常的现象,因为一般加盘耗时是毫秒级。

这里也简单介绍一下IO在FPGA内部的传输。Host发出一个IO,即为TX通道,FPGA通过各种握手将其传送到SOC,即为SOC的RX通道。待到SOC处理完,会从SOC的TX通道返回给FPGA,最后FPGA将返回的IO,通过host的RX通道,送还给host。

 

现在在FPGA内部加一些时间统计来定位分析。

fpga内部做时间统计分析如下:

 

Host-->SOC 这个方向的时间统计:

  • Host侧TX方向FPGA第一次接收driver ok时间统计;
  • Host侧TX方向FPGA内部第一次notify时间统计;
  • SOC侧RX方向FPGA第一次PCIE TLP 写used index时间统计;

 

SOC-->Host 这个方向的时间统计:

  • SOC侧TX方向FPGA内部第一次收到SOC发送的notify时间统计;
  • Host侧RX方向第一次收到SOC返回的数据时间统计;
  • Host侧RX方向第一次更新used index的时间统计;

 

FPGA内部抓信号的现象如下:

从host tx通道对FPGA发起driver ok开始计数每4ns加1,fpga抓信号可以看到,host --> soc 方向 ,从driver ok 到soc 的PCIE TLP第一次 写usedindex总共耗时0x57f47*4ns=1,441,052ns,也就是差不多1.4ms,这个时间的延迟还是比较正常的。

硬件抓信号截图1如下:

                                                                                         图 1 host到soc方向时间统计

 

同样从host driver ok开始计数,每4ns加1,到soc软件第一个从tx方向下发第一个notify信号,时间统计为0x2ad03f38 * 4ns = 2,873,162,976ns,也就是差不多2.8秒的延迟,这个延迟是非常大的了。硬件抓信号截图2如下:

图 2 host到soc,再soc返回到host时间统计

从以上抓信号基本可以看出来,存储插盘动作出现的延迟3秒左右现象,时间大部分消耗在SOC 这一侧。

进一步结合软件打印分析,SOC软件侧打印显示, 等到SOC轮循检测到FPGA第一次写used index的时候,这已经到2.8s了。当然为了证明FPGA第一次向SOC对应内存空间写used index值是否也存在较大延迟,专门在SOC侧加了一个打印,检测SOC内存中index值是否发生改变,现象是从FPGA第一次通过DMA向SOC写used index值,到打印出内存值变化,这个时间间隔很短,不到毫秒。

结论:

FPGA向SOC第一次写used index值,到SOC轮询机制,真正检测到第一次used index值变化,这其中有2.8秒的延迟。问题应该为SOC软件检测机制出现异常,排除FPGA内部传输数据延迟较大的可能。后续是在soc软件插盘流程上做定位分析。

文章来自个人专栏
紫金DPU存储卸载硬件实现有关技术探讨
6 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
2
0