您的位置:首页 > 运维架构 > Linux

对 Linux 内核进行压力测试

2007-03-16 10:06 239 查看
在对Linux内核版本稳定性的测试中,需要明确地声明并证明为什么版本是稳定的或者是不稳定的。然而还没有被证明和证实当前现有的系统范围内的压力测试可以测试Linux内核整体上的稳定性。本文给出了一个创建系统范围内Linux压力测试并证明其结果正确性的方法。不同的Linux开发者、用户和发行版本会使用他们自己的方法来测试内核的稳定性。不过,关于他们决定运行哪些测试、覆盖的代码、达到的压力级别等的基础信息都没有发布,这就大大降低了结果的价值。
使用实验室的机器以及来自LinuxTestProject测试套件的测试,我们基于系统资源的利用率统计开发了一个测试的组合,为系统提供足够的压力。我们对这个组合测试进行了分析,以确定Linux内核的哪些部分在测试执行中得到了使用。然后,我们修改了组合测试,在保持期望的高强度系统压力的同时提高代码覆盖率的百分比。最终得到的压力测试涵盖了Linux内核的足够多部分,有助于稳定性声明,并且有系统使用情况和内核代码覆盖情况的数据来支持它。
这一组合测试方法的四个步骤是:测试选择、系统资源利用率评价、内核代码覆盖分析以及最终的压力测试评价。
选择测试
测试选择包括选择达成两方面目的的测试:
[align=left]·测试应该可以得到CPU(s)、内存、I/O和网络等主要内核区域的高水平的资源利用率。[/align]
[align=left]·测试应该充分地覆盖内核代码,以帮助支持自其结果中生成的稳定性声明。[/align]
只要有可能,都要使用自动化的或者易于修改的测试,以支持自动操作。自动操作可以使得测试更快而且可以重复进行,并帮助降低人为错误的风险。选择合适的测试时需要考虑的另一个方面是,使用可以自由发布结果的应用程序。最好是选择坚决拥护开放源代码方法和/或GPL的测试和测试套件,以助于确保发布过程的简便。

评价系统资源利用率
所选择的测试的组合必须给系统的资源带来足够的压力。Linux内核的四个主要方面可以影响系统的响应和执行时间:
[align=left]·CPU:用于在机器的CPU(s)上处理数据的时间。[/align]
[align=left]·Memory:用于自真实存储器中读写数据的时间。[/align]
[align=left]·I/O:用于自磁盘存储器读写数据的时间。[/align]
[align=left]·Networking:用于自网络读写数据的时间。[/align]
测试设计者应该使用下面这两个著名的且广为应用的开放源代码Linux资源监控工具来评价资源利用率水平。
[align=left]·top:由AlbertD.Cahalan维护着的一个开放源代码工具,包含于大部分Linux发行版本中,可用于当前的2.4和2.6内核。[/align]
[align=left]·sar:另一个开放源代码工具;它由SebastienGodard维护。这个工具也包含于大部分Linux发行版本中,可用于当前的2.4和2.6内核。[/align]
方法中的系统资源利用率评价阶段通常需要多次尝试才能得到合适的测试组合,并得到期望水平的利用率。当确定测试组合时,过度利用总是一个至关重要的问题。例如,如果选择的组合过于受I/O所限,可能会导致CPU的测试结果不好,反之亦然。方法的这一部分主要是大量的试验和出错,直到所有资源达到期望水平。
top工具可用于迅速确定每个测试影响哪个资源(CPU、内存或者I/O),并实时地显示出它们使用了多少资源。sar工具用于收集一段时间内的网络利用率统计数据,并将所有利用率数据的快照记录到一个文件。
当选定一个组合后,测试必须长时间运行以准确评价资源的利用率。测试运行的时间长短取决于每个测试的长度。假如多个测试同时运行,则时间必须足够长以使得这些测试中最长的那个可以完成。在这个评价过程中,sar工具也应该在运行。在评价运行的结论中,您应该收集并评价所有四种资源的利用率水平。
下面的例子显示了sar输出的CPU、内存和网络利用率:

清单1.sar的输出示例

10:48:27CPU%user%nice%system%iowait%idle

10:48:28all0.000.000.000.00100.00

10:48:29all3.000.001.000.0096.00

10:48:30all100.000.000.000.000.00

