2 各工作量的设计与实现
作为负载的负载工作量和作业工作量的选取是否得当,对测试工具的编写以及测试结果有着至关重要的意义。2.l 设计负载工作量2.l.l 设计处理器负载
通过两个进程对双向进程间通信管道的循环读写操作这一实际工作量来测试处理器上下文切
换[4]
的性能并作为负载,具体过程如图2所示。
图2 双管道读写示意图
实现细节上定义两个管道intprevfd[2],cur-rfd[2];检测fork()的返回值,如果是新创建的子进程则cIoseprevfd[l]和currfd[0],开始从prevfd0]读,往currfd[l]写;同理如果还是原进程(父进程)则执行相反的操作。用fork创建N个进程按以上双管道方式对两管道进行读写,直到收到中止信号为止,这样对进程调度子系统造成负载压力。
2.l.2 设计内存负载
内存管理子系统是最复杂的一个子系统,影响Linux内存管理效率的两个最主要因素是页面
分配算法和页面淘汰算法
[5-6]
。通用的测试内存分配延迟的算法例子如下:
[
操作系统
276
大 连 轻 工 业 学 院 学 报
staticnum_of_pages[]={128,512,1024,
本机上),线程数作为Dbench参数。2.1.5 设计网络负载
第25卷
2048,4096};
char*mem[6];for(i=0;i<6;i++){
mem[i]=(char*)maIIoc(num_of_pages[i];*PAGE.SIZE)}
for(i=0;i<6,i++)free(mem[i]);在循环中用maIIoc分配内存,每次分配1M内存,并且用memset函数用“1”填充该段内存空网络子系统的负载实现模拟CS模式的多用户请求。运行支持多线程的socket服务器进程监听网络,用fork创建N(根据机器性能和测试需要而定)个进程,创建socket进行连接并传输固定大小的同一个文件,结束时关闭socket退出。具体实现细节与文件系统负载同理,也要通过调用ex-ecIp()实现。
2.1.6 设计目录树负载
间,尽可能地为测试进程分配最大化内存,大小为实际物理内存ram加上交换分区swap减去系统保留空间(Linux桌面系统暂定为64M大小,为操作系统保障运行所需最少空间),然后就是把这些1M大小的内存段分成两部分,进行两部分内存段间的一一对应拷贝,用的函数是memcpy()。这样内存管理子系统也处于负载状态。2.1.3 设计IO负载
利用Linux两个特殊设备文件进行大数据量的IO读写操作:
(1)/dev/nuII
/dev/nuII为空设备,也称为位桶(bitbuck-et)。任何写入它的输出都会被抛弃。
(2)/dev/zero
/dev/zero为另一个类似的设备文件,该设备无穷尽地提供0,
可以使用任何你需要的数目。打开一个要读取的文件,同时打开/dev/nuII,用read函数将文件分次读到缓冲区里,用write函数把缓冲区的内容扔到位桶/dev/nuII里,大小为物理内存大小。循环反复这一过程的同时从/dev/zero里read出0来,用write写到文件中。2.1.4 设计文件系统负载
调用Dbench产生一定数目的Dbench访问线程对文件系统进行连接、创建目录、生成文件、写文件、读文件、关闭文件、文件改名、文件查找、文件删除、目录删除、获取路径信息、获取文件信息等一系列文件系统的操作。只用Dbench来产生负载,不输出Dbench的运行结果,因为文件系统吞吐量不是本文关心的指标。具体实现设置信号量如下:
sa.sa_handIer=&sig_term;sigfiIIset(&sa.sa_mask);sa.sa_fIags=SA_RESTART;
这样在没有收到系统中止信号sig_term的时候,就在for(;;)循环中用execIp()系统调用函数调用Dbench执行(前提是Dbench已经安装在
Inode节点和目录树的结构直接关系到文件管理的性能。inode结构描述文件中数据占据哪个块以及文件的存取权限、文件修改时间及文件类型。文件系统中所有的inode都被保存在inode表中,遍历这个庞大的inode表取出相关文件信息,本身就构成了压力负载。对整个目录树进行打包备份,生成个tar文件存储在磁盘上,然后再对这个tar备份文件进行解压操作。2.2 设计作业工作量
Linux桌面操作系统具有更加友好的用户界面、更多更方便的图形应用程序。xwindows的目录图形显示是通过调用Is命令将列举目录结果通过管道传递给xwindows的图形显示接口来实现的。在这些负载工作量运行的同时运行Is列举目录树,是为了测试各种负载条件下系统响应。应用场景如多用户、多任务的Linux操作系统。用户边拷贝文件(IO负载)边点击其他窗口运行其他程序。这个响应时间直接影响用户使用感受。之所以要选Is目录树作为作业工作量,是因为最典型且容易实现。就列举目录来说自身并不能造成负载压力,但是在各种负载抢夺系统资源的条件下,再人为加大调整目录文件的个数和文件夹的多层次性,那么列举目录树本身也是个费事费时的工作量。为了保证作业工作量的不变性,被列举的目录文件数目和大小保持同一性,放在一个独立分区里。
把列举目录树作为作业工作量,其他的负载工作量作为负载,测试Linux桌面操作系统在这些特定负载条件下完成这一作业工作量的响应时间、CPU时间、CPU占用率等。同时也输出各负载工作量的运行次数,完成一个任务周期的平均时间、平均CPU时间,平均CPU占用率等参数。这样以作业工作量的响应时间、CPU占用率等参数为主,负载工作量的运行参数为辅共同来评价系统性能。
操作系统
第4期
李媛媛等:Linux桌面系统性能评价的负载测试
277
3 测试结果
基于本文的研究内容,作者在redhat9系统下完成了测试软件的编写。基于此软件和固定测试用机对4种不同的Linux桌面版本操作系统进行了测评。
write()和网络对于TurboLinux调度上表现差了点;
1O而言是个瓶颈;Redhat9在内存管理和文件系统RedfIag4.O在read()性能上有待提上有待提高;高。
以上是横向对比不同版本的性能,对于单个表1 测试用机配置
CPUInteIPentium42.8OG内存512M
硬盘WD8OOBB8OG显卡主板集成InteI82865G网卡主板集成InteIPRO/1OOOM根分区26G大小的ext3格式主分区交换分区1.5G大小的swap交换分区安装模式desktop安装模式+GCC编译器用户
根用户root
为了排除偶然性,测试程序在每一种Linux桌面下平均运行1O次,取最后的平均值作为结果。篇幅有限以文件系统负载为例如表2所示。