翻译:飞哥 (http://hi.baidu.com/imlidapeng)
版权所有,尊重他人劳动成果,转载时请注明作者和原始出处及本声明。
原文名称:《Linux Performance and Tuning Guidelines》
在本章节中我们将讨论几个主要的基准工具。要度量性能使用优秀的基准工具是必要的。这里有一些优秀的工具,它们拥有全部或部分下面的功能:
- Load generation
- 监控性能
- 监控系统使用情况
- 报告
基准只不过是某个特定工作负载的样本,它与系统运行的实际工作负载可能很接近也可能大相径庭。经管某系统自诩可以取得很好的Linpack成绩,但它仍可能不是一台理想的文件服务器。要牢记基准是不能模拟最终用户偶尔不可预知的反应。基准是不能告诉你当用户访问他们的数据或备份开始时文件服务器是怎样运作的。通常在系统中执行基准时要遵循以下规则。
- 使用服务器负载基准:服务器系统自诩拥有许多与桌面PC不同的特性,经管IBM System x平台分享了许多技术给桌面电脑。服务器基准可以生成多个线程使用系统SMP的能力来模拟现实中多用户环境。虽然PC开启Web浏览器的速度可能比高档服务器快,但服务器开启成千个Web浏览器的速度要比PC更快.
- 模拟预估的负载:所有的基准都有不同的选项,用于调整来满足系统预估未来的负载。如果应用不得不受制于硬盘的低相应,再强大的CPU都是没有的。
- 隔离基准系统:基准测试的系统首先要与其它负载尽可能的隔离。一个运行top命令的开放会话会对基准结果产生很大干扰。
- 平均结果:尽管你尝试隔离基准系统,在基准时仍可能会有未知因素影响系统效能。比较好的做法是运行基准至少三次取平均值,确保个别事件不会影响整个分析结果。
在下面的章节中,我们将基于这些原则来挑选工具。
-
工作在Linux之上:Linux为基准的目标
-
工作在所有的硬件平台之上:由于IBM就提出三种不同的硬件平台(假定IBM System p和IBM System i的硬件技术都是基于IBM POWER架构的),选择一个在所有架构上都很易用的基准是很重要的。
-
开源:Linux可运行在多个平台之上,所以如果没有源代码,二进制代码可能也无法使用。
-
完整的文档:要执行基准就必须要熟悉工具。文档可以帮助你熟悉工具。它也可以在你决定使用某个工具前,通过浏览概念、设计和详细内容,帮助评估工具是否符合你的要求,
-
维护活跃:陈旧被放弃的工具可能没有遵循最近的规范和技术。很可能产生错误的结果。
-
使用广泛:对于使用广泛的工具,你能找到更多的相关信息。
-
易用:你一定希望工具容易使用。
-
报表能力:报表能力能大大减少性能分析的工作
LMbench是一套微基准,可以用来分析不同操作系统的设定,如启用SELinux与未启用SELinux的系统。包括LMbench在内的基准可以度量多种操作系统的例行程序,如上下文转换、本地通讯、内存带宽和文件操作。LMbench使用很简单,只需要知道三个重要的命令。
-
make results:首次运行LMbench时,它会提示系统配置的一些详细信息和哪些测试会被执行。
-
make rerun:在初始化配置并完成首次运行基准后,使用make rerun命令可以重复基准使用配置由make results提供的。
-
make see:最后在运行最少三次后,可以使用make see命令查看结果。显示的结果可以被复制到制表软件用于后续分析或图形化展示。
可以在 http://sourceforge.net/projects/lmbench/ 找到LMbench
IOzone是一个文件系统的基准程序,可以用来模拟多种不同的硬盘访问模式。IOzone的配置非常丰富,所以可以比较准确的模拟特定负载。通过使用不同的块大小,IOzone可以写一个或多个不同大小的文件。
IOzone提供一个功能非常强大且自动化的基准测试模式,可以高效地定义负载属性如文件大小、I/O大小和访问模式。如果要评估满足数据库负载的文件系统,需要在IOzone创建一个随机访问模式大块的大文件代替顺序访问小块的大文件。IOzone的重要选项有:
-b <output.xls>
告诉IOzone将结果存储为微软Excel兼容的格式。
-C
显示每个子进程输出内容(可以用来检查所有子进程是否真正同时运行)
-f
用来告诉IOzone数据存储的位置。
-i
这个选项用来定义运行哪些测试。首次运行你不得不定义-i 0来生成测试文件。常用的测试有-i 1用于顺序读取、-i 2用于随机读写访问和-i 8用于混合随机访问。
-h
显示帮助
-r
告诉IOzone测试的记录I/O大小。记录大小要尽可能的接近目标负载。
-k <number of async I/Os>
使用2.6内核的异步I/O属性,这个经常用在数据库中,如IBM DB2。
-m
如果目标应用程序使用多个内部buffer,可以使用-m来模拟这种行为。
-s
指定基准测试的文件大小。对于异步文件系统(大多数文件系统的默认挂载选项)IOzone应使用至少两倍于系统内存的文件大小,以便能真实的度量硬盘的性能。也可以使用MB或GB指定大小,只要直接在文件大小后使用m或g即可。
-+u
在测试过程中,用于度量处理器使用情况的开关。
注释:任何基准使用的文件如果合适系统的内存并存储在异步的文件系统中,所测量的将是内存吞度量而不是硬盘子系统的性能。所以你应该使用sync选项挂载文件系统或使用大小为系统内存两倍的文件。
使用IOzone测量特定硬盘子系统随机读取的性能,测试文件存储在/perf,文件大小为10GB,I/O大小为32KB(这些特性模仿一个简单的数据库)。如下:
最后,将获得的结果导入到你的制表软件中并转换成图表。使用图形化的输出可以让分析大量数据和确定趋势变得更容易。例子2-16的输出结果图形化显示如图2-17。
图2-17:例子2-26结的图形化结果
如果IOzone所使用文件大小与系统内存或cache相当,可以获得关于cache和内存吞吐量的数据。应该注意的是由于文件系统开销IOzone只能报告系统带宽的70-80%
你可以在http://www.iozone.org/找到IOzone。
netperf是一个专注于TCP/IP网络性能的基准工具。它支持UNIX domain socket和SCTP基准测试。
netperf是基于客户端-服务器模型。netserver运行在目标系统而netperf运行在客户端。netperf控制netserver并传送配置信息到netserver,产生网络通讯,通过一个控制链接从netserver得到结果,这个控制链接与实际的基准链接是分开的。在基准测试过程中,控制链接是不会产生任何流量的,所以不会对结果产生任何影响。netperf也具有报表功能包括CPU使用情况报表。本文在写作时稳定版本为2.4.3。
netperf可以产生几种类型的网络流量。大体上可以将它们分为两类:批量数据传输和请求/响应。你应该注意到netperf每次只能使用一个套接字。下个版本的netperf(netperf4)将全面支持并发会话的基准测试。此时我们可以执行多个会话的基准测试,正如下面所描述的。
- 批量数据传输
批量数据传输为网络基准测试中最为常用的量度指标。通过一秒钟传输的数据总量来测量批量数据传输。它模拟大文件的传输,如多媒体流和FTP数据传输。
- 请求/响应类型
这模拟了请求/响应类型的网络流量,测量每一秒钟交易的次数。对于在线交易应用程序请求/响应流量类型是典型的,如web服务器、数据库服务器、邮件服务器、文件服务器(管理小文件或中等文件)和目录服务器。在实际的环境中,同数据交换一样会话的建立和终结也会被执行。要模拟这个,需要采用TCP_CRR类型。
- 并发会话
netperf当前稳定版是不支持并发多会话的基准测试,但我们可以通过同时产生多了netperf实例来执行多个基准测试,如下:
我们来了解一些常用选项。
全局选项:
-A 变更远端系统发送和接收buffer alignment
-b Burst of packet in stream test
-H 远端主机
-t 测试的流量类型
TCP_STREAM 批量数据传输基准 TCP_MAERTS 与TCP_STREAM相似,除了流的方向相反。 TCP_SENDFILE 与TCP_STREAM相似,除了使用sendfile()代替send(),这导致零复制操作。 UDP_STREAM 与TCP_STREAM相似,除了使用UDP。 TCP_RR 请求/相应类型流量基准。 TCP_CC TCP连接/关闭基准。没有请求和响应包被交换。 TCP_CRR 执行连接/请求/相应/关闭操作。 与禁用HTTP keepalive的HTTP1.0/1.1会话相似。 UDP_RR 与TCP_RR相同除了使用UDP。
-l 基准测试长度。如果是正数,netperf将执行基准测试testlen秒钟。如果是负数,对于批量数据传输基准测试,会交换testlen字节数据或对于请求/响应类型,会完成testlen个交易。
-c 本地CPU使用率报告
-C 远端CPU使用率报告
注释:CPU使用率报告在一些平台上可能不是很准确。请在你执行基准测试前确认其准确性。
-I 这个选项用来确保结果的可信度。可信度级别应为99或95(百分比)和区间(百分比)可以设定。要保证结果达到特定的可信度级别,netperf会重复执行多次相同的基准测试。例如-I 99,5意味结果接近99%的真实结果区间在5%(+-2.5%)以内。
-i 测试循环次数的最大和最小值。此选项能限制循环的次数。-i 10,3意味着netperf执行相同的基准测试至少3次最多10次。如果循环超过最大值,结果将不能达到-I选项定义的可信度级别,在结果中将显示一个警告。
-s ,-S 改变本地和远端系统发送和接收buffer大小。这将影响窗口大小。
用于TCP_STREAM, TCP_MAERTS, TCP_SENDFILE, UDP_STREAM的选项
-m , -M 指定send(),recv()函数buffer的大小,控制每次呼叫发送和接收的大小。
用于TCP_RR, TCP_CC, TCP_CRR, UDP_RR的选项
-r , -R 指定请求和响应的大小。例如,-r 128,8129意味着netperf发送128字节数据包给netserver,然后netserver发送8129字节数据包回netperf。
下面为netperf的TCP_CRR类型基准的输出示例。
例子2-27:TCP_CRR基准结果示例
当你执行基准测试时,使用netperf自带的例子测试脚本是非常聪明做法。变更脚本中变量,你可以得到想要的基准测试。这些脚本存储在netperf包doc/examples/目录下。
关于更多详细内容,参见http://www.netperf.org/
还有一些有用的基准工具。你必须要熟悉这些基准工具的特性,以便选择到符合你需求的工具。
表2-3:其它基准测试工具