CN116225965B - 一种面向io大小的数据库性能问题检测方法 - Google Patents

一种面向io大小的数据库性能问题检测方法 Download PDF

Info

Publication number
CN116225965B
CN116225965B CN202310375345.4A CN202310375345A CN116225965B CN 116225965 B CN116225965 B CN 116225965B CN 202310375345 A CN202310375345 A CN 202310375345A CN 116225965 B CN116225965 B CN 116225965B
Authority
CN
China
Prior art keywords
configuration item
test sample
database
test
module
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202310375345.4A
Other languages
English (en)
Other versions
CN116225965A (zh
Inventor
李姗姗
董威
贾周阳
马俊
李小玲
张元良
王腾
谢一帆
黄响兵
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
National University of Defense Technology
Original Assignee
National University of Defense Technology
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by National University of Defense Technology filed Critical National University of Defense Technology
Priority to CN202310375345.4A priority Critical patent/CN116225965B/zh
Publication of CN116225965A publication Critical patent/CN116225965A/zh
Application granted granted Critical
Publication of CN116225965B publication Critical patent/CN116225965B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3684Test management for test design, e.g. generating new test cases
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了一种面向IO大小的数据库性能问题检测方法,目的是提供一种有效检测由于IO大小不适配导致数据库性能问题的方法。技术方案为:构建由配置项提取模块,测试样例生成模块,IO相关测试样例提取模块,运行时数据采集模块,不适配问题检测模块构成的数据库性能问题检测系统;配置项提取模块根据数据库配置项列表获得配置项参数集合;测试样例生成模块根据配置项参数集合生成测试样例集合;IO相关测试样例提取模块识别IO相关的配置项,并生成新的测试样例集合;运行时数据采集模块执行测试样例并获取测试结果;不适配问题检测模块根据测试结果,检测IO大小不适配导致的数据库性能问题。采用本发明能有效检测出数据库性能问题。

Description

一种面向IO大小的数据库性能问题检测方法
技术领域
本发明涉及数据库软件中面向性能的配置缺陷检测领域,具体涉及一种面向IO大小的数据库性能问题检测方法。
背景技术
随着大数据、互联网的高速发展,大规模软件系统已经广泛应用于航天、金融、军事、民生等各个领域,成为信息化社会的基础设施,使互联网产业逐步走向“软件定义一切”的时代。然而,用户对软件功能需求不断增长、对软件服务质量要求不断升高、部署软件的外部环境多样变化,这些无不为软件系统的发展带来挑战。与此同时,软件系统不断发展,软件规模和复杂度不断增加,大规模软件使得软件业务逻辑愈发复杂,使得软件的性能愈发难以保证。目前,为适应负载环境与应用需求变化,大规模软件系统均向高可配置化方向发展,从而提升软件服务的可靠性和可用性。
在当今数据驱动的世界中,数据库软件作为大规模软件系统的代表,已经成为了企业和组织不可或缺的基础设施之一,广泛部署于缓存、元数据管理、消息传递和线上购物等商业平台。然而,随着数据量和数据复杂性的不断增加,如何提升数据库的读写速度、读写效率等性能已然成为了一个巨大的挑战。2010年7月,亚马逊公司的电商网站访问量激增,其数据库软件出现了读写性能问题,导致网站变得异常缓慢,并且一些页面无法正常加载,使得亚马逊网站长达数小时不可用,给公司带来了数十亿美金的商业损失。这个事件暴露出了数据库读写性能问题的严重性和影响力,说明数据库的良好性能对于维护数据库的健康运行和确保业务的正常运行至关重要,因此,相关从业人员一直以来为提升数据库软件读写性能不断进行了各种尝试,其中最为直接且典型的方法是更换性能更好的存储设备。
近年来,存储设备经历了革命性的发展,数据库软件的存储设备主要为固态硬盘(SSD),其中最具代表性的存储设备是SATASSD和NVMeSSD,SATA SSD采用SATA接口,通常采用AHCI协议或SATA Express协议传输数据,其性能(主要指读写速度)相对较低,通常的顺序读写速度在500MB/s左右,随机读写速度在100MB/s左右,NVMeSSD采用PCIe接口,通常采用NVMe协议传输数据,其读写性能相对较高,通常的顺序读写速度在3000MB/s左右,随机读写速度在500MB/s左右,其吞吐量最高可达6GB/s,然而,将NVMe SSD直接部署在数据库软件系统中往往无法取得理想效果。大量用户反馈,存储设备升级到NVMe SSD后,读写性能提升十分有限,有时甚至出现性能不升反降的现象。例如,在相同MySQL设置下,NVMe SSD的性能仅达到SATA SSD的一半。出现这一问题的主要原因是,数据库软件设计未能适配存储设备的IO特性。具体而言,数据库发送的IO请求大小与NVMeSSD中的块大小(Block size)存在不适配:一般地,数据库缓存以页为单位发送,IO请求的页大小(例如4KB)通常与SATA SSD物理页大小(一般为4KB)一致。然而,为提高性能,NVMe控制器(FTL)通常采用更高级别的抽象,以块(Block)为基本单元进行性能优化,且通常情况下,块大小(Block size)较大,可达64KB。此时,频繁的小页面写入(如4KB)可能与NVMe SSD中这一优化存在IO大小不适配,导致读写性能下降。
实际上,相比于上一代存储介质,NVMe SSD从硬件内部架构到外部接口(NVMe)均产生了巨大变化;这些变化不仅大大提升了性能,而且从根本上改变了存储介质的IO特性。然而,数十年来,数据库系统的开发大多是针对SATA等传统设备的IO特性设计和优化的。因此,这些“过时的”数据库优化可能不适配NVMe SSD的特性从而产生性能问题。已有工作大多针对新型硬件提出全新的数据库软件设计,例如CaoZ等人在Fast20上发表的“Carver:Finding important parameters for storagesystem tuning(Carver:查找存储系统调整的重要参数)”和Kanellis K等人在HotStorage20上发表的“Too Many Knobs to Tune?TowardsFaster Database Tuning by Pre-selecting Important Knobs(配置项太多,无法调整?通过预先选择重要配置项实现更快的数据库调整)”,与此同时,有工作从软件配置项出发,研究配置项参数更改对软件性能的影响,例如何浩辰等人在ASE2020发表的“Cp-detector:Using configuration-related performance prop-erties to exposeperformance bugs”(Cp-detector:使用与配置相关的性能特性来暴露性能缺陷),但对于检测主流数据库软件由于不适配新型硬件导致的读写性能问题,并没有很好的效果。
综合分析来看,随着数据库软件存储设备的不断发展,本身没有性能缺陷的代码可能不适配新的存储设备从而引发读写速度等性能问题。本发明通过调研发现,数据库软件为了满足用户在不同硬件环境下的定制化需求,往往在向高可配置化发展,配置项(指数据库软件中支持用户修改的参数)作为数据库软件适应硬件环境的关键接口,通常控制了大量与硬件适配相关的代码,针对传统特性设备进行优化。然而,这些代码很可能无法适配飞速发展的新型硬件设备,从而导致性能不适配问题的产生。例如当存储设备的随机读写速度提升后,数据库软件不应再使用各种复杂的机制来避免随机读写。大量证据表明,尽管企业和机构通常耗费高昂成本研制、更新硬件设备,用户仍反馈软件无法发挥出新型硬件设备的性能特性,甚至造成硬件升级后性能“不升反降”。因此,业界迫切需要理解此类不适配问题的在数据库软件中的现状并设计相应的检测方法。
综上所述,主流数据库软件和新型存储设备之间的性能不适配现象越来越普遍,如何帮助开发人员面向新型存储设备改进数据库设计,从而减少性能不适配问题的发生,提升数据库读写性能,是本领域技术人员正在探讨的热点问题。
发明内容
本发明要解决的技术问题是提供一种面向IO大小的数据库性能问题检测方法。以数据库软件配置项为抓手进行数据库性能问题检测,通过构建一个数据库性能问题检测系统,利用数据库软件的配置项触发数据库IO大小变化构建测试预言(即当配置项调整后,数据库小IO变多(小IO变多代表数据库读写效率降低)且数据库读写性能变差,则存在性能不匹配),从而暴露数据库软件性能不匹配问题的根本原因,有效通过IO大小检测数据库软件和存储设备之间的不适配问题,与此同时使用污点分析技术和内核轻量级动态监控技术来降低检测成本。
本发明包括以下步骤:
第一步,构建数据库性能问题检测系统,数据库性能问题检测系统由配置项提取模块,测试样例生成模块,IO相关测试样例提取模块,运行时数据采集模块,不适配问题检测模块组成。
配置项提取模块是一个配置分析工具,与测试样例生成模块和IO相关测试样例提取模块相连,从待检测数据库的配置项列表读取数据库的全部配置项(配置项指数据库软件的配置项参数),得到待检测数据库软件配置项参数集合C,将C发送给测试样例生成模块和IO相关测试样例提取模块。
测试样例生成模块与配置项提取模块和IO相关配置标识模块相连,从配置项提取模块接收C,根据C生成配置项的测试样例集合T,将T发送给IO相关测试样例提取模块。
IO相关测试样例提取模块与配置项提取模块、测试样例生成模块和运行时数据采集模块相连,从配置项提取模块接收C,从测试样例生成模块接收T,通过运行T中的测试样例,获取配置项参数更改对IO相关系统调用的影响,从而判断C中配置项是否和IO相关,得到IO相关的测试样例集合T′和IO相关配置项集合C′,读取待检测数据库的负载命令集合W,读取待检测数据库的硬件设备集合D,将T′、W、D三者做笛卡尔积,生成最终测试样例集合T″,将T″发送给运行时数据采集模块,将C′发送给不适配问题检测模块。
运行时数据采集模块与IO相关测试样例提取模块和不适配问题检测模块相连,从IO相关测试样例提取模块接收T″,执行T″中的测试样例并动态监测操作系统内核,获取操作系统内核中与IO相关的数据作为测试结果集合G,将G发送给不适配问题检测模块。
不适配问题检测模块与运行时数据采集模块和IO相关测试样例提取模块相连,从运行时数据采集模块接收G,从IO相关测试样例提取模块接收C′,采用IO大小不适配规则检测被检测数据库的性能问题,如果配置调整后,被检测数据库读写过程中小IO数量变多且被检测数据库读写性能变差,则存在由IO大小不适配导致的被检测数据库性能问题,将被检测数据库性能问题输出。
第二步,配置项提取模块读取待检测数据库配置项列表,从待检测数据库配置项列表得到数据库配置项参数集合C,将C发送给测试样例生成模块,方法是:
2.1配置项提取模块读取待检测数据库配置项列表,得到待检测数据库配置项参数集合C,C={c1,c2,…,ci,…,cI},ci为C中第i个配置项参数,I为C中配置项参数的总数,1≤i≤I;
2.2配置项提取模块将C发送给测试样例生成模块。
第三步,测试样例生成模块利用从配置项提取模块接收的C,生成测试样例集合T,将T发送给IO相关测试样例提取模块,方法是:
3.1测试样例生成模块使用TianyinXu等人在SOSP 2013发表的文章“Do NotBlame Users for Misconfigurations(不要责备用户的配置错误)”的Spex算法,提取C中的配置项参数的语法类型和取值范围,提取出的语法类型分为四类:数值类型(int)、布尔类型(bool)、枚举类型(enum)、字符串类型(string);
3.2测试样例生成模块为C生成配置项参数待测值集合V,V={V1,V2,…,Vi,…,VI},其中 为ci的一个取值,Ki为测试样例生成模块为ci生成的值的个数。方法为:
3.2.1初始化变量i=1;
3.2.2若ci为布尔类型(bool),则令Vi={0,1},转3.2.6;
3.2.3若ci为枚举类型(enum),则令其中/>为Spex算法提取到的ci的全部可能取值,转3.2.6;
3.2.4若ci为字符串类型(string),则令(根据何浩辰在ESEC/FSE 2019发表的“Tuning backfired?not(always)your fault:understanding and detectingconfiguration-related performance bugs(配置调节适得其反?不总是你的错!理解并检测配置相关的性能缺陷)”的结论,极少数字符串类型的配置项会导致性能缺陷),转3.2.6;
3.2.5若ci为数值类型(int),则对ci的值进行抽样,方法为:记Spex算法提取到的ci的最小取值为Min,最大取值为Max,令Vi={Min,10·Min,102·Min,Max,10-1·Max,10-2·Max},转3.2.6;
3.2.6若i=I,转3.3;否则,令i=i+1,转3.2.2;
3.3对V1,V2,…,Vi,…,VI取笛卡尔积,得到笛卡尔积VCartesian,VCartesian=V1×V2×…×VI
3.4软件的性能测试集一般以性能测试工具的形式提供,测试样例生成模块采用性能测试工具(如sysbench、apache-benchmark)生成测试命令。方法为:采用经典的pair-wise方法(Pair-wise Testing is a combinatorial method of software testingthat,for each pair of input parameters to a system,tests all possiblediscretecombinations of those parameters.“pair-wise方法是一种软件测试领域的组合方法,该方法针对系统的每对输入参数,测试这些参数的所有可能的离散组合”--《PragmaticSoftware Testing:Becoming an Effective and Efficient Test Professional》“实用软件测试:成为一个高效的测试专业”)对性能测试工具的参数(如并发度、负载类型、数据表大小、数据表数量、读操作比例、写操作比例)进行配置,性能测试工具输出测试命令,得到测试命令集合B={b1,b2,b3,…,by,…,bY},1≤y≤Y,Y为B中测试命令的个数,by为B中第y个测试命令;
3.5测试样例生成模块生成测试样例集合T,T=B×VCartesian={t1,t2,t3,…,ts,…,tS},1≤s≤S,ts为一个二元组,(其中,/>的含义是:ci的取值为Vi中的第h个值/>),S为T中测试样例的个数,/>为c1的第u(1≤u≤K1)个可能取值,/>为ci的第h(1≤h≤Ki)个可能取值,/>为cI(1≤j≤KI)的第j个可能取值,K1、Ki、KI分别为Spex算法提取到的配置项c1、ci、cI的可能取值的个数,且K1、Ki、KI均为正整数;将T发送给IO相关测试样例提取模块;
第四步,IO相关测试样例提取模块根据C和T以及待检测数据库软件源代码F识别IO相关配置项,生成IO相关配置项集合C′和IO相关测试样例集合T′,将C′发送给不适配问题检测模块,结合待检测数据库负载命令集合W和硬件设备集合D生成最终的测试样例集合T″,将T″发送给运行时数据采集模块,方法为:
4.1确定与IO相关的配置项的关键特征,关键特征为:与IO相关的配置项的值修改时,会影响IO相关的系统调用的调用次数。故可通过检测IO相关的系统调用被数据库配置项的影响情况,识别出IO相关的配置项,可分为两步,第一步:识别IO相关的系统调用;第二步:识别IO相关的配置项;
4.2识别IO相关的系统调用,方法为:
4.2.1许多系统调用都与IO相关(例如,写,断开链接),通过阅读Linux内核(优选5.4.0及以上版本)的官方手册,调查每一个系统调用(共335个),得到影响IO的系统调用信息;
4.2.2对4.2.1得到的系统调用进行交叉检查,过滤掉可能影响数据库软件IO大小的系统调用,剩余的作为IO相关的系统调用,这些系统调用可以进一步分为四个系列:1)读系列(例如,pread),2)写系列(例如,pwrite),3)同步系列(例如,fsync),以及4)控制线程/进程数量的系统调用(DBMS(数据据库管理系统)可以使用单独的线程/进程(例如clone)来发出IO请求);
4.3识别IO相关的配置项,得到IO相关的配置项参数集合C′,C′={c′1,c′2,...,c′m,...,c′M},M为C′中IO相关配置项的个数,1≤m≤M≤I,其中c′m是第m个IO相关配置项,方法为:
4.3.1定位配置对应的程序变量,读入被检测数据库软件的配置项列表,配置项列表存储有<配置项参数,配置项变量>二元对列表,所述配置项变量是配置项在源代码中定义的变量;从被检测数据库软件的配置项列表得到被检测数据库软件的源代码F中所有的配置项参数和对应配置项变量二元对集合CS,CS={<c1,cv1>,<c2,cv2>,...,<ci,cvi>,...,<cI,cvI>},其中ci为CS中第i个配置项参数,cvi为ci在F中对应的配置项变量,ci与cvi二元对关系可通过Shulin Zhou等人在QRS2016发表的“ConfMapper:Automated VariableFinding for Configuration Items in Source Code(ConfMapper:从软件源码中自动寻找配置参数对应配置变量)”中所述的从软件源码中自动寻找配置参数对应配置变量方法建立,I为F中配置参数总数,1≤i≤I;
4.3.2确定CS中的配置项变量和IO相关的系统调用是否有连接,方法为:
4.3.2.1使用LLVM编译器框架的Clang前端(10.0.0版本及以上)解析软件源码,生成软件源码对应的抽象语法树(Abstract Syntax Tree)ASTroot,ASTroot中的每个节点都表示F中的一种结构,比如整个源码整体(TranslationUnitDecl)、函数声明(FunctionDecl)、If分支语句(IfStmt)、赋值语句(AssignStmt)、函数调用(CallExpr)、常量字符串(StringLiteral)、二元计算(BinaryOperator)、单一变量(DeclRefExpr)、结构体变量(MemberExpr)等,且不同结构之间同样以树的结构表示相应从属关系,例如对于一个函数声明中的If分支语句,对应的If分支语句节点就位于以函数声明节点为根节点的子树中;
4.3.2.2进行数据流连接,使用Marek Chalupa等人在ATVA 2020发表的文章“DG:analysis and slicing of LLVM bitcode(一种基于LLVM的程序分析和切片方法)”的DG(constructing dependence graphs for program analysis)算法,对CS中的配置项变量进行污点分析,得到IO相关的配置项参数集合C′,此时C′包括数据流连接找到的与IO相关系统调用有关的配置项参数;方法为:
4.3.2.2.1初始化变量i=1;
4.3.2.2.2从CS中提取<ci,cvi>,基于LLVM(Low Level Virtual Machine)的iterating-over-def-use-use-def-chains(迭代def-use和use-def链)对cvi进行污点分析,确定ci的污点传播变量,得到ci的影响范围集合P={p1,p2,…,pz,…,pz},其中pz为一个二元组,pz=[vz,lz],vz为ci的第z个污点传播变量,lz为vz在F中的位置,Z为影响范围集合P中元素的个数,1≤z≤Z,方法为:
4.3.2.2.2.1根据代码的语句类型,获得不同语句类型的污点传播变量,代码语句类型为赋值语句且赋值符号右边为配置项变量或污点传播变量时,赋值符号左边的变量为污点传播变量,例如“vara=cvi;varb=vara”(其中vara和varb为cvi的污点传播变量),代码语句类型为分支语句且判断条件包括配置项变量或污点传播变量时,每条分支上值发生变化的变量为污点传播变量,例如“if(cvi)varc+=1;else varc-=1”(其中varc为cvi的污点传播变量);
4.3.2.2.2.2初始化变量r=1;
4.3.2.2.2.3使用Clang编译源代码,生成中间代码集合IR,IR={ir1,ir2,...,irr,...,irR},1≤r≤R,irr是IR中第i个中间代码,中间代码是源代码编译过程的中间表示;
4.3.2.2.2.4从IR中提取irr,识别irr是否为cvi的污点传播代码的中间表示(例如,irr为“%varc=phii1[%varc_plus,%cvi.true],[%varc_minus,%cvi.false]”(表示变量varc的取值取决于cvi的取值),此时irr是cvi的污点传播代码的中间表示),如果是,转4.3.2.2.2.5;如果不是,转4.3.2.2.2.6;
4.3.2.2.2.5获取cvi在irr污点传播的变量v,获取irr表示的代码的代码位置l,将二元组[v,l]插入P,转4.3.2.2.2.6;
4.3.2.2.2.6令r=r+1;
4.3.2.2.2.7如果r≤R,转4.3.2.2.2.3;如果r>R,转4.3.2.2.2.8;
4.3.2.2.2.8分析P中的每一个二元组,若与IO相关的系统调用有关,将ci加入IO相关的配置项参数集合C′,转4.3.2.2.2.9;若与IO相关的系统调用无关,直接转4.3.2.2.2.9;
4.3.2.2.2.9如果i≤I,令i=i+1,转4.3.2.2.2;如果i>I,转4.3.2.3;
4.3.2.3对F进行控制流连接,控制流可能非常复杂,因为存在大量的代码结构,包括但不限于if、switch、for、while、break、return以及它们的交集和/或嵌套。使用Keith DCooper,Timothy J Harvey,and Ken Kennedy在2001年发表的“A simple,fastdominancealgorithm”中提出的配置项依赖算法获取IO相关系统调用的即时的配置项依赖项,使用Transitive relation(传递关系)使配置项依赖可传递,分析C中I个配置项参数中是否有被IO相关系统调用所依赖的配置项参数,将C中被IO相关系统调用所依赖的配置项参数加入C′,此时C′包括数据流连接找到的与IO相关系统调用有关的配置项参数和控制流连接找到的IO相关系统调用所依赖的配置项参数;
4.4虽然C′中需要测试的IO相关的配置项相比于C中全部配置项显著减少,但测试与IO相关的全部配置项参数的值依然很困难,需要优化IO相关配置项的测试样例,得到IO相关配置项的测试样例集合T′,方法为:
4.4.1将C′中配置项参数分为两种类型,一是控制IO并发性的配置项参数(例如,DBMS可以拥有的最大的后台写线程),二是控制IO定时的配置项参数(例如,在特定事件后IO应该延迟多长时间);
4.4.2使用徐天音2013年在SOSP发表的文章“Do not blame users formisconfigura-tions”(不要责备用户的配置错误)中的提取配置项约束的方法提取C′中配置项参数的约束;
4.4.3对IO相关配置项参数的值进行枚举,每次只改变C′中的一个配置项,得到IO相关的配置项参数待测值组合的集合V′,V′={V′1,V′2,...,V′e,...,V′E},1≤e≤E其中 为c′m在第e个配置项参数待测值组合中的取值,例如一个具有三个配置项{c1,c2,c3}的DBMS,三个配置项参数的值域范围分别为R1={0,1},R2=[0,100],R3={“a”,“b”},则将给出8种组合,分别为:c1=0,c2=default,c3=default;c1=1,c2=default,c3=default;c1=default,c2=0,c3=default;c1=default,c2=1,c3=default;c1=default,c2=10,c3=default;c1=default,c2=100,c3=default;c1=default,c2=default,c3=“a”;c1=default,c2=default,c3=“b”,其中“default”代表默认取值;
4.4.4对于数据库软件中的从属配置项(即一个配置项的值影响另一个配置项的值),查阅被检测数据库官方指南对于从属配置项的描述:如果官方指南对配置项c1的从属配置项c2的描述为,“c2仅在c1打开时才生效”,则配置项参数值枚举时手动设置c2在c1打开时才进行赋值,转4.4.5;如果官方指南对配置项c1的从属配置项c2的描述为,“c1仅在c2打开时才生效”,则配置项参数值枚举时手动设置c1在c2打开时才进行赋值,转4.4.5;
4.4.5对B与V‘取笛卡尔积,得到IO相关配置项的测试样例集合T′,T′={t′1,t′2,...,t′n,...,t′N},1≤n≤N,N是T′中测试样例的个数,t′n是测试命令和IO相关配置项参数赋值指令的集合组成的二元组,
4.5根据待检测数据库负载命令集合W、待检测数据库硬件设备集合D,以及4.4.5中得到的T′生成有负载命令、测试命令、配置组合和硬件设备的测试集合T″,方法为:
4.5.1读取待检测数据库负载命令集合W={w1,w2,...,wq,…,wQ},Q是待检测数据库用于测试的负载命令总数,wq是W中第q条负载命令,例如“./tpcc_run-thread=4,scale=100G…”,读取待检测数据库硬件设备集合D,D={d1,d2,...,dp,…,dP},P是待检测数据库用于测试的硬件设备总数,d是D中第d个硬件设备,例如“NVMeSSD”(在系统里表示为“/dev/nvme0n1”);
4.5.2初始化变量q=1;
4.5.3从W获取第q条负载命令wq
4.5.4初始化变量n=1;
4.5.5从T′读取第n个二元组t′n
4.5.6将wq和t′n并成一个二元组(wq,t′n);
4.5.7初始化变量p=1;
4.5.8从D中获取第p个硬件设备dp,例如“/dev/nvme0n1”;
4.5.9将4.5.6得到的二元组(wq,t′n)与dp合并成三元组(wq,t′n,dp),插入测试样例集合T″;
4.5.10如果p≤P,令p=p+1,转4.5.8;如果p>P,转4.5.11;
4.5.11如果n≤N,令n=n+1,转4.5.5;如果n>N,转4.5.12;
4.5.12如果q≤Q;令q=q+1,转4.5.3;如果q>Q,转4.5.13;
4.5.13得到有负载命令、测试命令、配置组合和硬件设备的测试集合T″,T″={(w1,t′1,d1),(w1,t′1,d2),...,(wq,t′n,dp),...,(wQ,t′N,dP)},将T″中三元组用t″表示,则T″={t″1,t″2,…,t″a,...,t″A},1≤a≤A,A=Q×N×P,将T″发送给运行时数据采集模块;
第五步,运行时数据采集模块执行T″中的测试样例,在测试样例执行过程中采集运行时内核数据,得到测试结果集合G并将G发送给不适配问题检测模块,方法为:
5.1运行时数据采集模块执行T″中的测试样例,使用linux内核中的eBPF工具监测内核,得到包含测试样例运行时数据的输出集合Out,方法是:
5.1.1初始化变量a=1;
5.1.2为防止因测试环境不稳定导致的性能波动,运行时数据采集模块重复执行每个测试样例H次,H为正整数,H优选为10;因此,令当前重复执行的次数repeat=1;
5.1.3运行时数据采集模块执行T″中的测试样例t″a,记录第repeat次执行t″a得到的运行时数据
5.1.4判定repeat是否等于H,若是,则得到一组关于测试样例t″a的运行时数据集合Ra 是第repeat次重复执行的运行时数据,运行时数据为四元组(IO-size,IO-offset,queue-utilization,cpu-utilization),运行时数据是一段观测时间(x)内检测得到的,IO-size是x时间内,配置项(如c1)改变前后,产生的IO的大小分布;IO-offset是x时间内,配置改变前后,随机和顺序IO的比例;queue-utilization是x时间内,配置改变前后,IO队列的利用率;cpu-utilization是x时间内,配置改变前后,cpu的利用率,1≤repeat≤H,a1≤arepeat≤aH,aH是Ra中运行时数据的个数,转5.1.5;否则令repeat=repeat+1,转5.1.3;
5.1.5判定a是否等于A,若是,记输出集合Out={[t″1,R1],...,[t″a,Ra],...,[t″a,RA]}(其中,二元组[t″a,Ra]的第一个元素t″a为测试样例,第二个元素Ra为执行该测试样例H次得到的运行时数据集合),转5.2;否则令a=a+1,转5.1.2;
5.2运行时数据采集模块将Out依据测试样例进行分组,方法是:
5.2.1初始化变量a=1;
5.2.2若[t″a,Ra]已被分组,则令a=a+1,转5.2.2;否则转5.2.3;
5.2.3将[t″a,Ra]按ta中的三元组取值和测试命令进行分组,即[t″a,Ra]与{[t″1,R1],…,[t″a,Ra],...,[t″a,RA]}中,若t″a和t″a′,同时满足以下3个条件,则将[t″a,Ra],[t″a′,Ra″]组成一组:
条件1,t″a和t″a′仅有某一个配置项c′m(其中,1≤m≤M)的取值不同;
条件2,测试命令均为byn
条件3,[t″a,Ra],[t″a′,Ra′]未被分组;
令与[t″a,Ra]满足以上条件的共有Numa个,即分为一组,记为Group(m,y),/>(其中,1≤a′,a″,...,a*≤A,Numa为正整数,Numa的大小与c′m的类型有关:若c′m为布尔类型,则Numa=2;若c′m为枚举类型,则Numa=Km(Km为c′m能枚举的值的总数);若c′m为数值类型,则Numa=6;若c′m为字符串类型,则Numa=1)。例如:t″a为/> 并且t″a′为/> 时,将[t″a,Ra],[t″a′,Ra′]组成一组;
5.2.4若a=A,表示分组完成,得到分组后的测试结果集合G={Group(1,1),Group(1,2),…,Group(1,Y),...,Group(m,y)…,Group(M,Y)},转5.3;否则令a=a+1,转5.2.2;
5.3运行时数据采集模块将测试结果集合G发送给不适配问题检测模块。
第六步,不适配问题检测模块根据IO相关的配置项集合C′以及测试结果集合G,使用假设检验(假设检验(hypothesis testing),又称统计假设检验,是用来判断样本与样本、样本与总体的差异是由抽样误差引起还是本质差别造成的统计推断方法。假设检验参数β为小于1的正实数.优选β=0.05)的方法判别待检测软件是否存在缺陷。假设检验原理为:(1)若任意一IO相关配置项c′m调节的性能预期为性能提升,若实际测试结果为小IO增加,数据库软件性能下降,则数据库软件存在IO大小不适配导致的性能问题;(2)若调节c′m的性能预期为性能合理下降,若实际测试结果为小IO增加,数据库性能大幅下降,则数据库软件存在IO大小不适配导致的性能问题;(3)若调节c′m的性能预期为性能不变,若实际测试结果为小IO增加,数据库软件性能下降,则数据库软件存在IO大小不适配导致的性能问题。方法为:遍历G中每一个分组,使用假设检验的方法判别待检测数据库软件是否存在缺陷:
6.3.1初始化变量m=1;
6.3.2初始化变量y=1;
6.3.3如果Group(m,y)中二元组数目大于一个,转6.3.4;否则转6.3.9;
6.3.4读取Group(m,y)中的前两个二元组,用[t″a,Ra]和[t″a′,Ra′]表示;
6.3.5若为情况(1)且c′m在t″a中的值大于cm在t″a′中的值,设定待验假设H0:Ra≤Ra′,转6.3.8;
6.3.6若为情况(2)且c′m在t″a中的值为1,c′m在t″a′中的值为0,设定待验假设H0:5·Ra≤Ra′,转6.3.8;
6.3.7若为情况(3),设定待验假设H0:Ra≠Ra′。转6.3.8;
6.3.8若假设检验结果表明H0被拒绝(即使用假设检验方法计算得到的被拒绝概率≥1-β),表明数据库存在由IO大小不匹配导致的数据库软件性能问题,与配置项c′m有关且触发该缺陷的测试命令为
6.3.9若y=Y,转6.3.10;否则令y=y+1,转6.3.3;
6.3.10若m=M,表明对G中全部测试结果完成检测,得到全部由IO大小不匹配导致的数据库软件性能问题,结束检测;否则令m=m+1,转6.3.2。
与现有技术相比,采用本发明能达到以下有益效果:
1、采用本发明能有效检测出数据库软件性能问题。采用本发明在6款大型开源数据库软件MariaDB,MongoDB,Redis,MySQL,PostgreSQL,SQLite共684个配置种,识别IO相关配置项并生成性能测试,共生成1525个测试,成功检测出6个IO请求大小不适配问题,而已有工作(何浩辰等人在ASE2020发表的“Cp-detector:Using configuration-relatedperformance prop-erties to expose performance bugs”中设计的工具Cp-Detector仅能检测出2个。
2、采用本发明能为软件社区检测出6个新的性能缺陷,防止了潜在的因软件性能问题可能导致的经济、用户损失,均已得到开发者的确认。缺陷ID为:MySQL-102514,PostgreSQL-vYnS,SQLite-vYqK,MariaDB-28909a,MongoDB-9537,Redis-10882。
3、本发明第四步给出了一个详尽的识别IO相关配置项并生成数据库IO大小不适配问题检测的测试样例的方法;本发明基于数据库配置,可有效检测由于IO大小不适配导致的数据库性能问题的检测,具有良好的应用前景。
附图说明
图1是本发明的总体流程图;
图2是本发明第一步构建的数据库性能问题检测系统逻辑结构图。
具体实施方式
下面结合附图对本发明进行说明。
如图1所示,本发明包括以下步骤:
第一步,构建数据库性能问题检测系统,数据库性能问题检测系统如图2所示,由配置项提取模块,测试样例生成模块,IO相关测试样例提取模块,运行时数据采集模块,不适配问题检测模块构成。
配置项提取模块是一个配置分析工具,与测试样例生成模块和IO相关测试样例提取模块相连,从待检测数据库的配置项列表读取数据库的全部配置项,得到待检测数据库软件配置项参数集合C,将C发送给测试样例生成模块和IO相关测试样例提取模块。
测试样例生成模块与配置项提取模块和IO相关配置标识模块相连,从配置项提取模块接收C,根据C生成配置项的测试样例集合T,将T发送给IO相关测试样例提取模块。
IO相关测试样例提取模块与配置项提取模块、测试样例生成模块和运行时数据采集模块相连,从配置项提取模块接收C,从测试样例生成模块接收T,通过运行T中的测试样例,获取配置项参数更改对IO相关系统调用的影响,从而判断C中配置项是否和IO相关,得到IO相关的测试样例集合T′和IO相关配置项集合C′,读取待检测数据库的负载命令集合W,读取待检测数据库的硬件设备集合D,将T′、W、D三者做笛卡尔积,生成最终测试样例集合T″,将T″发送给运行时数据采集模块,将C′发送给不适配问题检测模块。
运行时数据采集模块与IO相关测试样例提取模块和不适配问题检测模块相连,从IO相关测试样例提取模块接收T″,执行T″中的测试样例并动态监测操作系统内核,获取操作系统内核中与IO相关的数据作为测试结果集合G,将G发送给不适配问题检测模块。
不适配问题检测模块与运行时数据采集模块和IO相关测试样例提取模块相连,从运行时数据采集模块接收G,从IO相关测试样例提取模块接收C′,采用IO大小不适配规则检测被检测数据库的性能问题,如果配置调整后,被检测数据库读写过程中小IO数量变多且被检测数据库读写性能变差,则存在由IO大小不适配导致的被检测数据库性能问题,将被检测数据库性能问题输出。
第二步,配置项提取模块读取待检测数据库配置项列表,从待检测数据库配置项列表得到数据库配置项参数集合C,将C发送给测试样例生成模块,方法是:
2.1配置项提取模块读取待检测数据库配置项列表,得到待检测数据库配置项参数集合C,C={c1,c2,…,ci,…,cI},ci为C中第i个配置项参数,I为C中配置项参数的总数,1≤i≤I;
2.2配置项提取模块将C发送给测试样例生成模块。
第三步,测试样例生成模块利用从配置项提取模块接收的C,生成测试样例集合T,将T发送给IO相关测试样例提取模块,方法是:
3.1测试样例生成模块使用TianyinXu等人在SOSP 2013发表的文章“Do NotBlame Users for Misconfigurations(不要责备用户的配置错误)”的Spex算法,提取C中的配置项参数的语法类型和取值范围,提取出的语法类型分为四类:数值类型(int)、布尔类型(bool)、枚举类型(enum)、字符串类型(string);
3.2测试样例生成模块为C生成配置项参数待测值集合V,V={V1,V2,…,Vi,…,VI},其中 为ci的一个取值,Ki为测试样例生成模块为ci生成的值的个数。方法为:
3.2.1初始化变量i=1;
3.2.2若ci为布尔类型(bool),则令Vi={0,1},转3.2.6;
3.2.3若ci为枚举类型(enum),则令其中为Spex算法提取到的ci的全部可能取值,转3.2.6;
3.2.4若ci为字符串类型(string),则令(根据何浩辰在ESEC/FSE 2019发表的“Tuning backfired?not(always)your fault:understanding and detectingconfiguration-related performance bugs(配置调节适得其反?不总是你的错!理解并检测配置相关的性能缺陷)”的结论,极少数字符串类型的配置项会导致性能缺陷),转3.2.6;
3.2.5若ci为数值类型(int),则对ci的值进行抽样,方法为:记Spex算法提取到的ci的最小取值为Min,最大取值为Max,令Vi={Min,10·Min,102·Min,Max,10-1·Max,10-2·Max},转3.2.6;
3.2.6若i=I,转3.3;否则,令i=i+1,转3.2.2;
3.3对V1,V2,…,Vi,…,VI取笛卡尔积,得到笛卡尔积VCartesian,VCartesian=V1×V2×…×VI
3.4软件的性能测试集一般以性能测试工具的形式提供,测试样例生成模块采用性能测试工具(如sysbench、apache-benchmark)生成测试命令。方法为:采用经典的pair-wise方法(Pair-wise Testing is a combinatorial method of software testingthat,for each pair of input parameters to a system,tests all possiblediscretecombinations of those parameters.“pair-wise方法是一种软件测试领域的组合方法,该方法针对系统的每对输入参数,测试这些参数的所有可能的离散组合”--《PragmaticSoftware Testing:Becoming an Effective and Efficient Test Professional》“实用软件测试:成为一个高效的测试专业”)对性能测试工具的参数(如并发度、负载类型、数据表大小、数据表数量、读操作比例、写操作比例)进行配置,性能测试工具输出测试命令,得到测试命令集合B={b1,b2,b3,…,by,…,bY},1≤y≤Y,Y为B中测试命令的个数,by为B中第y个测试命令;
3.5测试样例生成模块生成测试样例集合T,T=B×VCartesian={t1,t2,t3,…,ts,…,tS},1≤s≤S,ts为一个二元组,(其中,/>的含义是:ci的取值为Vi中的第h个值/>),S为T中测试样例的个数,vu1为c1的第u(1≤u≤K1)个可能取值,/>为ci的第h(1≤h≤Ki)个可能取值,/>为cI(1≤j≤KI)的第j个可能取值,K1、Ki、KI分别为Spex算法提取到的配置项c1、ci、cI的可能取值的个数,且K1、Ki、KI均为正整数;将T发送给IO相关测试样例提取模块;
第四步,IO相关测试样例提取模块根据C和T以及待检测数据库软件源代码F识别IO相关配置项,生成IO相关配置项集合C′和IO相关测试样例集合T′,将C′发送给不适配问题检测模块,结合待检测数据库负载命令集合W和硬件设备集合D生成最终的测试样例集合T″,将T″发送给运行时数据采集模块,方法为:
4.1确定与IO相关的配置项的关键特征,关键特征为:与IO相关的配置项的值修改时,会影响IO相关的系统调用的调用次数。故可通过检测IO相关的系统调用被数据库配置项的影响情况,识别出IO相关的配置项,可分为两步,第一步:识别IO相关的系统调用;第二步:识别IO相关的配置项;
4.2识别IO相关的系统调用,方法为:
4.2.1许多系统调用都与IO相关(例如,写,断开链接),通过阅读Linux内核(优选5.4.0及以上版本)的官方手册,调查每一个系统调用(共335个),得到影响IO的系统调用信息;
4.2.2对4.2.1得到的系统调用进行交叉检查,过滤掉可能影响数据库软件IO大小的系统调用,剩余的作为IO相关的系统调用,这些系统调用可以进一步分为四个系列:1)读系列(例如,pread),2)写系列(例如,pwrite),3)同步系列(例如,fsync),以及4)控制线程/进程数量的系统调用(DBMS(数据据库管理系统)可以使用单独的线程/进程(例如clone)来发出IO请求);
4.3识别IO相关的配置项,得到IO相关的配置项参数集合C′,C′={c′1,c′2,...,c′m,...,c′M},M为C′中IO相关配置项的个数,1≤m≤M≤I,其中c′m是第m个IO相关配置项,方法为:
4.3.1定位配置对应的程序变量,读入被检测数据库软件的配置项列表,配置项列表存储有<配置项参数,配置项变量>二元对列表,所述配置项变量是配置项在源代码中定义的变量;从被检测数据库软件的配置项列表得到被检测数据库软件的源代码F中所有的配置项参数和对应配置项变量二元对集合CS,CS={<c1,cv1>,<c2,cv2>,...,<ci,cvi>,...,<cI,cvI>},其中ci为CS中第i个配置项参数,cvi为ci在F中对应的配置项变量,ci与cvi二元对关系可通过Shulin Zhou等人在QRS2016发表的“ConfMapper:Automated VariableFinding for Configuration Items in Source Code(ConfMapper:从软件源码中自动寻找配置参数对应配置变量)”中所述的从软件源码中自动寻找配置参数对应配置变量方法建立,I为F中配置参数总数,1≤i≤I;
4.3.2确定CS中的配置项变量和IO相关的系统调用是否有连接,方法为:
4.3.2.1使用LLVM编译器框架的Clang前端(10.0.0版本及以上)解析软件源码,生成软件源码对应的抽象语法树(Abstract Syntax Tree)ASTroot,ASTroot中的每个节点都表示F中的一种结构,比如整个源码整体(TranslationUnitDecl)、函数声明(FunctionDecl)、If分支语句(IfStmt)、赋值语句(AssignStmt)、函数调用(CallExpr)、常量字符串(StringLiteral)、二元计算(BinaryOperator)、单一变量(DeclRefExpr)、结构体变量(MemberExpr)等,且不同结构之间同样以树的结构表示相应从属关系,例如对于一个函数声明中的If分支语句,对应的If分支语句节点就位于以函数声明节点为根节点的子树中;
4.3.2.2进行数据流连接,使用Marek Chalupa等人在ATVA 2020发表的文章“DG:analysis and slicing of LLVM bitcode(一种基于LLVM的程序分析和切片方法)”的DG(constructing dependence graphs for program analysis)算法,对CS中的配置项变量进行污点分析,得到IO相关的配置项参数集合C′,此时C′包括数据流连接找到的与IO相关系统调用有关的配置项参数;方法为:
4.3.2.2.1初始化变量i=1;
4.3.2.2.2从CS中提取<ci,cvi>,基于LLVM(Low Level Virtual Machine)的iterating-over-def-use-use-def-chains(迭代def-use和use-def链)对cvi进行污点分析,确定ci的污点传播变量,得到ci的影响范围集合P={p1,p2,…,pz…,pz},其中pz为一个二元组,pz=[vz,lz],vz为ci的第z个污点传播变量,lz为vz在F中的位置,Z为影响范围集合P中元素的个数,1≤z≤Z,方法为:
4.3.2.2.2.1根据代码的语句类型,获得不同语句类型的污点传播变量,代码语句类型为赋值语句且赋值符号右边为配置项变量或污点传播变量时,赋值符号左边的变量为污点传播变量,例如“vara=cvi;varb=vara”(其中vara和varb为cvi的污点传播变量),代码语句类型为分支语句且判断条件包括配置项变量或污点传播变量时,每条分支上值发生变化的变量为污点传播变量,例如“if(cvi)varc+=1;else varc-=1”(其中varc为cvi的污点传播变量);
4.3.2.2.2.2初始化变量r=1;
4.3.2.2.2.3使用Clang编译源代码,生成中间代码集合IR,IR={ir1,ir2,...,irr,...,irR},1≤r≤R,irr是IR中第i个中间代码,中间代码是源代码编译过程的中间表示;
4.3.2.2.2.4从IR中提取irr,识别irr是否为cvi的污点传播代码的中间表示(例如,irr为“%varc=phii1[%varc_plus,%cvi.true],[%varc_minus,%cvi.false]”(表示变量varc的取值取决于cvi的取值),此时irr是cvi的污点传播代码的中间表示),如果是,转4.3.2.2.2.5;如果不是,转4.3.2.2.2.6;
4.3.2.2.2.5获取cvi在irr污点传播的变量v,获取irr表示的代码的代码位置l,将二元组[v,l]插入P,转4.3.2.2.2.6;
4.3.2.2.2.6令r=r+1;
4.3.2.2.2.7如果r≤R,转4.3.2.2.2.3;如果r>R,转4.3.2.2.2.8;
4.3.2.2.2.8分析P中的每一个二元组,若与IO相关的系统调用有关,将ci加入IO相关的配置项参数集合C′,转4.3.2.2.2.9;若与IO相关的系统调用无关,直接转4.3.2.2.2.9;
4.3.2.2.2.9如果i≤I,令i=i+1,转4.3.2.2.2;如果i>I,转4.3.2.3;
4.3.2.3对F进行控制流连接,控制流可能非常复杂,因为存在大量的代码结构,包括但不限于if、switch、for、while、break、return以及它们的交集和/或嵌套。使用Keith DCooper,Timothy J Harvey,and Ken Kennedy在2001年发表的“A simple,fastdominancealgorithm”中提出的配置项依赖算法获取IO相关系统调用的即时的配置项依赖项,使用Transitive relation(传递关系)使配置项依赖可传递,分析C中I个配置项参数中是否有被IO相关系统调用所依赖的配置项参数,将C中被IO相关系统调用所依赖的配置项参数加入C′,此时C′包括数据流连接找到的与IO相关系统调用有关的配置项参数和控制流连接找到的IO相关系统调用所依赖的配置项参数;
4.4虽然C′中需要测试的IO相关的配置项相比于C中全部配置项显著减少,但测试与IO相关的全部配置项参数的值依然很困难,需要优化IO相关配置项的测试样例,得到IO相关配置项的测试样例集合T′,方法为:
4.4.1将C′中配置项参数分为两种类型,一是控制IO并发性的配置项参数(例如,DBMS可以拥有的最大的后台写线程),二是控制IO定时的配置项参数(例如,在特定事件后IO应该延迟多长时间);
4.4.2使用徐天音2013年在SOSP发表的文章“Do not blame users formisconfigura-tions”(不要责备用户的配置错误)中的提取配置项约束的方法提取C′中配置项参数的约束;
4.4.3对IO相关配置项参数的值进行枚举,每次只改变C′中的一个配置项,得到IO相关的配置项参数待测值组合的集合V′,V′={V′1,V′2,...,V′e,...,V′E},1≤e≤E其中 为c′m在第e个配置项参数待测值组合中的取值,例如一个具有三个配置项{c1,c2,c3}的DBMS,三个配置项参数的值域范围分别为R1={0,1},R2=[0,100],R3={“a”,“b”},则将给出8种组合,分别为:c1=0,c2=default,c3=default;c1=1,c2=default,c3=default;c1=default,c2=0,c3=default;c1=default,c2=1,c3=default;c1=default,c2=10,c3=default;c1=default,c2=100,c3=default;c1=default,c2=default,c3=“a”;c1=default,c2=default,c3=“b”,其中“default”代表默认取值;
4.4.4对于数据库软件中的从属配置项(即一个配置项的值影响另一个配置项的值),查阅被检测数据库官方指南对于从属配置项的描述:如果官方指南对配置项c1的从属配置项c2的描述为,“c2仅在c1打开时才生效”,则配置项参数值枚举时手动设置c2在c1打开时才进行赋值,转4.4.5;如果官方指南对配置项c1的从属配置项c2的描述为,“c1仅在c2打开时才生效”,则配置项参数值枚举时手动设置c1在c2打开时才进行赋值,转4.4.5;;
4.4.5对B与V′取笛卡尔积,得到IO相关配置项的测试样例集合T′,T′={t′1,t′2,...,t′n,...,t′N},1≤n≤N,N是T′中测试样例的个数,t′n是测试命令和IO相关配置项参数赋值指令的集合组成的二元组,
4.5根据待检测数据库负载命令集合W、待检测数据库硬件设备集合D,以及4.4.5中得到的T′生成有负载命令、测试命令、配置组合和硬件设备的测试集合T″,方法为:
4.5.1读取待检测数据库负载命令集合W={w1,w2,...,wq,…,wQ},Q是待检测数据库用于测试的负载命令总数,wq是W中第q条负载命令,例如“./tpcc_run-thread=4,scale=100G…”,读取待检测数据库硬件设备集合D,D={d1,d2,...,dp,…,dP},P是待检测数据库用于测试的硬件设备总数,d是D中第d个硬件设备,例如“NVMeSSD”(在系统里表示为“/dev/nvme0n1”);
4.5.2初始化变量q=1;
4.5.3从W获取第q条负载命令wq
4.5.4初始化变量n=1;
4.5.5从T′读取第n个二元组t‘n
4.5.6将wq和t‘n并成一个二元组(wq,t′n);
4.5.7初始化变量p=1;
4.5.8从D中获取第p个硬件设备dp,例如“/dev/nvme0n1”;
4.5.9将4.5.6得到的二元组(wq,t′n)与dp合并成三元组(wq,t′n,dp),插入测试样例集合T″;
4.5.10如果p≤P,令p=p+1,转4.5.8;如果p>P,转4.5.11;
4.5.11如果n≤N,令n=n+1,转4.5.5;如果n>N,转4.5.12;
4.5.12如果q≤Q;令q=q+1,转4.5.3;如果q>Q,转4.5.13;
4.5.13得到有负载命令、测试命令、配置组合和硬件设备的测试集合T″,T″={(w1,t′1,d1),(w1,t′1,d2),...,(wq,t′n,dp),...,(wQ,t′N,dP)},将T″中三元组用t″表示,则T″={t″1,t″2,...,t″a,...,t″A},1≤a≤A,A=Q×N×P,将T″发送给运行时数据采集模块;
第五步,运行时数据采集模块执行T″中的测试样例,在测试样例执行过程中采集运行时内核数据,得到测试结果集合G并将G发送给不适配问题检测模块,方法为:
5.1运行时数据采集模块执行T″中的测试样例,使用linux内核中的eBPF工具监测内核,得到包含测试样例运行时数据的输出集合Out,方法是:
5.1.1初始化变量a=1;
5.1.2为防止因测试环境不稳定导致的性能波动,运行时数据采集模块重复执行每个测试样例H次,H为正整数,H优选为10;因此,令当前重复执行的次数repeat=1;
5.1.3运行时数据采集模块执行T″中的测试样例t″a,记录第repeat次执行t″a得到的运行时数据
5.1.4判定repeat是否等于H,若是,则得到一组关于测试样例t″a的运行时数据集合Ra 是第repeat次重复执行的运行时数据,运行时数据为四元组(IO-size,IO-offset,queue-utilization,cpu-utilization),运行时数据是一段观测时间(x)内检测得到的,IO-size是x时间内,配置项(如c1)改变前后,产生的IO的大小分布;IO-offset是x时间内,配置改变前后,随机和顺序IO的比例;queue-utilization是x时间内,配置改变前后,IO队列的利用率;cpu-utilization是x时间内,配置改变前后,cpu的利用率,1≤repeat≤H,a1≤arepeat≤aH,aH是Ra中运行时数据的个数,转5.1.5;否则令repeat=repeat+1,转5.1.3;
5.1.5判定a是否等于A,若是,记输出集合Out={[t″1,R1],...,[t″a,Ra],...,[t″a,RA]}(其中,二元组[t″a,Ra]的第一个元素t″a为测试样例,第二个元素Ra为执行该测试样例H次得到的运行时数据集合),转5.2;否则令a=a+1,转5.1.2;
5.2运行时数据采集模块将Out依据测试样例进行分组,方法是:
5.2.1初始化变量a=1;
5.2.2若[t″a,Ra]已被分组,则令a=a+1,转5.2.2;否则转5.2.3;
5.2.3将[t″a,Ra]按ta中的三元组取值和测试命令进行分组,即[t″a,Ra]与{[t″1,R1],...,[t″a,Ra],...,[t″a,RA]}中,若t″a和t″a′同时满足以下3个条件,则将[t″a,Ra],[t″a′,Ra′]组成一组:
条件1,t″a和t″a′仅有某一个配置项c′m(其中,1≤m≤M)的取值不同;
条件2,测试命令均为
条件3,[t″a,Ra],[t″a′,Ra′]未被分组;
令与[t″a,Ra]满足以上条件的共有Numa个,即分为一组,记为Group(m,y),/>(其中,1≤a′,a″,...,a*≤A,Numa为正整数,Numa的大小与c′m的类型有关:若c′m为布尔类型,则Numa=2;若c′m为枚举类型,则Numa=Km(Km为c′m能枚举的值的总数);若c′m为数值类型,则Numa=6;若c′m为字符串类型,则Numa=1)。例如:t″a为/> 并且t″a′为/> 时,将[t″a,Ra],[t″a′,Ra′]组成一组;
5.2.4若a=A,表示分组完成,得到分组后的测试结果集合G={Group(1,1),Group(1,2),…,Group(1,Y),...,Group(m,y)...,Group(M,Y)},转5.3;否则令a=a+1,转5.2.2;
5.3运行时数据采集模块将测试结果集合G发送给不适配问题检测模块。
第六步,不适配问题检测模块根据IO相关的配置项集合C′以及测试结果集合G,使用假设检验(假设检验(hypothesis testing),又称统计假设检验,是用来判断样本与样本、样本与总体的差异是由抽样误差引起还是本质差别造成的统计推断方法。假设检验参数β为小于1的正实数.优选β=0.05)的方法判别待检测软件是否存在缺陷。假设检验原理为:(1)若任意一IO相关配置项c′m调节的性能预期为性能提升,若实际测试结果为小IO增加,数据库软件性能下降,则数据库软件存在IO大小不适配导致的性能问题;(2)若调节c′m的性能预期为性能合理下降,若实际测试结果为小IO增加,数据库性能大幅下降,则数据库软件存在IO大小不适配导致的性能问题;(3)若调节c′m的性能预期为性能不变,若实际测试结果为小IO增加,数据库软件性能下降,则数据库软件存在IO大小不适配导致的性能问题。方法为:遍历G中每一个分组,使用假设检验的方法判别待检测数据库软件是否存在缺陷:
6.3.1初始化变量m=1;
6.3.2初始化变量y=1;
6.3.3如果Group(m,y)中二元组数目大于一个,转6.3.4;否则转6.3.9;
6.3.4读取Group(m,y)中的前两个二元组,用[t″a,Ra]和[t″a′,Ra′]表示;
6.3.5若为情况(1)且c′m在t″a中的值大于cm在t″a′中的值,设定待验假设H0:Ra≤Ra′,转6.3.8;
6.3.6若为情况(2)且c′m在t″a中的值为1,c′m在t″a′中的值为0,设定待验假设H0:5·Ra≤Ra′,转6.3.8;
6.3.7若为情况(3),设定待验假设H0:Ra≠Ra'。转6.3.8;
6.3.8若假设检验结果表明H0被拒绝(即使用假设检验方法计算得到的被拒绝概率≥1-β),表明数据库存在由IO大小不匹配导致的数据库软件性能问题,与配置项c′m有关且触发该缺陷的测试命令为/>
6.3.9若y=Y,转6.3.10;否则令y=y+1,转6.3.3;
6.3.10若m=M,表明对G中全部测试结果完成检测,得到全部由IO大小不匹配导致的数据库软件性能问题,结束检测;否则令m=m+1,转6.3.2。
为了验证本发明检测数据库性能问题的效果,在一台搭载Ubuntu18.04操作系统和AMD 24核3.6GHzCPU的计算机上开展本发明与背景技术中的CP-detector的对比实验(CP-detector为何浩辰等人在ASE2020发表的“Cp-detector:Using configuration-related performance prop-erties to expose performance bugs”中设计的工具),Ubuntu18.04操作系统的内核版本为5.8.0,软件环境为LLVM10.0.0+eBPF+python3.8,硬件环境为64GBDDR4内存和NVMeSSD 500GB,主要编码语言为C++语言。实验选择MySQL、PostgreSQL、SQLite、MariaDB、MongoDB、Redis六款开源数据库软件作为待检测数据库软件(即数据库软件源码F)进行评估。由于本发明检测的数据库性能问题是一种新型的性能问题,目前没有专门的进行检测的技术,故本发明与通过配置检测性能问题的最前沿技术CP-detector进行比较,将每个数据库软件的配置项列表、负载命令集合和硬件设备集合作为输入(硬件设备为64GBDDR4内存和NVMeSSD 500GB),执行本发明,得到如表1所示的结果,本发明共检测出6个由于IO大小不适配导致的数据库性能问题,CP-detector只能检测出两个。
表1.本发明与CP-detector的数据库性能问题检测能力对比
目标软件 缺陷ID 开发者是否确认 本发明是否检测出 CP-detector是否检测出
MySQL #102514
PostgreSQL #vYnS
SQLite #vYqK
MariaDB #28909a
MongoDB #9537
Redis #10882

