[发明专利]一种面向I/O并发度的数据库性能问题检测方法有效
| 申请号: | 202310557706.7 | 申请日: | 2023-05-16 |
| 公开(公告)号: | CN116561002B | 公开(公告)日: | 2023-10-10 |
| 发明(设计)人: | 李姗姗;陈振邦;何浩辰;陈立前;董威;王戟;贾周阳;马俊;彭沐春;黄响兵;李小玲 | 申请(专利权)人: | 中国人民解放军国防科技大学 |
| 主分类号: | G06F11/36 | 分类号: | G06F11/36 |
| 代理公司: | 湖南企企卫知识产权代理有限公司 43257 | 代理人: | 任合明 |
| 地址: | 410073 湖*** | 国省代码: | 湖南;43 |
| 权利要求书: | 查看更多 | 说明书: | 查看更多 |
| 摘要: | |||
| 搜索关键词: | 一种 面向 并发 数据库 性能 问题 检测 方法 | ||
1.一种面向I/O并发度的数据库性能问题检测方法,其特征在于包括以下步骤:
第一步,构建性能不适配检测系统,性能不适配检测系统由I/O系统调用识别模块、I/O配置项识别模块、测试样例生成模块、不适配判定模块组成;
I/O系统调用识别模块与I/O配置识别模块相连,接收用户筛选出的与I/O相关的系统调用集合S,将S发送给I/O配置项识别模块;
I/O配置项识别模块与I/O系统调用识别模块、测试样例生成模块相连,从I/O系统调用识别模块接收与I/O相关的系统调用集合S,并接收用户输入的待检测数据库的源代码,采用静态污点分析方法,从待检测数据库的所有配置项中筛选出与I/O相关的配置项集合K,并将K发送给测试样例生成模块;
测试样例生成模块与I/O配置项识别模块、不适配判定模块相连,从I/O配置项识别模块接收与I/O相关的配置项集合K,采用Spex算法生成包含负载命令、配置项组合及硬件设备的测试样例集合T,并将T发送给不适配判定模块;
不适配判定模块与测试样例生成模块相连,从测试样例生成模块接收测试样例集合T,对待测数据库执行T,并监测运行时数据,判定是否存在性能不匹配现象;
第二步,I/O系统调用识别模块接收用户按功能分类依次输入的操作系统I/O相关系统调用集合,对全部I/O相关系统调用集合进行合并和删除重复元素,得到全部I/O相关系统调用集合S,将S发送给I/O配置项识别模块,方法是:
2.1通过阅读Linux系统官方手册,人工检查Linux内核的MM个系统调用,并对其进行交叉检验,从中筛选出影响I/O并发度的系统调用,根据功能分为读调用集S1、写调用集S2、同步调用集S3,S1={read,pread64,readv,preadv,preadv2,iogetevents,iosubmmit,madvise,open,mmap},read为从文件描述符中读取数据,pread64为指定偏移量地从文件描述符中读取数据,readv为读取多个缓冲区的数据,preadv为指定偏移量地读取多个缓冲区的数据,preadv2为支持更多自定义选项且指定偏移量地读取多个缓冲区的数据,iogetevents为等待异步I/O操作完成的通知,iosubmit为提交一个或多个异步I/0请求,madvise为修改内存映射的行为,open为打开并返回一个文件描述符,mmap为将文件或设备映射到进程的地址空间;S2={write,pwrite64,writev,pwritev,pwritev2,iogetevents,iosubmit,madvise,open,mmap},write为通过文件描述符向文件写入数据,pwrite64为指定偏移量地向文件写入数据,writev为将多个缓冲区的数据写入文件,pwritev为指定偏移量地将多个缓冲区的数据写入文件,pwritev2为支持更多自定义选项且指定偏移量地向文件写入数据;fsync为将文件系统的更新数据写入磁盘,fdatasync为只同步数据而不同步元数据地将文件系统的更新数据写入磁盘,syncfs同步整个文件系统,为同步文件的指定范围,fcntl为对文件描述符执行各种操作;
2.2 I/O系统调用识别模块将S1、S2、S3合并并删除重复元素,得到全部I/O相关系统调用集合S,将S发送给I/O配置项识别模块S中共20个元素;
第三步,I/O配置项识别模块从I/O系统调用识别模块接收与I/O相关的系统调用集合S,并接收用户输入的待检测数据库的源代码,采用静态污点分析方法,检测待检测软件中与I/O相关系统调用有数据流和或控制流连接的I/O相关配置项,得到全部相关配置项集合K,并将K发送给测试样例生成模块;方法是:
3.1使用ConfMapper算法在待检测数据库软件的源码中定位配置项对应的程序变量即配置变量,得到由配置项的名称和相关值组成的二元组集合KNV;方法是:
3.1.1 I/O配置项识别模块将待检测数据库软件的配置文件f输入到Augeast库,Augeast库对f进行解析,得到解析后的配置树表示ConfTree,ConfTree的每个节点包含配置文件中的一个配置信息,配置信息包括配置项的名称、配置项的相关值即取值范围、配置数据的类型、在文件中的位置、相应位置的值;
3.1.2 I/O配置项识别模块对配置树表示ConfTree进行配置项的名称和相关值提取,得到N个配置项的名称和相关值组成的二元组集合KNV,KNV={{nme1,val1},...,{nmen,valn},...,{nmeN,valN}},{nmen,valn}为KNV中的第n个二元组,nmen为第n个配置项的名称,valn为第n个配置项的相关值,N为从ConfTree提取出的配置项的个数,N为正整数;
3.2从待检测数据库软件的所有源代码文件中,筛选出功能为将软件配置项映射到源代码相关程序变量的源代码文件,方法是:
3.2.1根据配置文件的命名规律,I/O配置项识别模块从待检测数据库软件的所有源代码文件中,初步筛选出包含与配置项相关的程序变量的源代码文件集合F,F={f1,...,fm,...,fM},fm为F中的第m个源代码文件,M为源代码文件个数,M为正整数;
3.2.2分别统计f1,...,fm,...,fM中,KNV中N个配置项名称的出现次数,依照出现次数降序排列,筛选出真正包含与配置项相关的程序变量的源代码文件集合F′,表示对向上取整;
3.3 I/O配置项识别模块为KNV中的N个配置项名称生成对应的关键词集合KW,方法是:
3.3.1 I/O配置项识别模块从键盘接收用户输入的配置项名称单词集合Dict={word1,...,wordw,...,wordW},wordw为第w个配置项名称,W为用户输入的配置项名称个数,W为正整数;
3.3.2令n=1;
3.3.3使用下划线“_”,点“.”和连字符“-”作为分隔符对KNV中的第n个配置项名称nmen进行处理,得到处理后的第n个配置项名称nme′n,并根据Dict中收录的单词对nme′n进行词频统计,得到nme′n的词汇表Vocn={{word1,freq1n},...,{wordw,freqwn},...,{wordW,freqWn}},{wordw,freqw}为Vocn中的第w个二元组,wordw为第w个单词,freqwn为wordw在nme′n中的词频;
3.3.4I/O配置项识别模块利用TF-IDF算法对nme′n进行关键词划分,得到nmen对应的关键词集合Rn为KWn中关键词的个数,为KWn中第rn个关键词;
3.3.5令n=n+1,若n>N,转3.3.6,否则转3.3.3;
3.3.6循环结束,得到KNV中N个配置项名称对应的关键词集合KW,KW={KW1,...,KWn,...,KWN};
3.4I/O配置项识别模块对F′进行词法分析得到Tk个token,并利用余弦相似度算法对Tk个token进行筛选,得到包含N个配置项名称对应的源代码程序变量的程序变量集合PV_init,方法是:
3.4.1I/O配置项识别模块对源代码文件集合F′中的所有源代码文件进行词法分析,将源代码文件划分成单个标记即token,共得到Tk个token,Tk为正整数;
3.4.2I/O配置项识别模块利用余弦相似度算法,对Tk个token进行筛选,得到包含N个配置项名称对应的源代码程序变量的程序变量集合PV_init,PV_initn为配置项nmen对应的源代码程序变量;
3.5 I/O配置项识别模块使用Clang前端进行源代码分析,对程序变量集合PV_init中的N个程序变量再次进行筛选,得到配置变量集合PV_fil,PV_fil中的配置变量为与配置真正相关的程序变量,PV_fil={PV_fil1,...,PV_filn′,...,PV_filN′},共N’个元素,N’为正整数;
3.6I/O配置项识别模块对配置变量集合PV_fil中的N’个程序变量逐个进行污点分析,检测是否与I/O系统调用集合S中的20个系统调用有数据流连接即满足Use-Define链或依赖关系,并得到筛选后配置变量集合PV_fin,方法如下:
3.6.1令n’=1;
3.6.2令j=1;
3.6.3判断PV_filn,与Sj是否满足Use-Define链;若满足,则转3.6.7,否则转3.6.4;
3.6.4判断PV_filn′与Sj是否满足依赖关系;若满足,则转3.6.7;否则令j=j+1,转3.6.5;
3.6.5若j>20,转3.6.6,否则转3.6.3;
3.6.6若配置变量PV_filn′与所有I/O系统调用都没有数据流连接,转3.6.7;否则将PV_filn,从集合PV_fil中删除,并将PV_filn,加入集合PV_fin,转3.6.7;
3.6.7令n’=n’+1,若n’>N’,转3.6.8,否则转3.6.2;
3.6.8循环结束,得到配置变量集合PV_fil={PV_fil1,...,PV_fill,...,PV_filL},L为剩下的元素个数,L<N’,并得到筛选后配置变量集合PV_fin={PV_fin1,...,PV_finq,...,PV_finQ},共Q个元素,这些元素与至少一个I/O系统调用有数据流连接,转3.7;
3.7 I/O配置项识别模块对PV_fil中的L个配置变量逐个进行污点分析,检测是否与I/O系统调用S中的元素有控制流连接,并将与I/O系统调用有控制流连接的配置变量继续补充进筛选后配置变量集合PV_fin,PV_fin={PV_fin1,...,PV_fino,...,PV_finO},共O个元素,O≥Q;
3.8 I/O配置项识别模块为配置变量集合PV_fin中的O个元素查询对应的配置项名称,构成配置项名称集合Knobs,将Knobs发送给测试样例生成模块,方法是:
3.8.1令o=1;
3.8.2对于配置变量PV_fino,根据程序变量集合PV_init查询PV_fino对应的配置项名称knobo,将knobo放到配置项名称集合Knobs中,方法是:
3.8.2.1令n=1;
3.8.2.2若PV_fino=PV_initn,则将KNV中第n个配置项名称nmen记为knobo,并将knobo加入配置项名称集合Knobs,转3.8.3;否则转3.8.2.3;
3.8.2.3令n=n+1,转3.8.2.2;
3.8.3令o=o+1,若oO,转3.8.4,否则转3.8.2;
3.8.4循环结束,得到配置项名称集合Knobs={knob1,...,knobo,...,knobO},knobo为配置变量PV_fino对应的配置项名称,并将Knobs发送给测试样例生成模块;
第四步,测试样例生成模块从I/O配置项识别模块接收Knobs,为待检测数据库软件生成测试样例集合T,将T发送给运行时数据采集模块,方法是:
4.1测试样例生成模块使用Spex算法,对Knobs中的配置项的语法类型和取值范围进行提取;Spex最终提取出的语法类型分为四类:数值类型、布尔类型、枚举类型、字符串类型;
4.2测试样例生成模块为Knobs生成待测值集合V,方法是:
4.2.1初始化变量o=1;
4.2.2若knobo对应的期望标签为空,则令转4.2.7;
4.2.3若knobo为布尔类型,则令Vo={0,1},转4.2.7;
4.2.4若knobo为枚举类型,则令其中为Spex算法提取到的knobo的全部可能取值,转4.2.7;
4.2.5若knobo为字符串类型,则令转4.2.7;
4.2.6若knobo为数值类型,则对knobo的值进行抽样,方法为:记Spex算法提取到的knobo的最小取值和最大取值记为Min、Max,令Vo={Min,10·Min,102·Min,Max,10-1·Max,10-2·Max},转4.2.7;
4.2.7若o=O,转4.2.8;否则,令o=o+1,转4.2.2;
4.2.8循环结束,得到待测值集合V,V={V1,...,Vo,...,VO},其中为配置项knobo的一个取值,Ko为测试样例生成模块为knobo生成的值的个数;
4.3对V1,...,Vo,...,VO取笛卡尔积,得到笛卡尔积VCartesian=V1×V2×...×VO;
4.4测试样例生成模块基于性能测试工具生成测试命令;方法为:采用pair-wise方法对性能测试工具的参数进行抽样,然后将参数输入性能测试工具,性能测试工具输出测试命令,得到测试命令集合B={b1,b2,b3,...,by,...,bY},1≤y≤Y,Y为B中测试命令的个数;
4.5测试样例生成模块接收硬件设备集合D,D由传统硬盘HDD和固态硬盘SSD两部分构成,其中传统硬盘HDD集合为D1={d11,d12},d11=AMD锐龙95700XT,d12=64GBDDR4内存,固态硬盘SSD集合为D2={d21,d22,d23,d24},d21=三星980pro,d22=西数sn850,d23=三星860evo,d24=西数blue;
4.6测试样例生成模块生成测试样例集合T,T由T1和T2两部分构成,为一个三元组,的含义是:knobo的取值为i=1或2,W为T中测试样例的个数,为knob1的第u个可能取值,为knobo的第h个可能取值,为knobO的第j个可能取值,1≤u≤K1,1≤j≤KO,1≤h≤Ko,K1、Ko、KO分别为Spex算法提取到的配置项knob1、knobo、knobO的可能取值的个数,且K1、Ko、KO均为正整数;将测试样例集合T发送给不适配判定模块;
第五步,不适配判定模块从测试样例生成模块接收测试样例集合T,执行测试样例,收集运行时信息,判断是否存在不适配现象,方法如下:
5.1不适配判定模块执行T1中的测试样例,检测一段观测时间s内运行待检测数据库软件的计算机系统I/O队列的第一利用率util1;然后执行T2中的测试样例,检测一段观测时间s内计算机系统I/O队列的第二利用率util2;I/O队列的利用率utili的计算公式为:
其中,tbeg为观测时间s的开始时刻,tend为观测时间s的结束时刻,depthi为队列深度,即第i个队列在时间点dt时的I/O请求数量;
5.2若满足1)util1大于util2,或2)在95%的时间内,两个I/O队列的深度最大均为1,则判定不适配判定模块执行测试样例时存在低效的队列应用;
5.3若更改任何配置项均无法使待检测数据库摆脱队列利用率低下状态,则说明待检测数据库软件与NVMe SSD硬件存储设备存在I/O并发度不适配问题,即尽管待检测数据库软件支持多线程并发发送I/O请求,但却通常以同步方式发送I/O,导致待检测数据库没有充分利用NVMe SSD提供的高并发处理能力,结束。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于中国人民解放军国防科技大学,未经中国人民解放军国防科技大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/202310557706.7/1.html,转载请声明来源钻瓜专利网。





