分类: LINUX
2010-06-18 09:33:33
一、几个问题
开始正题之前,我们先看几个问题:什么是稳定性和可靠性?什么是压力测试?为什么要进行压力测试?
什么是稳定性和可靠性?
稳定性反映的是系统不会出现异常情况;可靠性反映的是系统能够保持正常运行而不受外界影响的能力。
系统的稳定性和可靠性通常以连续运转时间和系统的可靠运行时间来度量。
什么是压力测试?
压力测试是一种破坏性的测试,即系统在非正常的、超负荷的条件下的运行情况 。用来评估在超越最大负载的情况下系统将如何运行,是系统在正常的情况下对某种负载强度的承受能力的考验 。
为什么要进行压力测试?
通常我们用压力测试来判断系统的稳定性和可靠性。
了解了上面的问题之后,我们来看看该如何进行压力测试的设计。
二、压力测试的设计
在对Linux内核版本稳定性的测试中,需要明确地声明并证明为什么该版本是稳定的或者是不稳定的。不同的 Linux 开发者、
用户和发行商会使用他们自己的方法来测试内核的稳定性,但是,如果他们对运行了哪些测试、覆盖的代码、达到的压力级别等的基础信息都没有发布,那么这就会
大大降低了结果的价值。
为此要有一个合适的测试方法来规范Linux内核稳定性的测试,以系统资源的利用率统计为基准制定了一个组合的测试方法,这一组合测试方法的四个步骤是:测试选择、系统资源利用率评价、内核代码覆盖分析以及最终的压力测试评价。
1 测试选择
测试选择包括达成两方面目的的测试:
- 测试应该可以得到 CPU(s)、内存、I/O 和网络等主要内核区域的高水平的资源利用率。
- 测试应该充分地覆盖内核代码,以帮助支持自其结果中生成的稳定性声明。
2 评价系统资源利用率
所选择的测试的组合必须给系统的资源带来足够的压力。Linux 内核的四个主要方面可以影响系统的 响应和执行时间:
- CPU:用于在机器的 CPU(s)上处理数据的时间。
- Memory:用于自真实存储器中读写数据的时间。
- I/O:用于自磁盘存储器读写数据的时间。
- Networking:用于自网络读写数据的时间。
系统资源利用率评价阶段通常需要多次尝试才能得到合适的测试组合,并得到期望水平的利用率。当确定测试组合时,过度利用总是一个至关重要的问题。例如,如
果选择的组合过于受 I/O 所限,可能会 导致 CPU
的测试结果不好,反之亦然。方法的这一部分主要是大量的试验和出错,直到所有资源达到期望水平。
当选定一个组合后,测试必须长时间运行以准确评价资源的利用率。测试运行的时间长短取决于每个测试的长度。假如多个测试同时运行,则时间必须足够长以使得
这些测试中最长的那个可以完成。在这个评价过程中,sar 工具也应该在运行。在评价运行的结论中,您应该收集并评价所有四种资源的利用率水平。
3 分析内核代码覆盖率
获得足够的内核覆盖率是系统压力测试的另一个职责。尽管所选的测试组合充分地利用了四种主要资源,它也有可能只是执行了内核的一小部分。因而,应该对覆盖率进行分析以确保组合可以成为一个系统压力测试,而不是一个系统负载生成器。
4 评价最终压力测试
之所以要执行方法中的这最后一步,是为了对系统压力测试进行核实。在一个被认为是稳定的内核上执行压力测试; 通常,发行版本中的内核可以满足这一要求,但不总是如此。要长时间地执行压力测试,同时运行sar 工具,原因有以下两点:
- 长时间运行有助于发现组合中的所有问题,否则,在短时间的“取样测试(sniff test)”中这些问题可能会被忽略。
- sar 生成的数据构成以后测试运行中进行比较的基线。
长时间运行结束后,现在可以基于收集的所有数据来决定这个测试组合是否是系统压力测试的合适候选者。
三、LTP(Linux Test Project)
LTP工作组在设计Linux 内核压力测试脚本 ltpstress.sh
时使用了这一设计方法,为给系统提供足够的压力,LTP工作组对这个组合测试进行了分析,以确定 Linux
内核的哪些部分在测试执行中得到了使用。然后,修改了组合测试,在保持期望的高强度系统压力的同时提高代码覆盖率的百分比。最终得到的压力测试涵盖了
Linux 内核的足够多部分,有助于稳定性声明,并且有系统使用情况和内核代码覆盖情况的数据来支持它。
有两个开放源代码工具可以帮助进行 Linux 内核的代码覆盖率分析:
- gcov:一个由 LTP 维护的开放源代码工具。这个工具分析内核代码的覆盖率,并报告哪些行、函数和分支被覆盖以及它们被访问了多少次。
- lcov:另一个由 IBM 开发,由 LTP 维护的开放源代码工具。 这个工具由一组构建于基于文本的 gcov 输出之上的 Perl
脚本构成,以实现基于 HTML 的输出。输出包括覆盖率百分比、图表以及概述页,可以快速浏览覆盖率数据。可以自LTP主页找到这两个工具。
lcov 工具会生成一棵完整的 HTML 树,其中包含有内核中代码的每一行以及关于每一行执行了 多少次的数据(如果有的话)。这个工具会量化覆盖率数据并生成关于内核中每一部分和 文件覆盖率的百分比数字。
内核的代码覆盖率分析只是在ltpstress.sh的设计和开发过程中用到,目的是保证lptsress.sh的可用性,我们在实际测试的时候就不需要再做内核的代码覆盖率分析了。
1 LTP的ltpstress.sh目标
ltpstress.sh的目标,是使用 LTP 测试套件对Linux 操作系统进行超长时间的测试,重点在于Linux
用户环境相关的工作负荷,而并不是致力于证明缺陷。这个应用程序组合了来自 LTP
的测试套件不同方面的多个测试以及内存和网络传输负载生成器。在执行之前,测试会根据系统中存在多少物理和虚拟内存来调整其总的内存使用情况。
2 ltpstress.sh的测试方法
测试方法有两个的阶段:一个是“初始测试”,一个是“压力测试”。通过初始测试是开始测试的必要条件。初始测试包括 LTP
测试套件在硬件和操作系统上成功运转,这些硬件和操作系统将用于可靠性运转。LTP 测试套件包附带的驱动程序脚本 runalltest.sh
用于验证内核。这个脚本串行地运行一组成包的测试,并报告全部结果。也可以选择同时并行地运行几个实例。默认地,这个脚本执行:
- 文件系统压力测试。
- 硬盘 I/O 测试。
- 内存管理压力测试。
- IPC 压力测试。
- SCHED测试。
- 命令功能的验证测试。
- 系统调用功能的验证测试。
压力测试可以验证产品在系统高使用率时的健壮性。作为 runalltest.sh 的补充,特别设计了一个名为 ltpstress.sh
的测试场景,在使用网络与内存管理的同时并行地运行大范围的内核组件,并在测试系统上生成高压力负荷。ltpstress.sh 也是 LTP
测试套件的一部分。这个脚本并行地运行相似的测试用例,串行地运行不同的测试用例,这样做是为了避免由于同时访问同一资源或者互相干扰而引起的间歇性故
障。默认地,这个脚本执行:
- NFS 压力测试。
- 内存管理压力测试。
- 文件系统压力测试。
- 数学 (浮点) 测试。
- 多线程压力测试。
- 硬盘 I/O 测试。
- IPC (pipeio, semaphore) 测试。
- 系统调用功能的验证测试。
- 网络压力测试。
3 系统监控
LTP 测试套件附带的 top 工具是经过修改的,用作系统监控工具。使用 top 可以实时地观察处理器的行为。改进的 top 工具具有附加的功能,可以将 top 结果的快照保存到文件中,并给出结果文件的平均总结,包括 CPU、内存和交换空间利用率等信息。
在我们的测试中,sar工具每 10 秒钟截取一次系统利用率的快照,并保存到结果文件。
测试之前所有选定的测试系统的硬件配置尽可能相同。去掉额外的硬件以减少潜在的硬件故障。在映像安装过程中选择最低的安全选项。预留至少 2 GB 的硬盘空间以保存 top 数据文件和 LTP 日志文件。
在测试期间系统不要受到干扰。偶尔访问一下系统以确认测试仍在进行是可以接受的。确认的手段包括使用 ps 命令、检查 top 数据和检查 LTP 日志数据。
4 LTP的结构
LTP的目录结构基本上分为文档目录(doc)、测试驱动程序目录(pan)、测试脚本目录(testscripts)、测试用例库(testcase)、测试命令文件目录(runtest)、头文件目录(include)、库目录(lib)等。
Doc:该目录是说明文件和帮助文档的所在地,这个目录中对LTP的内容和每个工具都有详细的说明。
Pan:该目录存储的是LTP测试套件的测试驱动程序pan。
Testscripts:该目录中存储的是可执行的测试脚本,不同方面的测试脚本的集合。
Testcase:该目录存储了所有LTP测试套件中所使用的测试用例的源码。
Runtest:该目录中的每个文件都是要执行的测试用例的命令集合,每个文件针对测试的不同方面。
Include:LTP测试套件的头文件目录,定义了LTP自身的数据结构和函数结构。
Lib:LTP测试套件运行时自身需要的库文件,定义了LTP自身的各种函数。
5 LTP 的测试方法
LTP测试套件有一个专门的测试驱动程序pan,具体的测试用例的执行都是由pan来调用执行,它可以跟踪孤儿进程和抓取测试的输出信息。它的工作方式是这样的:
从一个测试命令文件中读取要测试的条目的要执行的命令行,然后等待该项测试的结束,并记录详细的测试输出。默认状态下pan会随机的选择一个命令行来运行,可以指定在同一时间要执行测试的次数。
pan会记录测试产生的详细的格式复杂的输出,但它不进行数据的整理和统计,数据整理统计的工作由scanner来完成,scanner是一个测试结果分析工具,它会理解pan的输出格式,并输出成一个表格的
形式来总结那些测试passed或failed。
6 LTP的实际运行
实际运行当中,您还需要配置一些必要的服务才可以正确的运行LTP的测试套件,以ltprunall.sh为例,它是不需要配置其他服务就可以运行的,但是对于ltpstress.sh,是需要配置一些相关服务之后才可以正确运行的,需要您配置的服务如下:
配置rsh和rlogin服务,使用户能以root身份不需密码验证直接登录本机。
开启xinetd服务。
在用户主目录下建立一个名为.rhosts的文件,文件内容是允许对本机进行rsh和rlogin操作的主机名和IP地址。一个相应的例子如下:
# vi .rhosts
test.my.domain
192.168.1.11
localhost.localdomain
127.0.0.1
配置工作最后要做的就是重启xinetd服务,因为rsh和rlogin是受xinetd服务控制的:
/etc/init.d/ xinetd restart
或service xinetd restart
然后您就可以运行ltpstress.sh的脚本了。通常用到的参数是 [-d outputfile] [-l logfile] [-t run-time] [-S],-S 选项用来在测试运行过程中使用sar工具来采样系统的性能输出。
四、top和sar的一点使用说明
最后,我们在讨论一下top工具和sar工具的一些用法。
Top : 显示系统当前的进程和其他状况
使用方式:top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]
说明:即时显示 process 的动态
-d 改变显示的更新速度,或是在交谈式指令列( interactive command)按d。
-q 没有任何延迟的显示速度,如果使用者是有 superuser 的权限,则 top 将会以最高的优先序执行。
-c 切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称。
-S 累积模式,会将己完成或消失的子行程 ( dead child process ) 的 CPU time 累积起来。
-s 安全模式,将交谈式指令取消, 避免潜在的危机。
-i 不显示任何闲置 (idle) 或无用 (zombie) 的行程。
-n 更新的次数,完成后将会退出 top。
-b 批次档模式,搭配 "n" 参数一起使用,可以用来将 top 的结果输出到档案内。
范例:
显示更新十次后退出 ;
top -n 10
将更新显示二次的结果输入到名称为 top.log 的档案里 :
top -n 2 -b > top.log
sar:收集、报告、保存系统的活动信息
使用方式:sar [options] [-A] [-o file] t [n]
说明:在命令行中,n 和t 两个参数组合起来定义采样间隔和次数,t为采样间隔,是必须有的参数,n为采样次数,是可选的,sar命令的选项很多,下面只列出常用选项:
-a 报告文件读写使用情况
-b 报告缓存的使用情况
-c 报告系统调用的使用情况
-d 报告磁盘的使用情况
-h 报告关于buffer使用的统计数据
-m 报告IPC消息队列和信号量的使用情况
-q 报告运行队列和交换队列的平均长度
-R 报告进程的活动情况
-r 报告没有使用的内存页面和硬盘块
-u 报告CPU的利用率
-v 报告进程、i节点、文件和锁表状态
-w 报告系统交换活动状况
范例:
查看CPU的利用率,以2s为间隔,采样5次。
Sar -u 2 5