LoaRunner性能测试系统学习教程:磁盘监控(5)
上期我们讲到LoaRunner性能测试内存监控,这期我们讲LoaRunner性能测试磁盘监控。
磁盘监控
介绍磁盘监控前,先介绍固定磁盘存储管理的性能,固定磁盘存储器的结构层次如图所示。
每个单独的磁盘驱动器称为一个物理卷(PV)它们各有一个名称,例如/dev/hdisk0,
如果物理卷在使用,那么它属于一个卷组(VG)卷组中所有物理卷划分成相同大小(如果卷组包含的物理卷小于4GB,
则缺省值是4MB,对于更大的磁盘该值为8MB或更多)的物理分区(PP)。
根据空间分配的用途,每个物理卷可以分成五个区域,根据磁盘驱动器的不同,每个区域中物理分区的数量也不同。在每个卷组中定义一个或多个逻辑卷(LV),每个逻辑卷由一个或多个逻辑分区组成,每个逻辑分区至少对应一个物理分区,如果指定为逻辑卷制作镜像,就需要分配额外的物理分区存储每个逻辑分区的额外副本,虽然逻辑分区是连续编号的,但底层的物理分区不必连续或邻接。 逻辑卷为系统用途提供服务(例如页面调度),但是每个容纳常规系统数据或用户数据或程序的逻辑卷都包含一个单独的日志文件系统(JFS或增强型JFS),每个JFS由页大小(4096字节)块的池组成。当数据要写入某个文件中时,会为这个文件分配一个或多个额外的块,这些块彼此和与先前分配给这个文件的其它块之间可能邻接也可能不邻接。
图中显示了一个文件系统中可能发生的糟糕情况,这个文件系统已经使用了很长时间且没有重新组织过,文件/op/filename物理记录在很多块上,这些块在物理位置上相互远离,不是邻接的,顺序读取这个文件将导致许多费时的寻道操作。虽然操作系统的文件在概念上是一个顺序且邻接的字节字符串,但物理实现可能非常不同,在一个文件系统中对逻辑卷的多次扩展和分配/释放/再分配活动可能出现磁盘分段,当一个文件系统的可用空间由大量小块空间组成,那么就会出现碎片,就不可能在邻接的块中写出新的文件。
在高度碎片化的文件系统中访问文件可能导致大量的寻道操作和较长的I/O响应时间(寻道等待时间决定I/O响应时间),例如,如果顺序访问文件,那么由大量广泛分散的小块组成的文件布局比文件块紧密相连的布局需要更长的寻道时间,当文件缓存在内存中时,文件布局对于I/O性能的影响减小,在操作系统中打开一个文件时,它被映射到虚拟内存中一个永久数据段,这个段代表该文件的虚拟缓冲区,文件的块直接映射到段的页面中,VMM管理段页面,根据需要读取文件块到段页面中(当它们被访问时)。有几种环境会导致VMM将一页写回到磁盘上文件中相应的块,但如果某块最近已经被访问,VMM通常会在内存中保留该页,因此,频繁访问的页倾向于在内存中停留较长时间,所以不需要物理磁盘访问就可以满足对相应块的逻辑文件访问,在某些地方,用户或系统管理员可以选择在逻辑卷中重新组织文件布局以及在物理卷中重新组织逻辑卷布局,从而减少磁盘碎片以及更均匀地分配总的I/O负载。
关于磁盘的监控应该重点考虑以下几方面的内容: 第一:查找当前最活跃的文件、文件系统和逻辑卷 a)“热”文件系统是定位在一个物理驱动器上还是分散在多个物理驱动器上; b)调页空间是否支配磁盘应用? c)是否有足够的内存来高速缓存那些由正在运行进程使用的文件页面? d)应用程序是否执行许多同步(非高速缓存)的文件I/O? 第二:查看使用率最高的物理卷 第三:测试磁盘读写时间 一般的在对磁盘配置或调整参数做出重要改动之前,需要先对当前的配置和性能进行监控,得到一条评估的基线数据。 在系统处于工作负载高峰时期或者运行一个关键应用程序时,可以使用带间隔时间参数的iostat命令来开始评估。 iostat53报告如图所示。
注意:如果在Linux未发现该命令,那么需要先安装sysstat包安装命令为rpm–ivhsysstat-7.0.2-3.el5.i386sysstat包中包括iostat、mpstat、sar和sa四个工具。
关于CPU统计信息列(%usr、%sys、%idle和%iowait)提供了CPU使用的情况,该信息也在vmstat命令输出信息中存在,其对应的列名为us、sy、id和wa。在运行一个应用程序的系统上,I/O等待时间的高百分比可能与工作负载有关,在具有很多进程的系统上,一些可能在运行,而另一些可能在等待I/O,在这种情况下,%iowait可能很小或者为零,因为正在运行的进程“隐藏”了一些等待时间,但是%iowait并不代表磁盘可能不存在瓶颈。如果iostat命令表明CPU受限的情况不存在,并且%iowait时间大于20%,则可能出现I/O或磁盘受限情况,这一情况可能在缺少实内存的情况下由过多调页产生,也可能是由于不平衡的磁盘负载、碎片数据或应用模式而产生,对一个不平衡负载来说,同样的iostat报告提供了必要的信息,但是有关文件系统或逻辑卷,即逻辑资源来说,必须有使用诸如filemon或fileplace工具来获取信息。 如果需要指定磁盘名称,可以使用-d选项。
例如:iostat–dsda1,报告如图所示。
-tps表示每秒钟物理磁盘传送的次数,一次传送是从设备驱动程序到物理磁盘的一次I/O处理请求,多重逻辑请求可以组合成单一的磁盘I/O请求,传送的大小是不确定的。-Blk_read/s显示在测量间隔中每秒钟从物理卷中读取的数据量(以KB/s为单位)。-Blk_wrtn/s显示在测量间隔中每秒写入物理卷的数据量(以KB/s为单位)。-Blk_read显示在测量间隔中总的从物理卷中读取的数据量(以KB为单位)。-Blk_wrtn显示在测量间隔中总的写入物理卷的数据量(以KB为单位)。
使用vmstat命令也可以监控磁盘的性能,关于vmstat命令的使用在cpu章节中进行了详细的介绍,这里就不详细介绍了,关于vmstat命令输入报告中需要重点关注in列的内容,in列的内容表示评估间隔中(每秒)发生的硬件或设备中断的次数,中断的示例为磁盘请求完成和10毫秒的时钟中断,即一秒钟发生100次中断。sar命令是用来收集关于系统的统计数据的标准UNIX命令,通过该命的-d选项,可以详细的查看磁盘I/O的统计信息。例如sar –d 3 3的报告如图所示。
%busy服务传送请求时,时间设备繁忙程度。avque那段时间内所有从适配器到设备的未完成请求的平均数,可能有附加的I/O操作在设置驱动程序队列中,如果存在瓶颈,这个数字将是一个很好的指示符。r+w/s进出设备的读/写传送次数,这同iostat命令中的tps列内容一致。blks/s以512字节为单位传送的字节数。Avwait事物等候服务的平均次数(队列长度),传送请求在队列中空等候的平均时间(以毫秒为单位)。avserv平均每次搜索的毫秒数,设备服务每次传送请求的平均时间(包括搜索时间、转动等待时间和数据传送时间)(以毫秒为单位)。如果需要测试磁盘写能力,使用以下命令time dd if=/dev/zero of=/test.dbfbs=8k count=300000因为/dev/zero是一个伪设备,它只产生空字符流,对它不会产生I/O,所以I/O都会集中在of文件中,of文件只用于写,所以这个命令相当于测试磁盘的写能力。其中300000表示写的次数。
如果需要测试磁盘读能力,使用以下命令time ddif=/dev/sda1 of=/dev/null bs=8kcount=300000因为/dev/sda1是一个物理分区,对它的读取会产生I/O,/dev/null是伪设备,相当于黑洞,of到该设备不会产生I/O,所以,这个命令的I/O只发生在/dev/sdb1上,也相当于测试磁盘的读能力。其中300000表示读的次数。
如果需要测试磁盘同时读写能力,使用以下命令time dd if=/dev/sda1 of=/test1.dbf bs=8kcount=300000这个命令下,一个是物理分区一个是实际的文件,对它们的读写都会产生I/O(对/dev/sda1是读,对/test1.dbf是写),假设他们都在一个磁盘中,这个命令就相当于测试磁盘的同时读写能力。其中300000表示读的次数。
一般来说,高的%iowait表明系统存在一个应用程序问题、缺少内存问题或低效的I/O子系统配置,例如,应用程序的问题可能是由于许多I/O请求,而不是处理许多数据。理解I/O瓶颈并且要清楚解决瓶颈问题的关键在于提高I/O子系统的效率。磁盘的灵敏度可以以下几种方式出现,并具有不同的解决方法,一些典型的解决方案如下:
-
限制在特定的物理磁盘上活动逻辑卷和文件系统的数目,该方法是为了在所有的物理磁盘驱动器中平衡文件I/O;
-
在多个物理磁盘间展开逻辑卷,该方法在当有一些不同的文件被存取时特别有用;
-
为一个卷组创建多个Journaled文件系统(JFS)日志并且把它们分配到特定的文件系统中(最好在快速写高速缓存驱动器中),这对应用程序创建、删除或者修改大量文件特别是临时文件来说十分有用;
-
如果iostat命令的输出结果表明负载的I/O活动没有被均衡地分配到系统磁盘驱动器中,并且一个或多个磁盘驱动器的使用率经常在70-80之间或更高,就得考虑重组文件系统,例如备份和恢复文件系统以便减少碎片,碎片将引起驱动器过多地搜索并且可能产生大部分响应时间过长;
-
如果有迹象表明一小部分文件被一次又一次地读取,可以考虑附加的实存是否允许那些文件更加有效地缓存;
-
如果负载的存取模式是随机占主导地位,可以考虑增加磁盘并把将那些随机存取的文件分布到更多更好多的磁盘中;
-
如果负载的存取模式是顺序占主导地位并且涉及多个磁盘驱动器,可以考虑增加一个或多个磁盘适配器,也可以适当地考虑构建一个条带状逻辑卷来适应大型并且性能关键的顺序文件;
-
使用快速写高速缓存设备;
-
使用异步I/O;