Claims (10)

1.一种面向IO大小的数据库性能问题检测方法,其特征在于包括以下步骤:
第一步,构建数据库性能问题检测系统,数据库性能问题检测系统由配置项提取模块,测试样例生成模块,IO相关测试样例提取模块,运行时数据采集模块,不适配问题检测模块组成;
配置项提取模块是一个配置分析工具,与测试样例生成模块和IO相关测试样例提取模块相连,从待检测数据库的配置项列表读取数据库的全部配置项,得到待检测数据库软件配置项参数集合C,将C发送给测试样例生成模块和IO相关测试样例提取模块;所述配置项指数据库软件的配置项参数;
测试样例生成模块与配置项提取模块和IO相关配置标识模块相连,从配置项提取模块接收C,根据C生成配置项的测试样例集合T,将T发送给IO相关测试样例提取模块;
IO相关测试样例提取模块与配置项提取模块、测试样例生成模块和运行时数据采集模块相连,从配置项提取模块接收C,从测试样例生成模块接收T,通过运行T中的测试样例,获取配置项参数更改对IO相关系统调用的影响,从而判断C中配置项是否和IO相关,得到IO相关的测试样例集合T′和IO相关配置项集合C′,读取待检测数据库的负载命令集合W,读取待检测数据库的硬件设备集合D,将T′、W、D三者做笛卡尔积,生成最终测试样例集合T″,将T″发送给运行时数据采集模块,将C′发送给不适配问题检测模块;
运行时数据采集模块与IO相关测试样例提取模块和不适配问题检测模块相连,从IO相关测试样例提取模块接收T″,执行T″中的测试样例并动态监测操作系统内核,获取操作系统内核中与IO相关的数据作为测试结果集合G,将G发送给不适配问题检测模块;
不适配问题检测模块与运行时数据采集模块和IO相关测试样例提取模块相连,从运行时数据采集模块接收G,从IO相关测试样例提取模块接收C′,采用IO大小不适配规则检测被检测数据库的性能问题,如果配置调整后,被检测数据库读写过程中小IO数量变多且被检测数据库读写性能变差,则存在由IO大小不适配导致的被检测数据库性能问题,将被检测数据库性能问题输出;
第二步,配置项提取模块读取待检测数据库配置项列表,从待检测数据库配置项列表得到数据库配置项参数集合C,将C发送给测试样例生成模块,方法是:
2.1配置项提取模块读取待检测数据库配置项列表,得到待检测数据库配置项参数集合C,C={c1,c2,…,ci,…,cI},ci为C中第i个配置项参数,I为C中配置项参数的总数,1≤i≤I;
2.2配置项提取模块将C发送给测试样例生成模块;
第三步,测试样例生成模块利用从配置项提取模块接收的C,生成测试样例集合T,将T发送给IO相关测试样例提取模块,方法是:
3.1测试样例生成模块使用Spex算法提取C中的配置项参数的语法类型和取值范围,提取出的语法类型分为四类:数值类型int、布尔类型bool、枚举类型enum、字符串类型string;
3.2测试样例生成模块为C生成配置项参数待测值集合V,V={V1,V2,…,Vi,…,VI},其中 为ci的一个取值,Ki为测试样例生成模块为ci生成的值的个数;
3.3对V1,V2,…,Vi,…,VI取笛卡尔积,得到笛卡尔积VCartesian,VCartesian=V1×V2×…×VI
3.4测试样例生成模块采用性能测试工具生成测试命令,方法为:采用pair-wise方法对性能测试工具的参数进行配置,性能测试工具输出测试命令,得到测试命令集合B={b1,b2,b3,…,by,…,bY},1≤y≤Y,Y为B中测试命令的个数,by为B中第y个测试命令;
3.5测试样例生成模块生成测试样例集合T,T=B×VCartesian={t1,t2,t3,…,ts,…,tS},1≤s≤S,ts为一个二元组,其中,/>的含义是:ci的取值为Vi中的第h个值/>S为T中测试样例的个数,/>为c1的第u个可能取值,/>为ci的第h个可能取值,/>为cI的第j个可能取值,K1、Ki、KI分别为Spex算法提取到的配置项参数c1、ci、cI的可能取值的个数,且K1、Ki、KI均为正整数,1≤u≤K1,1≤h≤Ki,1≤j≤KI;将T发送给IO相关测试样例提取模块;
第四步,IO相关测试样例提取模块根据C和T以及待检测数据库软件源代码F识别IO相关配置项,生成IO相关配置项集合C′和IO相关测试样例集合T′,将C′发送给不适配问题检测模块,结合待检测数据库负载命令集合W和硬件设备集合D生成最终的测试样例集合T″,将T″发送给运行时数据采集模块,方法为:
4.1确定与IO相关的配置项的关键特征,关键特征为:与IO相关的配置项的值修改时,会影响IO相关的系统调用的调用次数;
4.2识别IO相关的系统调用,方法为:
4.2.1通过阅读Linux内核的官方手册,调查每一个系统调用,得到影响IO的系统调用信息;
4.2.2对4.2.1得到的系统调用进行交叉检查,过滤掉影响数据库软件IO大小的系统调用,剩余的作为IO相关的系统调用,这些系统调用进一步分为四个系列:1)读系列,2)写系列,3)同步系列,以及4)控制线程/进程数量的系统调用;
4.3识别IO相关的配置项,得到IO相关的配置项参数集合C′,C′={c′1,c′2,…,c′m,…,c′M},M为C′中IO相关配置项的个数,1≤m≤M≤I,其中c′m是第m个IO相关配置项,方法为:
4.3.1定位配置对应的程序变量,读入被检测数据库软件的配置项列表,配置项列表存储有<配置项参数,配置项变量>二元对列表,所述配置项变量是配置项在源代码中定义的变量;从被检测数据库软件的配置项列表得到被检测数据库软件的源代码F中所有的配置项参数和对应配置项变量二元对集合CS,CS={<c1,cv1>,<c2,cv2>,…,<ci,cvi>,…,<cI,cvI>},其中ci为CS中第i个配置项参数,cvi为ci在F中对应的配置项变量,ci与cvi二元对关系通过从软件源码中自动寻找配置参数对应配置变量方法建立,I为F中配置参数总数,1≤i≤I;
4.3.2确定CS中的配置项变量和IO相关的系统调用是否有连接,得到IO相关的配置项参数集合C′,方法为:
4.3.2.1使用LLVM编译器框架的Clang前端解析软件源码,生成软件源码对应的抽象语法树ASTroot,ASTroot中的每个节点表示F中的一种结构,且不同结构之间同样以树的结构表示相应从属关系;
4.3.2.2进行数据流连接,使用DG算法对CS中的配置项变量进行污点分析,得到IO相关的配置项参数集合C′,此时C′包括数据流连接找到的与IO相关系统调用有关的配置项参数;
4.3.2.3对F进行控制流连接;使用配置项依赖算法获取IO相关系统调用的即时的配置项依赖项,使用传递关系使配置项依赖可传递,分析C中I个配置项参数中是否有被IO相关系统调用所依赖的配置项参数,将C中被IO相关系统调用所依赖的配置项参数加入C′,此时C′包括数据流连接找到的与IO相关系统调用有关的配置项参数和控制流连接找到的IO相关系统调用所依赖的配置项参数;
4.4优化C′中IO相关配置项参数的测试样例,得到IO相关配置项的测试样例集合T′,方法为:
4.4.1将C′中配置项参数分为两种类型,一是控制IO并发性的配置项参数,二是控制IO定时的配置项参数;
4.4.2使用提取配置项约束的方法提取C′中配置项参数的约束;
4.4.3对IO相关配置项参数的值进行枚举,每次只改变C′中的一个配置项,得到IO相关的配置项参数待测值组合的集合V′,V′={V′1,V′2,…,V′e,…,V′E},1≤e≤E,其中 为c′m在第e个配置项参数待测值组合中的取值;
4.4.4对于数据库软件中的从属配置项即一个配置项的值影响另一个配置项的值,查阅被检测数据库官方指南对于从属配置项的描述:如果官方指南对配置项c1的从属配置项c2的描述为,“c2仅在c1打开时才生效”,则配置项参数值枚举时手动设置c2在c1打开时才进行赋值,转4.4.5;如果官方指南对配置项c1的从属配置项c2的描述为,“c1仅在c2打开时才生效”,则配置项参数值枚举时手动设置c1在c2打开时才进行赋值,转4.4.5;
4.4.5对B与V′取笛卡尔积,得到IO相关配置项的测试样例集合T′,T′={t′1,t′2,…,t′n,…,t′N},1≤n≤N,N是T′中测试样例的个数,t‘n是测试命令和IO相关配置项参数赋值指令的集合组成的二元组,
4.5根据待检测数据库负载命令集合W、待检测数据库硬件设备集合D,以及4.4.5中得到的T′生成有负载命令、测试命令、配置组合和硬件设备的测试集合T″,方法为:
4.5.1读取待检测数据库负载命令集合W,W={w1,w2,…,wq,…,wQ},Q是待检测数据库用于测试的负载命令总数,wq是W中第q条负载命令,读取待检测数据库硬件设备集合D,D={d1,d2,…,dp,…,dP},P是待检测数据库用于测试的硬件设备总数,d是D中第d个硬件设备;
4.5.2初始化变量q=1;
4.5.3从W获取第q条负载命令wq
4.5.4初始化变量n=1;
4.5.5从T′读取第n个二元组t′n
4.5.6将wq和t′n并成一个二元组(wq,t′n);
4.5.7初始化变量p=1;
4.5.8从D中获取第p个硬件设备dp
4.5.9将4.5.6得到的二元组(wq,t′n)与dp合并成三元组(wq,t′n,dp),插入测试样例集合T″;
4.5.10如果p≤P,令p=p+1,转4.5.8;如果p>P,转4.5.11;
4.5.11如果n≤N,令n=n+1,转4.5.5;如果n>N,转4.5.12;
4.5.12如果q≤Q;令q=q+1,转4.5.3;如果q>Q,转4.5.13;
4.5.13得到有负载命令、测试命令、配置组合和硬件设备的测试集合T″,T″={(w1,t′1,d1),(w1,t′1,d2),...,(wq,t′n,dp),...,(wQ,t′N,dP)},将T″中三元组用t″表示,则T″={t″1,t″2,...,t″a,...,t″A},1≤a≤A,A=Q×N×P,将T″发送给运行时数据采集模块;
第五步,运行时数据采集模块执行T″中的测试样例,在测试样例执行过程中采集运行时内核数据,得到测试结果集合G并将G发送给不适配问题检测模块,方法为:
5.1运行时数据采集模块执行T″中的测试样例,使用linux内核中的eBPF工具监测内核,得到输出集合Out,Out={[t″1,R1],...,[t″a,Ra],...,[t″a,RA]},其中,二元组[t″a,Ra]的第一个元素t″a为测试样例,第二个元素Ra为执行t″aH次得到的运行时数据集合,H为正整数, 是第repeat次重复执行的运行时数据,1≤repeat≤H,a1≤arepeat≤aH,aH是Ra中运行时数据的个数,/>为四元组(IO-size,IO-offset,queue-utilization,cpu-utilization),是一段观测时间x内检测得到的,IO-size是x时间内,配置项改变前后,产生的IO的大小分布;1O-offset是x时间内,配置改变前后,随机和顺序IO的比例;queue-utilization是x时间内,配置改变前后,IO队列的利用率;cpu-utilization是x时间内,配置改变前后,cpu的利用率;
5.2运行时数据采集模块将Out依据测试样例进行分组,方法是:
5.2.1初始化变量a=1;
5.2.2若[t″a,Ra]已被分组,则令a=a+1,转5.2.2;否则转5.2.3;
5.2.3将[t″a,Ra]按ta中的三元组取值和测试命令进行分组,即[t″a,Ra]与{[t″1,R1],…,[t″a,Ra],...,[t″a,RA]}中,若t″a和t″a′同时满足以下3个条件,则将[t″a,Ra],[t″a′,Ra′]组成一组:
条件1,t″a和t″a′仅有某一个配置项c′m,的取值不同,1≤m≤M;
条件2,测试命令均为
条件3,[t″a,Ra],[t″a′,Ra′]未被分组;
令与[t″a,Ra]满足以上条件的共有Numa个,即分为一组,记为Group(m,y),/>其中,1≤a′,a″,…,a*≤A,Numa为正整数,Numa的大小与c′m的类型有关:若c′m为布尔类型,则Numa=2;若c′m为枚举类型,则Numa=Km;若c′m为数值类型,则Numa=6;若c′m为字符串类型,则Numa=1;
5.2.4若a=A,表示分组完成,得到分组后的测试结果集合G={Group(1,1),Group(1,2),…,Group(1,Y),...,Group(m,y)…,Group(M,Y)},转5.3;否则令a=a+1,转5.2.2;
5.3运行时数据采集模块将测试结果集合G发送给不适配问题检测模块;
第六步,不适配问题检测模块根据IO相关的配置项集合C′以及测试结果集合G,使用假设检验的方法判别待检测软件是否存在缺陷,方法为:遍历G中每一个分组,使用假设检验的方法判别待检测数据库软件是否存在缺陷:
6.3.1初始化变量m=1;
6.3.2初始化变量y=1;
6.3.3如果Group(m,y)中二元组数目大于一个,转6.3.4;否则转6.3.9;
6.3.4读取Group(m,y)中的前两个二元组,用[t″a,Ra]和[t″a′,Ra′]表示;
6.3.5若为情况(1)且c′m在t″a中的值大于cm在t″a′中的值,设定待验假设H0:Ra≤Ra′,转6.3.8,所述情况(1)为:若任意一IO相关配置项c′m调节的性能预期为性能提升,若实际测试结果为小IO增加,数据库软件性能下降,则数据库软件存在IO大小不适配导致的性能问题;
6.3.6若为情况(2)且c′m在t″a中的值为1,c′m在t″a′中的值为0,设定待验假设H0:5·Ra≤Ra′,转6.3.8,所述情况(2)为:若调节c′m的性能预期为性能合理下降,若实际测试结果为小IO增加,数据库性能大幅下降,则数据库软件存在IO大小不适配导致的性能问题;
6.3.7若为情况(3),即若调节c′m的性能预期为性能不变,若实际测试结果为小IO增加,数据库软件性能下降,则数据库软件存在IO大小不适配导致的性能问题,设定待验假设H0:Ra≠Ra′,转6.3.8;
6.3.8若假设检验结果表明H0被拒绝,即使用假设检验方法计算得到的被拒绝概率≥1-β,表明数据库存在由IO大小不匹配导致的数据库软件性能问题,与配置项c′m有关且触发该缺陷的测试命令为β为假设检验参数,为小于1的正实数;
6.3.9若y=Y,转6.3.10;否则令y=y+1,转6.3.3;
6.3.10若m=M,得到全部由IO大小不匹配导致的数据库软件性能问题,结束检测;否则令m=m+1,转6.3.2。
2.如权利要求1所述的一种面向IO大小的数据库性能问题检测方法,其特征在于3.2步所述测试样例生成模块为C生成配置项参数待测值集合V的方法是:
3.2.1初始化变量i=1;
3.2.2若ci为布尔类型,则令Vi={0,1},转3.2.6;
3.2.3若ci为枚举类型,则令其中/>为Spex算法提取到的ci的全部可能取值,转3.2.6;
3.2.4若ci为字符串类型,则令转3.2.6;
3.2.5若ci为数值类型,则对ci的值进行抽样,方法为:记Spex算法提取到的ci的最小取值为Min,最大取值为Max,令Vi={Min,10·Min,102·Min,Max,10-1·Max,10-2·Max},转3.2.6;
3.2.6若i=I,结束;否则,令i=i+1,转3.2.2。
3.如权利要求1所述的一种面向IO大小的数据库性能问题检测方法,其特征在于3.4步所述测试样例生成模块生成测试命令采用的性能测试工具为sysbench-1.0或apache-benchmark-2.2;4.3.2步所述Clang前端为10.0.0版本及以上。
4.如权利要求1所述的一种面向IO大小的数据库性能问题检测方法,其特征在于3.4步所述性能测试工具的参数包括并发度、负载类型、数据表大小、数据表数量、读操作比例、写操作比例。
5.如权利要求1所述的一种面向IO大小的数据库性能问题检测方法,其特征在于4.2.1步所述Linux内核为5.4.0及以上版本;4.2.2步所述读系列包括pread系统调用,写系列包括pwrite系统调用,同步系列包括fsync系统调用,控制线程/进程数量的系统调用包括clone系统调用。
6.如权利要求1所述的一种面向IO大小的数据库性能问题检测方法,其特征在于4.3.2.2步所述进行数据流连接,使用DG算法对CS中的配置项变量进行污点分析,得到IO相关的配置项参数集合C′的方法为:
4.3.2.2.1初始化变量i=1;
4.3.2.2.2从CS中提取<ci,cvi>,基于LLVM的iterating-over-def-use-use-def-chains对cvi进行污点分析,确定ci的污点传播变量,得到ci的影响范围集合P={p1,p2,…,pz,…,pz},其中pz为一个二元组,pz=[vz,lz],vz为ci的第z个污点传播变量,lz为vz在F中的位置,Z为影响范围集合P中元素的个数,1≤z≤Z,方法为:
4.3.2.2.2.1根据代码的语句类型,获得不同语句类型的污点传播变量,代码语句类型为赋值语句且赋值符号右边为配置项变量或污点传播变量时,赋值符号左边的变量为污点传播变量,代码语句类型为分支语句且判断条件包括配置项变量或污点传播变量时,每条分支上值发生变化的变量为污点传播变量;
4.3.2.2.2.2初始化变量r=1;
4.3.2.2.2.3使用Clang编译源代码,生成中间代码集合IR,IR={ir1,ir2,...,irr,...,irR},1≤r≤R,irr是IR中第i个中间代码,中间代码是源代码编译过程的中间表示;
4.3.2.2.2.4从IR中提取irr,识别irr是否为cvi的污点传播代码的中间表示,如果是,转4.3.2.2.2.5;如果不是,转4.3.2.2.2.6;
4.3.2.2.2.5获取cvi在irr污点传播的变量v,获取irr表示的代码的代码位置l,将二元组[v,l]插入P,转4.3.2.2.2.6;
4.3.2.2.2.6令r=r+1;
4.3.2.2.2.7如果r≤R,转4.3.2.2.2.3;如果r>R,转4.3.2.2.2.8;
4.3.2.2.2.8分析P中的每一个二元组,若与IO相关的系统调用有关,将ci加入IO相关的配置项参数集合C′,转4.3.2.2.2.9;若与IO相关的系统调用无关,直接转4.3.2.2.2.9;
4.3.2.2.2.9如果i≤I,令i=i+1,转4.3.2.2.2;如果i>I,结束。
7.如权利要求6所述的一种面向IO大小的数据库性能问题检测方法,其特征在于4.3.2.2.2.4步所述识别irr是否为cvi的污点传播代码的中间表示的方法是:若irr中的变量的取值取决于cvi的取值,则irr是cvi的污点传播代码的中间表示。
8.如权利要求1所述的一种面向IO大小的数据库性能问题检测方法,其特征在于5.1步所述运行时数据采集模块执行T″中的测试样例,使用linux内核中的eBPF工具监测内核,得到测试样例运行时数据的方法是:
5.1.1初始化变量a=1;
5.1.2运行时数据采集模块重复执行每个测试样例H次,H为正整数;令当前重复执行的次数repeat=1;
5.1.3运行时数据采集模块执行T″中的测试样例t″a,记录第repeat次执行t″a得到的运行时数据
5.1.4判定repeat是否等于H,若是,则得到一组关于测试样例t″a的运行时数据集合Ra 是第repeat次重复执行的运行时数据,1≤repeat≤H,a1≤arepeat≤aH,aH是Ra中运行时数据的个数,转5.1.5;否则令repeat=repeat+1,转5.1.3;
5.1.5判定a是否等于A,若是,记输出集合Out={[t″1,R1],...,[t″a,Ra],...,[t″a,RA]},二元组[t″a,Ra]的第一个元素t″a为测试样例,第二个元素Ra为执行该测试样例H次得到的运行时数据集合,结束;否则令a=a+1,转5.1.2。
9.如权利要求8所述的一种面向IO大小的数据库性能问题检测方法,其特征在于5.1.2步所述H为10。
10.如权利要求1所述的一种面向IO大小的数据库性能问题检测方法,其特征在于6.3.8步所述β=0.05。
CN202310375345.4A 2023-04-11 2023-04-11 一种面向io大小的数据库性能问题检测方法 Active CN116225965B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310375345.4A CN116225965B (zh) 2023-04-11 2023-04-11 一种面向io大小的数据库性能问题检测方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310375345.4A CN116225965B (zh) 2023-04-11 2023-04-11 一种面向io大小的数据库性能问题检测方法

Publications (2)

Publication Number Publication Date
CN116225965A CN116225965A (zh) 2023-06-06
CN116225965B true CN116225965B (zh) 2023-10-10

Family

ID=86587493

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310375345.4A Active CN116225965B (zh) 2023-04-11 2023-04-11 一种面向io大小的数据库性能问题检测方法

Country Status (1)

Country Link
CN (1) CN116225965B (zh)

Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106598843A (zh) * 2016-11-18 2017-04-26 中国人民解放军国防科学技术大学 一种基于程序分析的软件日志行为自动识别方法
CN110543421A (zh) * 2019-08-31 2019-12-06 华南理工大学 基于测试用例自动生成算法的单元测试自动执行方法
CN111611177A (zh) * 2020-06-29 2020-09-01 中国人民解放军国防科技大学 一种基于配置项性能期望的软件性能缺陷检测方法
CN112632105A (zh) * 2020-01-17 2021-04-09 华东师范大学 大规模事务负载生成与数据库隔离级别正确性验证系统及方法
CN113094252A (zh) * 2019-12-23 2021-07-09 腾讯科技(深圳)有限公司 测试用例生成方法、装置、计算机设备及存储介质
CN113434388A (zh) * 2021-06-02 2021-09-24 华东师范大学 一种模型驱动的事务型数据库测试案例生成系统及方法
CN114780411A (zh) * 2022-04-26 2022-07-22 中国人民解放军国防科技大学 一种面向性能调优的软件配置项预选方法
CN114996111A (zh) * 2022-06-27 2022-09-02 中山大学 一种配置项对软件系统性能影响的分析方法及系统
CN115658492A (zh) * 2022-10-19 2023-01-31 中国科学院软件研究所 内核配置项异常值的检测方法及装置

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20140310690A1 (en) * 2013-04-15 2014-10-16 Futurewei Technologies, Inc. System and Method for Generating Automated Test Cases for Command Line Based Applications

