一种针对Linux进程调度的性能测试方法和工具
技术领域
本发明涉及Linux内核性能测试技术领域,尤其涉及一种针对Linux进程调度进行性能测试的方法和工具。
背景技术
性能测试是软件研发过程中必不可少的重要环节,它能够帮助软件厂商识别在软件研发过程中潜在的性能退化问题和产品可能存在的性能缺陷。Linux操作系统作为一个庞大复杂的软件系统,不断对其进行性能测试是Linux操作系统厂商在产品发布前必须进行的关键步骤。目前,业界对Linux操作系统开展性能测试是针对Linux内核的五大子系统(进程调度子系统、内存管理子系统、虚拟文件子系统、进程通信子系统和网络接口子系统)分别展开的。Linux进程调度是Linux操作系统的核心,它的主要工作是在所有的可运行进程中选择最合适的一个占用CPU运行。Linux进程调度性能的优劣将直接影响到Linux操作系统运行的正确性和稳定性。
目前,业界普遍开展的Linux性能测试主要是针对Linux内核的内存管理子系统、虚拟文件子系统和网络通信子系统,而针对Linux进程调度子系统进行性能测试的方法和工具相对匮乏。现有能够支持Linux进程调度性能测试的工具包括HackBench和ValonaMark。然而,使用上述两种工具对Linux进程调度性能进行测试存在以下不足:
一、上述工具仅关注了微观基准测试,忽略了宏观基准测试。微观基准测试是指对Linux内核工作过程中的某个具体环节的性能进行测试,对Linux进程调度子系统来说包括进程创建速度、进程调度切换速度等。宏观基准测试是从用户使用角度出发(即宏观角度)出发来评价Linux内核的性能。显然,要做到对Linux进程调度性能进行全面评测,仅关注微观基准测试是不够的。
二、上述工具关注的性能指标较少,且性能指标的计算方法不够精确。其中,HackBench和ValonaMark测量的性能指标仅局限于周转时间,且周转时间的计算方法误差较大(取软件运行一次的时间)。这是由于上述工具在计算性能指标时没有深入内核,不能准确获取内核工作的具体状态。
三、测试结果信息量少,很难对Linux内核调优提供帮助。
随着Linux操作系统应用领域的日益广泛,Linux操作系统厂商迫切需要一种针对Linux进程调度的性能测试方法和工具能够解决上述存在的问题,提高Linux操作系统产品的质量。
发明内容
本发明参考了性能测试方法学中的基准测试、压力测试和代码性能分析方法,结合内核插桩技术提出一种针对Linux进程调度性能测试的方法并设计了相应的工具,该方法和工具能够帮助Linux研发和测试人员直观评价Linux进程调度性能,识别产品存在的潜在性能问题,进而帮助Linux操作系统研发人员不断提升Linux进程调度性能,以解决现有方法不能从用户角度评价Linux进程调度性能、性能指标较少且计算精度差和测试结果信息难以辅助内核调优的问题。
为解决上述技术问题,本发明采用的技术方案是:一种针对Linux进程调度性能测试的方法,包含以下基准测试步骤:
步骤11:选取基准测试的维度和测试项;其中,基准测试的维度包括宏观基准测试和微观基准测试;宏观基准测试的测试项包括:调度公平性测试、调度效率测试和调度交互性测试;微观基准测试的测试项包括:调度上下文切换延迟测试和调度唤醒延迟测试;
步骤12:编写并配置测试驱动模块,用于接受用户通过命令行传入的执行参数来控制所述基准测试中对Linux进程调度施加的负载;
步骤13:编写并配置性能指标监控模块,用于获取和计算所述基准测试中关注的基准测试性能指标,不同的测试项对应不同的基准测试性能指标;
步骤14:运行测试驱动模块驱动基准测试执行,同时运行基准测试性能指标监控模块,对测试过程中Linux进程调度运行信息进行采集和处理,并实时记录Linux进程调度状态用于计算和更新基准测试性能指标;
步骤15:基准测试运行结束后,输出测试结果、测试执行过程信息和用户选择的基准测试性能指标信息;
其中,所述基准测试性能指标包括:周转时间、最大周转时间、平均周转时间、周转时间的标准差、带权周转时间、平均带权周转时间、最大带权周转时间、等待时间、最大等待时间、平均等待时间、唤醒延迟、平均唤醒延迟、最大唤醒延迟、最大上下文切换延迟、上下文切换延迟和平均上下文切换延迟。
优选的,该方法还包括以下步骤:通过所述性能指标监控模块对Linux内核中预先定义的与进程调度相关静态插桩点事件进行插桩,在所述性能指标监控模块运行过程中动态跟踪测试进程的上下文切换事件和调度唤醒事件,通过判断测试进程当前状态来获取和计算基准测试中选取的基准测试性能指标。
优选的,该方法包含以下代码性能分析步骤:
步骤21:选取分析对象,该分析对象为用户根据需要选择的进行代码性能分析的函数模块;
步骤22:编写并配置代码性能分析监控模块,用于对分析对象进行插桩;
步骤23:编写并配置代码性能分析测试驱动模块,用于给Linux进程调度增加负载来帮助快速识别热点代码;
步骤24:运行测试,运行代码性能分析测试驱动模块驱动Linux进程调度工作的过程;
步骤25:使用代码性能分析监控模块对选取的分析对象的执行情况进行数据采集和分析,需要采集和分析的数据包括:模块的执行次数、模块的执行时间、模块每行代码的执行时间;
步骤26:通过分析函数模块执行时间的基础上识别耗费较多CPU时间的代码段。
同时,结合本发明提出的方法,本发明设计实现了一种针对Linux进程调度的性能测试工具,包括:人机交互界面模块、测试驱动模块和内核监控模块;
人机交互界面模块,用于完成与用户进行交互;
测试驱动模块包括:Linux进程调度宏观基准测试驱动模块和Linux进程调度微观基准测试驱动模块;其中,Linux进程调度宏观基准测试驱动模块,用于在Linux进程调度宏观基准测试实施过程中为Linux进程调度器提供工作负载;Linux进程调度微观基准测试驱动模块,用于在Linux进程调度微观基准测试实施过程中为Linux进程调度器提供工作负载;
内核监控模块,包括基准测试性能指标监控模块,基准测试性能指标监控模块用于在Linux进程调度基准测试过程中收集和计算选取的性能指标信息。
优选的,所述Linux进程调度宏观基准测试驱动模块包括:Linux进程调度公平性测试驱动模块、Linux进程调度高效性测试驱动模块和Linux进程调度交互性测试驱动模块;所述Linux进程调度微观基准测试驱动模块包括:Linux进程上下文切换延迟测试驱动模块和Linux进程调度唤醒延迟测试驱动模块。优选的,所述性能指标监控模块能对Linux内核中预先定义的与进程调度相关静态插桩点事件进行插桩,在所述性能指标监控模块运行过程中动态跟踪测试进程的上下文切换事件和调度唤醒事件,通过判断测试进程当前状态来获取和计算基准测试中选取的基准测试性能指标。
优选的,所述内核监控模块还包括代码性能分析监控模块,代码性能分析监控模块用于在代码性能分析过程中对Linux内核运行状态、系统调用和内核函数执行情况信息进行收集;所述测试驱动模块中还包含代码性能分析测试驱动模块,用于在代码性能分析实施过程中为Linux进程调度器提供工作负载。
本发明的有益技术效果是:使用本发明提出的Linux进程调度性能测试方法能够有效解决目前在Linux进程调度性能测试中存在的由于不能深入内核而造成的性能指标计算精度差、关注的性能指标匮乏等问题。同时,本发明提出的方法中关注了Linux进程调度宏观基准测试和Linux进程调度代码性能分析,能够帮助Linux研发人员更加直观的评价Linux进程调度器性能。本发明设计的工具为本发明提出的方法提供了工具支持,有效解决了目前Linux进程调度性能测试工具匮乏的问题。
附图说明
图1为本发明的针对Linux进程调度的性能测试方法中基准测试的实施流程图。
图2为本发明的针对Linux进程调度的性能测试方法中代码性能分析的实施流程图。
图3为本发明的针对Linux进程调度的性能测试工具的基本框架图。
图4为使用本发明的针对Linux进程调度的性能测试工具进行Linux进程调度基准测试的顺序图。
具体实施方式
为使本发明的目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式是对本发明作进一步详细的说明。
本发明可用于帮助Linux操作系统研发人员评价Linux进程调度性能和辅助Linux内核进程调度性能优化。例如:Linux操作系统研发人员在产品研发过程中识别由于内核代码修改可能造成的Linux进程调度性能倒退的问题。
为了能够帮助Linux操作系统研发人员评价和调优Linux进程调度性能,本发明提出的针对Linux进程调度的性能测试方法包含两种重要手段,即:基准测试和代码性能分析。
基准测试的目的是帮助Linux研发人员直观评价Linux进程调度性能。本发明提出的基准测试方法包括:宏观基准测试和微观基准测试。宏观基准测试和微观基准测试的关注点不同。宏观基准测试是从用户应用角度评价Linux进程调度性能,包含进程调度公平性测试、进程调度效率测试和进程调度交互性测试;微观基准测试关注Linux进程调度过程中的延迟,包含进程上下文切换延迟测试和进程调度唤醒延迟测试。
参考图1,基准测试包含以下几个步骤:
步骤11:选取基准测试的维度和测试项:根据测试目标选取基准测试的维度,即采用宏观基准测试和微观基准测试;进一步,根据宏观基准测试和微观基准测试关注点的不同选取测试项,宏观基准测试的测试项包括:调度公平性测试、调度效率测试和调度交互性测试,微观基准测试的测试项包括:调度上下文切换延迟测试和调度唤醒延迟测试;
步骤12:编写并配置测试驱动模块,本发明编写的测试驱动模块是使用C语言编写的可执行程序,能够接受用户通过命令行传入的执行参数来控制基准测试中对Linux进程调度施加的负载;
步骤13:编写并配置性能指标监控模块,该模块用于获取和计算Linux进程调度基准测试中关注的基准测试性能指标,本发明关注的各种基准测试性能指标如表1所示不同测试项对应不同的基准测试性能指标。性能指标监控模块由预先编写的脚本组成,本发明选取了内核调试工具(具体为SystemTap工具,SystemTap工具是一种被广泛应用与Linux内核调试的辅助工具)辅助监控内核状态,SystemTap支持用户使用其特有的脚本语言来配置工具,因此,性能指标监控模块中包含的为SystemTap脚本。为了便于内核调试,在Linux内核调试工具中都预先定义了很多与内核运行状态密切相关的事件,本发明配置性能指标监控模块是通过编写脚本对Linux内核中与进程调度相关的关键事件进行插桩,并通过编写脚本描述针对不同事件发生时的处理逻辑完成的。即本发明在Linux进程调度性能测试中引入了内核插桩技术,使用Linux内核调试工具对Linux内核源码进行动态插桩,通过该模块对Linux内核中预先定义的与进程调度相关静态插桩点事件进行插桩,在该模块运行过程中动态跟踪测试进程的上下文切换事件和调度唤醒事件,通过判断测试进程当前状态来获取和计算基准测试中定义的性能指标;
表1:基准测试性能指标
性能指标
|
描述
|
周转时间 |
测试进程由提交运行到运行完成的时间间隔 |
最大周转时间 |
所有测试进程周转时间的最大值 |
平均周转时间 |
所有测试进程周转时间的算术平均值 |
周转时间的标准差 |
所有测试进程周转时间的标准差 |
带权周转时间 |
进程的周转时间和进程服务时间的比值 |
平均带权周转时间 |
所有测试进程带权周转时间的算术平均值 |
最大带权周转时间 |
所有测试进程带权周转时间的最大值 |
等待时间 |
测试进程在就绪队列中的等待时间 |
最大等待时间 |
所有测试进程等待时间的最大值 |
平均等待时间 |
所有测试进程等待时间的平均值 |
唤醒延迟 |
测试进程被唤醒到获取CPU执行的等待时间 |
平均唤醒延迟 |
所有测试进程唤醒延迟的算术平均值 |
最大唤醒延迟 |
所有测试进程唤醒延迟的最大值 |
最大上下文切换延迟 |
所有测试进程完成上下文切换延迟的最大值 |
上下文切换延迟 |
测试进程完成上下文切换的时间 |
平均上下文切换延迟 |
所有测试进程上下文切换延迟的算数平均值 |
步骤14:运行测试驱动模块驱动基准测试执行,同时运行性能指标监控模块,对测试过程中Linux进程调度运行信息进行采集和处理,并实时记录Linux进程调度状态用于计算和更新基准测试性能指标;
步骤15:基准测试运行结束后,输出测试结果、测试执行过程信息和用户选择的基准测试性能指标信息。
由于本发明提出的基准测试的各应用实例执行步骤大致相同,其主要区别在于采用的测试驱动模块和性能指标监控模块存在差异,因此在此仅选择宏观基准测试中进程调度效率测试作为具体实例来说明本发明提出的基准测试方法,详见具体实例1描述。
具体实例1:进程调度效率测试
(1)根据测试人员的测试目标选取宏观基准测试中的调度效率测试,用于评价研发过程中修改后的Linux进程调度效率的优劣。
(2)编写并配置测试驱动模块EffiBench。EffiBench是本发明针对Linux进程调度效率测试设计编写的测试驱动程序。
EffiBench的基本思想是通过设计一个(组)测试进程为Linux进程调度提供负载,通过衡量所有进程的周转时间之和来评价Linux进程调度效率的优劣。如果所有进程的周转时间之和越短,则说明Linux进程调度的效率越高。其基本原理是创建多组读、写进程,通过管道(Pipe)模拟C/S模式下的通信过程。其中,每组进程中包含了n个读进程模拟Sever端和n个写进程模拟Client端。EffiBench的执行参数包括组内通信进程数目和组内进程通信次数。
(3)编写并配置性能指标监控模块。Linux进程调度基准测试的性能指标主要包括:测试进程的周转时间和带权周转时间等。选取编写的schedtime.stp脚本来动态收集Linux进程调度工作状态信息,实时计算测试进程的周转时间和带权周转时间。
脚本schedtime.stp的基本原理是通过SystemTap中定义的sched_switch(进程上下文切换)和sched_wakeup(进程调度唤醒)静态插桩点事件来动态跟踪Linux进程调度上下文切换事件,在事件发生时判断和记录测试进程的状态,实时更新和计算性能测试指标,包括:测试进程的周转时间和带权周转时间、所有测试进程的平均周转时间和带权周转时间。
(4)运行测试驱动模块EffiBench驱动Linux进程调度效率测试运行,同时运行性能指标监控模块schedtime.stp对测试过程中Linux进程调度运行信息进行采集和处理,实时记录Linux进程调度状态,计算和更新性能指标。
(5)Linux进程调度效率基准测试运行结束后,输出测试驱动模块EffiBench的测试结果,包括:测试运行时间、测试过程中CPU占用率等;同时输出性能指标监控模块schedtime.stp脚本计算的测试进程周转时间和带权周转时间、所有测试进程的平均周转时间和平均带权周转时间等信息。
代码性能分析的目的是帮助测试人员查找耗费较多CPU时间的热点代码,辅助Linux操作系统研发人员内核调优。参考图2,本发明提出的代码性能分析方法包含以下几个步骤:
步骤21:选取分析对象。选取分析对象是指用户根据需要选择进行代码性能分析的函数模块。
步骤22:编写并配置代码性能分析监控模块,用于对分析对象进行插桩。对分析对象进行插桩是通过编写SystemTap脚本完成的。SystemTap提供了强大的脚本语言,用户通过编写脚本能够动态的获取内核状态信息。
SystemTap提供了kernel.function(“function”)事件允许用户对某个函数进行监控。我们可以使用probe kernel.function(“function”).call和probe kernel.function(“function”).return命令在函数function调用和返回的位置插入探针。当function函数调用或者返回时,SystemTap会通知用户事件发生。通过编写kernel.function(“function”)事件的处理函数,我们可以获取待分析函数在采样期间的调用次数和调用时间。
步骤23:编写并配置代码性能分析测试驱动模块,用于给Linux进程调度增加负载来帮助快速识别热点代码
步骤24:运行测试。运行测试是指运行代码性能分析测试驱动模块驱动Linux进程调度工作的过程。
步骤25:采样和分析数据。使用代码性能分析监控模块(编写的SystemTap脚本)驱动SystemTap工具执行对分析对象的执行情况进行数据采集。代码性能分析中我们需要收集的数据包括:模块的执行次数、模块的执行时间、模块每行代码的执行时间等;通过分析采样得到的数据,对我们选取的系统调用或者内核函数的执行时间、执行次数、每行代码的执行时间等信息进行统计。
步骤26:定位热点代码。定位热点代码是在分析函数模块执行时间的基础上识别那些耗费较多CPU时间的代码段。
具体实例2
下面以Linux 2.6.34内核为例对本发明提出的代码性能分析方法做进一步说明。Linux 2.6.34内核使用的是CFS(Completely Fair Scheduler)完全公平调度,其与进程调度相关的源码存放于Linux/kernel目录下的sched.c、sched_rt.c和sched_fair.c源文件中。该具体实例2中描述了使用本发明提出的代码性能分析方法的对sched.c源文件中的所有函数进行代码性能分析的主要处理步骤:
(1)选取分析对象。在具体实例2中选取在Linux/kernel目录下sched.c源文件中的所有函数作为我们分析的对象;
(2)对分析对象进行插桩。编写SystemTap脚本functionlinetime.stp对sched.c源文件中的所有内核函数进行插桩。在编写的脚本functionlinetime.stp中使用probe kernel.function(*kernel/sched.c).call和probe kernel.function(*kernel/sched.c).return命令对Linux/kernel/sched.c源文件中的所有内核函数进行插桩;
(3)运行测试。运行测试驱动程序EffiBench为Linux进程调度提供工作负载。EffiBench程序通过模拟进程休眠和唤醒过程来迫使Linux进程调度频繁完成进程调度工作,为在代码性能分析中尽快识别热点代码提供帮助;
(4)采样数据。在运行测试驱动程序后,同时运行functionlinetime.stp脚本对测试执行过程中sched.c源文件中的所有函数模块进行跟踪,记录所有待分析函数模块的执行次数,每次执行的时间,每行代码的执行时间等。
(5)统计执行时间。对使用functionlinetime.stp脚本进行采样得到的数据进行分析,分析sched.c中所有跟踪的系统调用或者内核函数的执行时间、执行次数、每行代码的执行时间等信息;查找和定位热点函数,即那些耗费时间较多的函数模块,例如:schedule函数;
(6)定位热点代码。对sched.c中的热点函数schedule函数进行分析,分析schedule函数中每行代码的执行次数和执行时间,计算每行代码的平均执行时间和最大执行时间,识别和定位热点代码。
具体实施例3:一种针对Linux进程调度的性能测试工具。
本发明还提出了一种针对Linux进程调度的性能测试工具。该工具包括:人机交互界面模块、测试驱动模块和内核监控模块3个重要组成部分,如图3所示。其各个部分的功能具体如下:
人机交互界面模块用于完成与用户进行交互的功能,帮助用户完成测试配置、测试控制、测试监视和测试结果查看等功能。
测试驱动模块包含了驱动基准测试执行的各类测试用例程序,具体包括:Linux进程调度宏观基准测试驱动模块集合和Linux进程调度微观基准测试驱动模块集合;其中,Linux进程调度宏观基准测试驱动模块,用于在Linux进程调度宏观基准测试实施过程中为Linux进程调度器提供工作负载;Linux进程调度微观基准测试驱动模块,用于在Linux进程调度微观基准测试实施过程中为Linux进程调度器提供工作负载。Linux进程调度宏观基准测试驱动模块集合中又包括了Linux进程调度公平性测试驱动模块、Linux进程调度高效性测试驱动模块和Linux进程调度交互性测试驱动模块;Linux进程调度微观基准测试驱动模块集合中又包括了Linux进程上下文切换延迟测试驱动模块和Linux进程调度唤醒延迟测试驱动模块。测试驱动模块中包含的各类测试用例程序,同样能够应用在本发明提出的代码性能分析方法中,即测试驱动模块中还包含代码性能分析测试驱动模块,在代码性能分析实施过程中为Linux进程调度器提供工作负载。
内核监控模块包含了对Linux进程调度性能基准测试和代码性能分析过程中Linux内核运行信息进行收集的各类脚本。本发明设计的工具支持通过编写SystemTap脚本来完成对Linux内核运行信息进行监控。对应于本发明提出的两类方法,内核监控模块中包含了两类模块集合,即:性能指标监控模块集合和代码性能分析监控模块集合。其中,性能指标监控模块集合中包含的是用于在Linux进程调度基准测试过程中收集和计算选取的性能指标信息的模块;而代码性能分析监控模块集合中包含的是用于在代码性能分析过程中对Linux内核运行状态、系统调用和内核函数执行情况信息收集的各类模块。
在测试执行过程中,测试人员通过人机交互界面模块完成Linux进程调度性能基准测试的配置工作,具体包括:配置测试工具、监视测试执行和查看测试结果;人机交互界面模块使用内核监控模块中的各类模块完成对内核调试工具(SystemTap)的配置工作;同时,人机交互界面模块通过Linux Shell驱动测试驱动模块中的各类测试用例程序的执行,并通过Linux Shell启动内核调试工具和内核监视工具对测试信息进行收集。
如图4所示,为使用本发明的针对Linux进程调度的性能测试工具进行Linux进程调度基准测试的顺序图,其遵循下列顺序:
第一,用户通过人机交互界面模块选择基准测试功能,人机交互界面模块在页面上创建配置基准测试参数的各类控件;
第二,用户基于人机交互界面创建的各类控件配置测试执行参数,并在配置结束后执行测试;
第三,在响应执行测试命令后,人机交互界面模块按照用户输入通过测试驱动模块中的各类测试用例程序执行,并返回测试用例程序执行的各类信息;
第四,在测试开始执行后,人机交互界面模块通过调用内核监控模块中的基准测试性能指标获取脚本和内核监控脚本来配置Linux内核内置的调试工具和监控工具来计算性能指标和获取内核运行状态信息;
第五,在测试执行结束后,测试驱动模块发送测试结束消息,人机交互界面模块接收到测试结束消息后,通过内核监控模块收集和整理本次基准测试获取的各类指标和结果,并显示在页面上供测试人员查看和分析。
综上所述,本发明能够帮助Linux操作系统研发和测试人员直观评价Linux进程调度性能,并在Linux操作系统真实应用环境下动态查找和定位与进程调度相关的热点代码,从而辅助Linux操作系统研发和测试人员开展Linux进程调度器性能测试和Linux进程调度器性能调优。
以上所述的实例对本发明的各个部分的实现方式作了详细的说明,但是本发明的具体实现形式并不局限于此,对于本技术领域的一般技术人员来说,在不背离本发明所述方法的精神和权利要求范围的情况下对它进行的各种显而易见的改变都在本发明的保护范围之内。