技术领域
本发明属于计算机数据存储领域,更具体地,涉及一种针对持久内存并发程序的崩溃一致性故障检测方法及系统。
背景技术
和传统的内存技术DRAM不同,新型的持久内存技术具有高密度和接近于零的泄漏电流,有望能大幅提升存储系统的性能。英特尔在2019年发布了第一代持久内存产品,其单条持久内存容量可以达到512GB,每个CPU最多可以支持6条持久内存,总容量可达3TB,每GB的成本要低于大容量的DRAM。然而,在持久内存平台的异步内存刷新(Asynchronous DRAMRefresh,ADR)机制下,片上缓存的易失性(数据掉电后丢失)和持久内存中的非易失性要求其存储的数据在重启后能恢复到整体一致的状态,称之为崩溃一致性。持久内存的崩溃一致性需要数据按一定的顺序持久化到持久内存中,这要求程序按顺序正确地对数据进行持久化,因此这种编程模式很容易出错。
现有的针对持久内存的故障检测工具通常是检测串行程序中的持久化操作,没有考虑并发程序中多线程并发执行下众多可能的访存时序,因此会错过隐藏在特定访存时序中的一致性故障。目前的针对DRAM并发程序的故障检测工具没有考虑数据的持久化状态,因此不支持持久内存下的崩溃一致性故障检测。
发明内容
针对现有技术的以上缺陷或改进需求,本发明提供一种针对持久内存并发程序的崩溃一致性故障检测方法,其目的在于能够支持持久内存并发程序,搜索并发执行下访存时序,高效并准确地检测持久内存并发程序中的一致性故障。
为了实现上述目的,第一方面,本发明提出了一种针对持久内存并发程序的崩溃一致性故障检测方法,包括以下步骤:
S1、通过编译器对待测持久内存并发程序中的访存指令以及持久内存相关接口进行插桩,得到可执行程序;其中,插桩代码用于崩溃一致性故障检测;
S2、按照待测持久内存并发程序的输入规则,生成多个输入参数作为可执行程序的输入,构成输入参数集;
S3、分别获取输入参数集中输入参数下,可执行程序中各访存指令所访问的持久内存地址所对应的访存模式、以及通过插桩代码控制可执行程序产生先写后读的访存时序后可执行程序中各访存指令所访问的持久内存地址所对应的访存模式;并在上述过程中,通过插桩代码判断所得各访存模式中是否存在基于未持久化的数据写持久内存的模式,若存在,则判定为一致性故障;
其中,持久内存地址所对应的访存模式的形式为
进一步优选地,上述步骤S2包括以下步骤:
S21、按照待测持久内存并发程序的输入规则,随机生成输入参数,记为seed;
S22、将seed输入到可执行程序中,开始运行可执行程序,并通过插桩代码记录运行过程中执行的代码分支;
S23、判断待测持久内存并发程序中的所有代码分支是否均已执行,若是,则操作结束;否则,转至步骤S24;
S24、若在当前输入的seed下执行了新的代码分支,则将当前seed保存到输入参数集中,并转至步骤S22;否则,通过修改seed中的参数值、增加seed中的参数、删除seed中的参数以及调整seed中的参数顺序中的任意一种方法来更新seed,并转至步骤S22中。
进一步优选地,通过修改seed中的参数值来更新seed的方法包括:将seed中不同操作的参数值改为相同的值,以增加应用中访问相同数据的访存模式。
进一步优选地,当更新seed后仍然没有出现新的代码分支,则向seed中增加大量的插入数据的操作,其中插入操作的参数值不同,以触发应用的扩充容量机制并执行相关的代码分支。
进一步优选地,上述步骤S3包括:对输入参数集中的各输入参数,分别执行以下步骤:
S31、在输入参数集中的输入参数input下,运行可执行程序,得到当前运行环境下可执行程序中各访存指令所访问的持久内存地址所对应的访存模式,并通过插桩代码判断各访存模式中是否存在基于未持久化的数据写持久内存的模式,若存在,则判定为一致性故障,并保存可执行程序中出现基于未持久化的数据写持久内存的模式时的函数调用栈以及对应的持久内存映射文件;
S32、选择上述可执行程序中各访存指令所访问的持久内存地址中访问次数大于预设访问次数的持久内存地址,得到所选持久内存地址集;
S33、对所选持久内存地址集中的所选持久内存地址,分别执行以下操作:
对所选持久内存地址所对应的各读写指令,通过插桩代码分别在所选持久内存地址所对应的各读指令前加延迟直到对应的写指令完成或延迟时间达到预设时长,以实现先写后读的访存时序;在上述输入参数input下,重新运行可执行程序,得到当前运行环境下可执行程序中各访存指令所访问的持久内存地址所对应的访存模式,并通过插桩代码判断各访存模式中是否存在基于未持久化的数据写持久内存的模式,若存在,则判定为一致性故障,并保存可执行程序中出现基于未持久化的数据写持久内存的模式时的函数调用栈以及对应的持久内存映射文件。
进一步优选地,在读指令前加延迟时:
当可执行程序中的所有线程都卡在读指令时,随机选择一个线程跳过当前以及后续的读指令的延迟;
当可执行程序中的部分线程卡在读指令,且等待时间超过预设的等待阈值时,禁用当前读指令的延迟,并且在后续的运行过程中跳过该读指令的延迟。
进一步优选地,通过共享内存中的哈希表和位图记录运行时的持久内存地址所对应的访存模式。
进一步优选地,上述针对持久内存并发程序的崩溃一致性故障检测方法还包括在步骤S3之后执行的步骤S4;
步骤S4包括:对于步骤S3检测到的每一个一致性故障,分别执行如下操作:
重启可执行程序,加载出现一致性故障时所对应的持久内存映射文件,通过插桩代码检测可执行程序所产生的数据是否会覆盖之前出现一致性故障时基于未持久化的数据写持久内存的模式下所产生的不一致的数据,若能覆盖,则判定该一致性故障为误报;否则,确认该一致性故障会导致程序故障,并生成相应的故障检测报告。
第二方面,本发明提供一种针对持久内存并发程序的崩溃一致性故障检测系统,包括:
插桩模块,用于通过编译器对待测持久内存并发程序中的访存指令以及持久内存相关接口进行插桩,得到可执行程序;插桩代码用于崩溃一致性故障检测;
输入参数生成模块,用于按照待测持久内存并发程序的输入规则,生成多个输入参数作为可执行程序的输入,构成输入参数集;
故障检测模块,用于分别获取输入参数集中输入参数下,可执行程序中各访存指令所访问的持久内存地址所对应的访存模式、以及通过插桩代码控制可执行程序产生先写后读的访存时序后可执行程序中各访存指令所访问的持久内存地址所对应的访存模式;并在上述过程中,通过插桩代码判断所得各访存模式中是否存在基于未持久化的数据写持久内存的模式,若存在,则判定为一致性故障;
其中,持久内存地址所对应的访存模式的形式为
第三方面,本发明还提供了一种机器可读存储介质,所述机器可读存储介质存储有机器可执行指令,所述机器可执行指令在被处理器调用和执行时,所述机器可执行指令促使所述处理器实现本发明第一方面所提供的针对持久内存并发程序的崩溃一致性故障检测方法。
总体而言,通过本发明所构思的以上技术方案,能够取得以下有益效果:
1、本发明提供了一种针对持久内存并发程序的崩溃一致性故障检测方法,通过检测可执行程序中各访存指令所访问的持久内存地址所对应的访存模式、以及通过插桩代码控制可执行程序产生先写后读的访存时序后可执行程序中各访存指令所访问的持久内存地址所对应的访存模式中是否存在基于未持久化的数据写持久内存的模式,来对持久内存并发程序的崩溃一致性故障进行检测,能够支持持久内存并发程序,在并发执行的不确定时序中,通过控制时序优选考察先写后读的访存模式,触发读未持久化的数据操作,并精准检测并发程序运行过程中未持久化的数据和与该未持久化的数据有数据依赖的持久化的数据之间的不一致问题,从而高效并准确地检测持久内存并发程序中的一致性故障。
2、本发明所提供的崩溃一致性故障检测方法,通过编译器对待测持久内存并发程序中的访存指令以及持久内存相关接口进行插桩,得到可执行程序;并按照待测持久内存并发程序的输入规则,生成多个输入参数作为可执行程序的输入;只需要修改少量的代码并提供程序的输入规则,即可自动进行崩溃一致性的故障检测,操作简单。
3、本发明所提供的崩溃一致性故障检测方法,按照待测持久内存并发程序的输入规则,生成的输入参数集能够覆盖待测持久内存并发程序中的所有代码分支执行的场景,测试场景全面,故障检测的覆盖率较高。
4、本发明所提供的崩溃一致性故障检测方法,采用了线程调度技术以及带反馈机制的一致性检测技术,检测方法可以高效地搜索不同并发情况下的崩溃一致性故障,大大减少了故障检测时间。
5、本发明所提供的崩溃一致性故障检测方法,在检测到一致性故障后,对每一个一致性故障进行逐一验证,排除重启阶段可以自动恢复的一致性故障,有效地降低了故障检测的误报率。
附图说明
图1为本发明实施例1提供的针对持久内存并发程序的崩溃一致性故障检测方法流程图;
图2为本发明实施例1提供的检测基于未持久化数据的写操作流程图;
图3为本发明实施例1提供的控制并发持久内存访存时序流程图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
实施例1、
一种针对持久内存并发程序的崩溃一致性故障检测方法,如图1所示,包括以下步骤:
S1、通过编译器对待测持久内存并发程序中的访存指令以及持久内存相关接口进行插桩,得到可执行程序;其中,插桩代码用于崩溃一致性故障检测;
S2、按照待测持久内存并发程序的输入规则,生成多个输入参数作为可执行程序的输入,构成输入参数集;
具体地,上述步骤S2包括以下步骤:
S21、按照待测持久内存并发程序的输入规则,随机生成输入参数,记为seed;
S22、将seed输入到可执行程序中,开始运行可执行程序,并通过插桩代码记录运行过程中执行的代码分支;
S23、判断待测持久内存并发程序中的所有代码分支是否均已执行,若是,则操作结束;否则,转至步骤S24;
S24、若在当前输入的seed下执行了新的代码分支,则将当前seed保存到输入参数集中,并转至步骤S22;否则,通过修改seed中的参数值、增加seed中的参数、删除seed中的参数以及调整seed中的参数顺序中的任意一种方法来更新seed,并转至步骤S22中。
优选地,通过修改seed中的参数值来更新seed的方法包括:将seed中不同操作的参数值改为相同的值,以增加应用中访问相同数据的访存模式。
需要说明的是,当更新seed后仍然没有出现新的代码分支,则向seed中增加大量的插入数据的操作,其中插入操作的参数值不同,以触发应用的扩充容量机制并执行相关的代码分支。
S3、分别获取输入参数集中输入参数下,可执行程序中各访存指令所访问的持久内存地址所对应的访存模式、以及通过插桩代码控制可执行程序产生先写后读的访存时序后可执行程序中各访存指令所访问的持久内存地址所对应的访存模式;并在上述过程中,通过插桩代码判断所得各访存模式中是否存在基于未持久化的数据写持久内存的模式,若存在,则判定为一致性故障;
其中,持久内存地址所对应的访存模式的形式为
由于Ix和Iy是针对同一持久内存地址的连续的两条指令,写指令Ix写下的未持久化数据m,状态Px是未持久化,则读指令Iy就能读到m,m的状态Py还是未持久化,那么基于Iy读到的未持久化数据m后,写下与m有数据依赖的任意数据到持久内存的操作,就可以判定为一致性故障。具体地,如图2所示,在运行时检测读未持久化数据的指令,然后进一步检测基于未持久化数据写持久内存的指令,如果检测到基于未持久化数据写持久内存的指令,则判定为一致性故障,并保存可执行程序中出现基于未持久化的数据写持久内存的模式时的函数调用栈以及对应的持久内存映射文件。
具体地,步骤S3包括:对输入参数集中的各输入参数,分别执行以下步骤:
S31、在输入参数集中的输入参数input下,运行可执行程序,得到当前运行环境下可执行程序中各访存指令所访问的持久内存地址所对应的访存模式,并通过插桩代码判断各访存模式中是否存在基于未持久化的数据写持久内存的模式,若存在,则判定为一致性故障,并保存可执行程序中出现基于未持久化的数据写持久内存的模式时的函数调用栈以及对应的持久内存映射文件;
具体地,每得到一个持久内存地址所对应的访存模式,即通过插桩代码判断该访存模式是否为基于未持久化的数据写持久内存的模式,若是,则保存当前函数调用栈以及对应的持久内存映射文件。
S32、选择上述可执行程序中各访存指令所访问的持久内存地址中访问次数大于预设访问次数的持久内存地址,得到所选持久内存地址集;
本实施例中,分别统计运行可执行程序时各持久内存地址的访问次数,并将各持久内存地址的访问次数从大到小进行排序,选择前k个持久内存地址构成所选持久内存地址集;其中,第k个久内存地址所对应的访问次数即为上述预设访问次数;具体地,本实施例中,k取值为10。
S33、对所选持久内存地址集中的所选持久内存地址,分别执行以下操作:
对所选持久内存地址所对应的各读写指令,通过插桩代码分别在所选持久内存地址所对应的各读指令前加延迟直到对应的写指令完成或延迟时间达到预设时长t,以实现先写后读的访存时序;本实施例中,t取值为3组不同的小规模输入参数下运行待测程序所需的平均时间;在上述输入参数input下,重新运行可执行程序,得到当前运行环境下可执行程序中各访存指令所访问的持久内存地址所对应的访存模式,并通过插桩代码判断各访存模式中是否存在基于未持久化的数据写持久内存的模式,若存在,则判定为一致性故障,并保存可执行程序中出现基于未持久化的数据写持久内存的模式时的函数调用栈以及对应的持久内存映射文件。其中,通过共享内存中的哈希表和位图记录运行时的持久内存地址所对应的访存模式。
具体地,为了保证程序的高效测试,如图3所示,将读写指令按地址进行分组,每轮测试在同一组的读写指令加延迟;且在读指令前加延迟时:
选择性通过:当可执行程序中的所有线程都卡在读指令时,随机选择一个线程跳过当前以及后续的读指令的延迟;
定时器:当可执行程序中的部分线程卡在读指令,且等待时间超过上述预设时长t时,禁用当前读指令的延迟,并且在后续的运行过程中跳过该读指令的延迟。
优选地,上述针对持久内存并发程序的崩溃一致性故障检测方法还包括在步骤S3之后执行的步骤S4;
步骤S4包括:对于步骤S3检测到的每一个一致性故障,分别执行如下操作:
重启可执行程序,加载出现一致性故障时所对应的持久内存映射文件,通过插桩代码检测可执行程序所产生的数据是否会覆盖之前出现一致性故障时基于未持久化的数据写持久内存的模式下所产生的不一致的数据,若能覆盖,则判定该一致性故障为误报;否则,确认该一致性故障会导致程序故障,并生成相应的故障检测报告。
综上,本发明通过编译器对并发程序中的访存指令以及持久内存相关接口进行插桩,插桩后的程序用于故障检测;输入生成器按照并发程序的输入规则,自动生成符合可执行程序语法规则的输入;用生成的输入运行可执行程序,通过线程调度模块控制并发程序的时序,优先测试持久内存同一地址下先写后读的访存时序;如果检测到基于未持久化的数据写持久内存的模式,就判定为一致性故障,并保存当前函数调用栈以及持久内存映射文件,同时把检测过的访存时序反馈给线程调度模块;最后在检测到故障之后进行验证,重启测试程序,排除重启阶段自动恢复的一致性故障,降低故障检测的误报率。本发明针对持久内存并发程序,通过并发时序控制、持久内存访存模式检测以及故障验证,能高效并准确地检测到隐藏在并发程序中的一致性故障。
需要说明的是,本发明的具体的应用场景包括但不限于持久性并发索引、持久性内存数据库、持久内存文件系统等应用场景。
实施例2、
一种针对持久内存并发程序的崩溃一致性故障检测系统,包括:
插桩模块,用于通过编译器对待测持久内存并发程序中的访存指令以及持久内存相关接口进行插桩,得到可执行程序;插桩代码用于崩溃一致性故障检测;
输入参数生成模块,用于按照待测持久内存并发程序的输入规则,生成多个输入参数作为可执行程序的输入,构成输入参数集;
故障检测模块,用于分别获取输入参数集中输入参数下,可执行程序中各访存指令所访问的持久内存地址所对应的访存模式、以及通过插桩代码控制可执行程序产生先写后读的访存时序后可执行程序中各访存指令所访问的持久内存地址所对应的访存模式;并在上述过程中,通过插桩代码判断所得各访存模式中是否存在基于未持久化的数据写持久内存的模式,若存在,则判定为一致性故障;
其中,持久内存地址所对应的访存模式的形式为
相关技术特征同实施例1,这里不做赘述。
实施例3、
一种机器可读存储介质,所述机器可读存储介质存储有机器可执行指令,所述机器可执行指令在被处理器调用和执行时,所述机器可执行指令促使所述处理器实现本发明实施例1所提供的针对持久内存并发程序的崩溃一致性故障检测方法。
相关技术特征同实施例1,这里不做赘述。
本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
机译: 在持久的内存中实现崩溃一致性
机译: 用于生成崩溃一致持久性一致性点图像集的系统和方法
机译: 用于生成崩溃一致持久性一致性点图像集的系统和方法