Patent Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106598843A (zh) * 2016-11-18 2017-04-26 中国人民解放军国防科学技术大学 一种基于程序分析的软件日志行为自动识别方法
CN110543421A (zh) * 2019-08-31 2019-12-06 华南理工大学 基于测试用例自动生成算法的单元测试自动执行方法
CN113094252A (zh) * 2019-12-23 2021-07-09 腾讯科技(深圳)有限公司 测试用例生成方法、装置、计算机设备及存储介质
CN112632105A (zh) * 2020-01-17 2021-04-09 华东师范大学 大规模事务负载生成与数据库隔离级别正确性验证系统及方法
CN111611177A (zh) * 2020-06-29 2020-09-01 中国人民解放军国防科技大学 一种基于配置项性能期望的软件性能缺陷检测方法
CN113434388A (zh) * 2021-06-02 2021-09-24 华东师范大学 一种模型驱动的事务型数据库测试案例生成系统及方法
CN114780411A (zh) * 2022-04-26 2022-07-22 中国人民解放军国防科技大学 一种面向性能调优的软件配置项预选方法
CN114996111A (zh) * 2022-06-27 2022-09-02 中山大学 一种配置项对软件系统性能影响的分析方法及系统
CN115658492A (zh) * 2022-10-19 2023-01-31 中国科学院软件研究所 内核配置项异常值的检测方法及装置