10:48:31all100.000.000.000.000.00


02:27:31kbmemfreekbmemused%memusedkbswpfreekbswpused%swpused

02:29:312009485322820.9453010400.00

02:31:311991365504021.6553010400.00

02:33:311988245535221.7853010400.00

02:35:311992005497621.6353010400.00


02:27:31IFACErxpck/stxpck/srxbyt/stxbyt/s

02:29:31eth0738.79741.6676025.55136941.85

02:31:31eth0743.30744.9776038.82136907.77

02:33:31eth0744.80745.0276135.53136901.38

02:35:31eth0742.35744.3475947.45136864.77

分析内核代码覆盖率
获得足够的内核覆盖率是系统压力测试的另一个职责。尽管所选的测试组合充分地利用了四种主要资源,它也有可能只是执行了内核的一小部分。因而,您应该对覆盖率进行分析以确保组合可以成为一个系统压力测试,而不是一个系统负载生成器。当前,有两个开放源代码工具可以帮助进行Linux内核的代码覆盖率分析:
[align=left]·gcov:一个由LinuxTestProject维护的开放源代码工具。这个工具分析内核代码的覆盖率,并报告哪些行、函数和分支被覆盖以及它们被访问了多少次。[/align]
[align=left]·lcov:另一个由IBM开发,由LinuxTestProject维护的开放源代码工具。这个工具由一组构建于基于文本的gcov输出之上的Perl脚本构成,以实现基于HTML的输出。输出包括覆盖率百分比、图表以及概述页,可以快速浏览覆盖率数据。您可以自LinuxTestProject(LTP)主页找到这两个工具。[/align]
gcov模块加载以后,所有运行于系统压力测试组合中的测试都必须执行。尽管原来的系统压力测试可以同时执行,也应该同时执行,但是这次运行应该是循环进行的。每个测试都应该运行一次直到结束,一个接一个地运行,不能重复运行任何测试。单个地、循环地运行,是为了减少在同时运行多个系统压力测试时,内核尝试去平衡它们的负载而导致的不可预知的和无目的的内核代码执行。您应该在最后一个测试运行结束后再进行gcov分析。由于最终是要格式化数据以进行分析,所以运行lcov工具并缷载gcov模块。
lcov工具会生成一棵完整的HTML树,其中包含有内核中代码的每一行以及关于每一行执行了多少次的数据(如果有的话)。这个工具会量化覆盖率数据并生成关于内核中每一部分和文件覆盖率的百分比数字。下面的例子展示了一个示例性的代码覆盖率输出:



lcov维护者定义了“足够的覆盖”(绿色的),因而这个lcov示例仅仅是一种评价。不过,所包括的原始数据让任何浏览者都可以做出他或她自己的判断。在浏览了覆盖率分析后,测试创建者现在可以修改测试的组合,以改变和/或增加所覆盖的代码的数量。

评价最终压力测试
之所以要执行方法中的这最后一步,是为了对系统压力测试进行核实。在一个被认为是稳定的内核上执行压力测试;通常,发行版本中的内核可以满足这一要求,但不总是如此。要长时间地执行压力测试(推荐至少24个小时),同时运行sar工具,原因有以下两点:
[align=left]·长时间运行有助于发现组合中的所有问题,否则,在短时间的“取样测试(snifftest)”中这些问题可能会被忽略。[/align]
[align=left]·sar生成的数据构成以后测试运行中进行比较的基线。[/align]
长时间运行结束后,您现在可以基于收集的所有数据来决定这个测试组合是否是系统压力测试的合适候选者。



LinuxTestProject在设计Linux内核压力测试脚本ltpstress.sh时使用了这一设计方法。这个应用程序组合了来自LTP的测试套件不同方面的多个测试以及内存和网络传输负载生成器。在执行之前,测试会根据系统中存在多少物理和虚拟内存来调整其总的内存使用情况。为了确保结果的准确性,这个脚本创建于受控的实验室条件下。
IBMLinuxTechnologyCenterTest部门使用这个压力测试以及其他工具和测试作为帮助确认Linux内核发行版本稳定性的一个相对快速和简便的途径。为帮助确保得到足够的覆盖率,测试既在实验室条件下也在模拟的用户情形下进行。

更多精彩内容请访问www.17testing.com

图2.设计过程总结
图1.gcov输出示例
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: