技术新讯 > 信息存储应用技术 > 一种硬盘随机延时模拟测试方法与流程  >  正文

一种硬盘随机延时模拟测试方法与流程

  • 国知局
  • 2024-07-31 19:49:28

本发明涉及计算机新兴信息技术的,尤其涉及一种硬盘随机延时模拟测试方法。

背景技术:

1、在存储系统中,硬盘是故障率较高的一个部件,并且硬盘承载着用户数据,当硬盘发生故障时,存储系统需要保证用户的业务尽可能不受影响。因此,在存储系统的测试中,硬盘故障场景的测试是不可或缺的。而在硬盘的所有故障类型中,硬盘亚健康(即延迟、慢盘)是一种特殊的故障,它并不是完全不能处理业务,但如果不对它做处理,它将会拖垮整个系统,因此硬盘亚健康的处理和测试变得尤为重要。

2、要测试硬盘亚健康,首先就需要能模拟出硬盘延时,现有技术中常有以下方法;

3、1、在中国专利公开号为:cn116662085a(磁盘故障模拟测试方法、测试装置和电子设备)的专利文件中提到:向内核io过程中用于读写磁盘的特定函数,注入返回进程忙等待的结果,如mdelay(300)将模拟磁盘响应延迟300ms的现象。该方法存在问题:

4、模拟延迟是调用忙等待函数,会持续占用cpu,在延迟过程中无法运行其他任务,因此除了模拟磁盘延迟,也会对系统其他任务的执行造成影响。

5、在中国专利公开号为:cn115576767a(一种慢盘模拟方法、装置、设备及介质)中提到在通用块层进程io拦截及时延注入,对应的目标函数为blk_mq_start_request,该发明对时延的模拟是通过sleep函数。该方法存在问题:

6、blk_mq_start_request是多队列处理函数,blk-mq代码在linux-3.13内核中合入主线,在linux-3.16中成为内核的一个完整特性,对于早期单队列块设备的场景不适用。

7、在通用块层模拟,没有在更底层(比如scsi中层、nvme驱动层)的模拟真实;同时通用块层难以模拟各种硬盘错误码(比如scsi错误码),因此扩展性不佳。

8、该方法只适用于内核驱动的硬盘,不适用于spdk驱动的nvme。

9、虽然sleep不是忙等待函数,但当需要模拟较大延时比如10s甚至数十秒时,在内核sleep这么长时间难以预料会产生什么异常影响。

10、该方法只提出了针对整盘的延时模拟,没有对磁盘某个区域的模拟,比如只想模拟磁盘某个分区延时的场景,该方法不适用。

11、2、在中国专利公开号为:cn111897684b(磁盘故障模拟测试的方法、装置及电子设备)的专利文件中提到:本公开不是在执行完读写操作之后立即将读写结果返回至存储软件,而是在访问操作完后,延迟预定的时间,然后才返回。添加时间延迟控制参数的方式可以是:在目标函数中加入一段功能性的程序代码,上述功能性的程序代码具有控制时间延迟的功能。从描述可知,虽然没有提到具体的目标函数和延迟方式,但本质还是让目标函数延迟一段时间再返回,可能存在前面提到的一些问题。

12、3、而在中国专利公开号为:cn106802847a(用于模拟慢速存储盘的方法和装置)的专利文件中提到了一种在scsi中层模拟慢盘的方法,该发明中没有明确构造延时的具体方法,并且也只适用于scsi硬盘。

技术实现思路

1、本部分的目的在于概述本发明的实施例的一些方面以及简要介绍一些较佳实施例。在本部分以及本技术的说明书摘要和发明名称中可能会做些简化或省略以避免使本部分、说明书摘要和发明名称的目的模糊,而这种简化或省略不能用于限制本发明的范围。

2、鉴于上述现有技术中存在的问题,提出了本发明。

3、因此,本发明目的是提供一种硬盘随机延时模拟测试方法,其适用于常见的硬盘类型,如基于内核scsi协议的ssd/hdd、内核驱动的nvme ssd、spdk驱动的nvme ssd。利用函数hook技术,在驱动层劫持处理io request返回结果的回调函数,然后添加注入延迟的代码逻辑,接着再调用原回调函数返回,从而达到模拟延迟的目的。这里添加延迟不会调用任何delay或sleep函数,而是直接将返回的io请求加入到io队列重试,然后就立即调用原函数返回,因此不会对系统造成任何异常影响。

4、为解决上述技术问题,本发明提供如下技术方案:

5、一种硬盘随机延时模拟测试方法,其特征在于,包括以下步骤:

6、步骤一:用户输入待模拟延时的硬盘信息和参数;

7、步骤二:存储用户输入的硬盘延时参数;

8、步骤三:劫持回调函数,进入自定义函数,当io request从底层返回后,进入到回调函数做处理,在该函数中将根据io request的状态做不同处理;

9、步骤四:提取io信息,进入自定义函数后,首先需要从底层返回的io request中提取io信息;

10、步骤五:查询硬盘延时参数,判断是否注入延时;

11、步骤六:模拟随机延时或固定延时,当用户输入的延时值是一个区间范围时,则模拟该区间范围内的随机延时;当用户输入的延时值是单个值时,则模拟固定延时;

12、步骤七:调用原回调函数返回,当不需要模拟延时,或者模拟延时的逻辑将iorequest加入io队列等待重试后,都需要调用原回调函数返回,以完成本次io处理。

13、作为本发明所述一种硬盘随机延时模拟测试方法的一种优选方案,其中:所述步骤一中,输入的参数包括:待模拟延时的硬盘名称、lba范围、延时范围。

14、作为本发明所述一种硬盘随机延时模拟测试方法的一种优选方案,其中:所述步骤二中,需选择一个数据结构来保存用户输入的硬盘延时参数,可选择的数据结构包括:链表、数组或是以硬盘名称为key的哈希表。

15、作为本发明所述一种硬盘随机延时模拟测试方法的一种优选方案,其中:所述步骤二中,采用链表存储硬盘延时模拟参数,主链表保存待模拟延时的所有硬盘disk节点,每个节点下面再挂一个子链表delay节点,用来保存这块硬盘要模拟的多个延时参数,包括lba范围,延时范围。

16、作为本发明所述一种硬盘随机延时模拟测试方法的一种优选方案,其中:所述步骤三中,劫持回调函数时,需要用到函数hook技术,即让程序执行到目标函数时,对目标函数进行劫持,目标函数将不会被调用,从而让程序进入自定义的函数,在自定义的函数中可以添加额外的功能,最后再调用原目标函数;

17、目标函数劫持均使用inline hook,包含以下步骤:

18、s1:查找符号表,获得需要劫持的函数即目标函数的地址;

19、s2:保存目标函数的前几条指令,用于后续跳转回原函数;

20、s3:替换目标函数的前几条指令为jump指令,跳转到桩函数;

21、s4:在桩函数中,调用自定义函数,在自定义函数中实现延时模拟功能;

22、s5:执行保存的目标函数的前几条指令,因为原目标函数的前几条指令已经被替换了,因此需要先执行保存的前几条指令,再跳回原目标函数执行剩余指令;

23、s6:跳转回原目标函数,继续执行剩余的指令。

24、作为本发明所述一种硬盘随机延时模拟测试方法的一种优选方案,其中:所述步骤四中提取io信息包括:该io所属的硬盘名称、lba位置、io request创建时间;其中硬盘名称和lba位置用于判断该io request是否落在待模拟延时的目标盘的目标位置,创建时间用于判断该io request的延时是否满足预期。

25、作为本发明所述一种硬盘随机延时模拟测试方法的一种优选方案,其中:所述步骤五中,查询用户输入的硬盘延时参数,判断是否需要对该io request模拟延时,判断的依据是输入参数中的硬盘名称、lba范围是否与该io request匹配;

26、首先遍历主链表,查询是否存在硬盘名称与提取的io信息中硬盘名称匹配的disk节点,如果不存在则说明该io request没有落在需要模拟延时的盘上,此时直接调用原回调函数返回即可;

27、如果存在与硬盘名称匹配的链表节点,则说明该io request落到了需要模拟延时的盘上,接着进一步遍历该链表节点下的子链表,判断是否存在某个delay节点,其指定的lba范围包含了io request的lba位置,如果不存在这样的节点,则说明该io request没有落在需要模拟延时的lba范围内,此时直接调用原回调函数返回即可;

28、如果存在子链表delay节点其lba范围包含了io request的lba位置,说明该iorequest落在了需要模拟延时的lba范围内,需要对其模拟延时,此时从该子链表节点中获取待模拟延时的范围值,然后进入后续步骤;

29、如果要取消某个延时模拟,只需要在链表中将对应的delay节点移除即可,然后在查询硬盘延时参数时,将找不到匹配的节点,因此判断为不注入延时。

30、作为本发明所述一种硬盘随机延时模拟测试方法的一种优选方案,其中:所述步骤六中,不管是模拟随机还是固定延时,都利用了驱动层自身的重试机制:通过反复将io加入到io队列重试,利用重试机制来积累延时,当该io在反复重试中积累的延时达到预期值时,则调用原回调函数正常返回。

31、作为本发明所述一种硬盘随机延时模拟测试方法的一种优选方案,其中:模拟固定延时的实现方法为:

32、底层返回的io request在进入目标函数处理前,劫持该目标函数,进入自定义的函数,在自定义的函数中如果确定该io request需要模拟延时,则判断该io request从创建时起到当前的时间,是否大于等于预期延时,如果大于等于预期延时,说明该io request的延时已经符合要求,此时直接调用原目标函数返回即可;

33、如果小于预期延时,则说明该io request的延时还不够,需要再增加延时,此时则将io request重新加回io队列,等待下次重试,然后立即调用原目标函数返回。当io处理流程重新将该io request出队后,再次下发到底层硬件设备处理,底层处理完成后再次返回到目标函数处理,此时再次进入到自定义的函数中,重复上面的判断逻辑;只有当iorequest累积的延时满足要求时,才会正常返回,否则将一直重复上面的流程,通过反复重试来积累延时。

34、作为本发明所述一种硬盘随机延时模拟测试方法的一种优选方案,其中:模拟随机延时的实现方法为:利用驱动层自身的重试机制,其中的预期延时不再是一个固定值,而是一个变化的值,这个值在给定的延时范围内随机生成,在基于时间片的方法产生随机延时的方法步骤为:

35、s1:首先需要设置一个更新延时的时间片,即延时变化的周期,这个值可以是全局的,针对所有待模拟的硬盘生效,也可以为每个待模拟的硬盘设置一个单独的时间片;

36、此外,需要在保存硬盘延时参数的链表中,新增参数用于保存当前时间片的起始时间和延时值,在每个disk节点下的子链表delay节点中,新增参数用于保存该盘针对该lba范围的当前时间片起始时间和延时值;

37、s2:当io流程的目标函数被劫持,进入自定义函数后,如果确定该io request需要模拟延时,则先判断对应的时间片是否已经用完;

38、s3:如果对应的时间片已经用完,则以当前时间作为新的时间片起始时间,并且在给定的延时范围内,生成一个随机数,作为新的时间片内的延时值,然后将新的时间片起始时间和延时值,保存到步骤一中提到的链表节点中;

39、s4:以新生成的延时值,作为预期延时,进入延时模拟逻辑;

40、s5:如果对应的时间片没有用完,则继续以当前时间片内的延时值,作为预期延时,进入延时模拟逻辑;。

41、本发明的有益效果:

42、1.本发明没有任何影响程序运行的函数调用(比如sleep),每次目标函数都是及时返回的,对程序的运行没有任何影响,因此即使模拟长达数十秒的延时,也不会对系统造成任何异常影响,安全性更高;

43、2、本发明由于重试机制是硬盘驱动层的一个基本机制,因此本方案适用于多种硬盘类型(scsi协议的ssd/hdd、内核驱动的nvme ssd、spdk驱动的nvme ssd),普适性更广;

44、3、本发明采用基于时间片的方法实现随机变化的延时,具有优点:时间片大小用户可控,时间片越小,延时的随机性越高,用户可以根据测试需求调整时间片的大小,实现不同随机性的延时模拟,从而模拟出更多的慢盘效果;

45、4、在更接近硬盘的驱动层进行延时模拟,具有优点:效果更真实,且扩展性好,方面未来增加各种硬盘错误码模拟;

46、5、本发明在采用链表存储延时模拟参数,具有优点:支持任意个数的硬盘,每个硬盘支持任意多个lba范围的延时模拟,以及方便扩展支持任意个数的其他类型故障模拟。

本文地址:https://www.jishuxx.com/zhuanli/20240731/184185.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 YYfuon@163.com 举报,一经查实,本站将立刻删除。