Non-Patent Citations (4)

* Cited by examiner, † Cited by third party
Title
Applications of provenance in performance prediction and data storage optimisation;Simon Woodman 等;《Future Generation Computer Systems》;第75卷;299-309 *
一种基于关联挖掘的服务一致化配置方法;王焘 等;《计算机研究与发展》;第57卷(第1期);188-201 *
基于Jenkins的软件缺陷持续测试平台设计与实现;朱志东 等;《信息化研究》;第44卷(第3期);67-73 *
基于测试覆盖的安全关键软件测试策略研究;张波;《中国博士学位论文全文数据库 信息科技辑》;第2012年卷(第9期);I138-14 *

Also Published As

Publication number Publication date
CN116225965A (zh) 2023-06-06

Similar Documents

Publication Publication Date Title
Liao et al. Gunther: Search-based auto-tuning of mapreduce
US20070143246A1 (en) Method and apparatus for analyzing the effect of different execution parameters on the performance of a database query
US20070250517A1 (en) Method and Apparatus for Autonomically Maintaining Latent Auxiliary Database Structures for Use in Executing Database Queries
Negi et al. Steering query optimizers: A practical take on big data workloads
US20090217246A1 (en) Evaluating Software Programming Skills
US10754744B2 (en) Method of estimating program speed-up in highly parallel architectures using static analysis
US11288266B2 (en) Candidate projection enumeration based query response generation
US20210365356A1 (en) Automated determination of software testing resources
CN110377519B (zh) 大数据系统的性能容量测试方法、装置、设备及存储介质
CN110399182B (zh) 一种cuda线程放置优化方法
WO2019032123A1 (en) SYSTEMS AND METHODS FOR GENERATING DISTRIBUTED SOFTWARE USING AN UNREGRIBUTED SOURCE CODE
Grafberger et al. Automating and optimizing data-centric what-if analyses on native machine learning pipelines
KR102541934B1 (ko) 빅데이터 증강분석 프로파일링 시스템
CN116225965B (zh) 一种面向io大小的数据库性能问题检测方法
CN110580170B (zh) 软件性能风险的识别方法及装置
US11934927B2 (en) Handling system-characteristics drift in machine learning applications
US20160357655A1 (en) Performance information generating method, information processing apparatus and computer-readable storage medium storing performance information generation program
CN115686995A (zh) 一种数据监控处理方法及装置
CN114420209A (zh) 基于测序数据的病原微生物检测方法及系统
CN101751607A (zh) 工作效率评估系统及方法
CN110895529B (zh) 结构化查询语言的处理方法及相关装置
Ouyang et al. Mitigate data skew caused stragglers through ImKP partition in MapReduce
Tukaram Design and development of software tool for code clone search, detection, and analysis
CN112346714A (zh) 一种软件开发系统优化的方法
Mao et al. Extracting the representative failure executions via clustering analysis based on Markov profile model

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant