网站运维技术与实践之测试评估
在一个网站应用系统的完整生命周期中,上线之前还有漫长的开发和测试阶段。作为系统未来的管理者和负责人,运维人员有必要在这个阶段就参与进来,根据业务的预期,完成系统层面的容量和压力测试,根据测试数据做出切实的运维规划,包括采购清单、结构设计、预警阈值和应急预案等。
可以说,监控,是防止“千里之堤,溃于蚁穴”;测试,是“万丈高楼第一层”。
一、服务器性能测试
和监控一样,测试工作也分为服务器和应用两大部分。可以说,所有监控需要关心的数据,都对应地需要提前进行测试,这里不再举例。下面介绍一些常用的测试工具,功能也许会有重叠,但都会有自己侧重的有特色的地方。掌握好工具最锋利的部分,灵活运用,就可以构建出最适合自己的测试工具箱了。
1.IOzone
文件读写性能包括两个层面,一方面是纯粹的磁盘读写能力。这方面本书之前章节已有介绍,我们可以通过硬件设备的数据进行估算;另一方面是文件系统的读写能力。在这方面,各种文件系统的实现细节毫厘千里,一般运维人员很难也没有必要花费大量时间来逐一研读代码。通过尽可能贴近场景的模拟测试,来获取足以支持选择某个文件系统理由的数据,成为最方便快捷的办法。
IOzone可以使用系统调用,通过模拟在文件系统层面的各种读写操作,来统计系统的文件I/O性能。比较贴心的是,IOzone还能自动把测试结果通过gnuplot绘制成三维图形,使得使用者可以更直观地了解I/O情况。IOzone官网地址:http://www.iozone.org/
IOzone目前支持13种I/O类型的测试,可以根据业务情况采用多个"-I"参数来指定,具体参数值和类型如下:
(1)write/re-write
写新文件和重写一个已存在文件,差别在于重写文件不需要创建文件元信息。
(2)read/re-read
读文件和重读文件,差别在于操作系统的缓存。
(3)random-read/write
随机读写。主要受操作系统缓存大小、磁盘数据和RAID级别、磁盘转速等因素影响。
(4)Read-backwards
逆序读文件。某些操作系统对上TB大小的文件读写做的不太好,所以出现这个测试。
(5)Re-write-record
对文件的一个特定点进行重写测试。当这个特定点的大小分布介于CPU缓存、TLB、操作系统缓存的不同区间时,性能会大大不同。
(6)stride-read
跳跃式读取文件。比如从文件起始位置连续读取4KB内容,然后seek到200KB之后,再读取4KB长度,接着又seek,以此类推。这个行为用来模拟某些应用的特定数据结构操作。
(7)fwrite/re-fwrite
使用fwrite库测试。fwrite会利用用户空间的buffer,所以当应用在写比较小的内容时,fwrite会进行阻塞合并操作,然后每次以较大的内容进行一次真正的写操作以提高性能。
(8)fread/re-fread
使用fread库测试,特点和fwrite一致。
(9)random mix
混合随机读写。这个测试只用于吞吐量测试。每个线程都可以执行读或者写,具体如何执行则由round-robin轮询决定。
(10)pwrite/re-pwrite
在文件的指定偏移量处开始写和重写。之前的测试都是从起始位置开始的。
(11)pread/re-pread
在文件的指定偏移量处开始读和重读。
(12)pwritev/re-pwritev
与pwrite类似,不过是从多个buffer中写出数据。
(13)preadv/re-preadv
和pread类似,不过是读取到多个buffer中。
关于IOzone的安装和使用,我觉得可以参考这个教程:https://blog.csdn.net/u012528029/article/details/51002950
2.Netperf
衡量网络性能主要有五项指标,包括:可用性、响应时间、网络利用率、网络吞吐量和网络带宽容量。而获取这些的指标方式,也有三种:
其一,通过Net-SNMP工具从网络设备中读取数据;
其二,通过TCPDump工具抓取网络报文分析;
其三,通过模拟测试获取数据。
最常见的模拟测试工具,就是Netperf。Netperf工具以client/server方式工作。server端是netserver,用来侦听来自client端的连接;client是netperf,用来向server发起网络测试。在client和server之间,首先要建立一个控制连接,传递有关测试配置的信息,以及测试的结果。在控制连接建立并传递测试配置信息以后,client和server之间会再建立一个测试连接,用来来回传递这特殊的流量模式,以测试网络的性能。
官网地址:http://www.netperf.org/
(1)测试流量模式介绍
Netperf主要测试的是基于TCP或UDP的传输,针对两种协议分别有不同的流量模式。Netperf测试结果所反映的是一个系统能够以多块的速度向另外一个系统发送数据,以及另外一个系统能够以多块的速度接收数据。
TCP协议能够提供端对端的可靠传输,其建立并维护连接、控制数据有序地传递等都会消耗一定的网络带宽。所以TCP测试会比较考虑带宽和效率的问题。Netperf可以模拟三种不同的TCP流量模式。
a.单个TCP连接,批量传输大量数据。
b.单个TCP连接,Client少量请求/Server大量响应的交易模式。
c.多个TCP连接,每个连接中一对请求/响应的交易模式。
UDP协议没有建立连接的负担,但是却不能保证传输的可靠性,使用UDP的应用程序需要自行跟踪每个发出的分组,并重发丢失的分组。所以UDP测试会比较关注丢包率的问题。Netperf可以模拟两种UDP的流量模式。
a.从client到server的单向批量传输。
b.请求/响应的交易模式。
注意:由于UDP传输的不可靠性,在使用Netperf时要确保发送的缓冲区大小不能大于接收缓冲区大小,否则数据会丢失,Netperf测试结论丢包率会变得比实际大很多。
3.pktgen
pktgen工具,主要用来测试服务器本身在网卡方面的性能,考量服务器本身对包的处理能力-这也是上层协议和应用的性能基础。事实上在全面测试中,通过dstat命令可以发现,HTTP服务极限场景的收发包速度,和pktgen测试的结果是接近的。
pktgen是一个Linux内核模块,通过CONFIG_NET_PKTGEN开关来控制编译即可。pktgen运行的时候,会自动在设备的每个CPU上都绑定运行一个线程,同时在procfs伪文件系统上生成状态文件和控制文件。包括以下三种:
(1)/proc/net/pktgen/pgctrl
(2)/proc/net/pktgen/kpktgend_0
(3)/proc/net/pktgen/eth*
pktgen的所有配置和命令都是通过想procfs输入指令来完成。
4.sysbench
sysbench是为数据库应用准备的系统测试工具,也就是说,影响数据库性能的系统组件,包括CPU、内存、文件系统、进程调度和线程等,sysbench都可以对其进行测试。
项目地址:https://sourceforge.net/
(1)CPU性能测试
CPU测试主要测试的是计算能力,具体来说就是做质数的加法运算。命令如下:
sysbench --test=cpu --cpu-max-prime=20000 run
(2)文件I/O性能测试
前面说到过IOzone测试文件I/O。其实sysbench测试的要点大同小异,只是测试的I/O类型没有那么多。sysbench支持的I/O测试类型包括:seqwr(顺序写)、seqrewri(顺序重写)、seqrd(顺序读)、rndrd(随机读)、rndwr(随机写)和rndrw(随机读写)等六种。
此外,在随机读写测试模式下,还可以指定读写操作和写操作的百分比。测试需要先预设好指定大小文件。
(3)内存测试
内存测试中也可以指定顺序或者随机读写模式,不过这里最重要的是,指定的内存传输大小不能超过设备的实际内存大小!默认值为100GB,显然是大于一般设备的内存总量的。
(4)数据库测试
sysbench中的oltp测试支持MySQL、Oracle和PostgreSQL三种数据库,都需要在编译的时候指定库文件,然后在测试时通过"--db-driver"参数指定。如果编译的时候只支持一种数据库,那么可以忽略这个参数。
otp测试参数分为两部分:一部分是oltp相关参数,用于规划最终形成的数据库测试表的数据。最简单的就是表的大小,这个默认值是10000条记录。另一部分是db-driver相关参数,用来完成数据库连接,比如IP地址和端口、用户名密码,数据库是MySQL的话还有特有的存储引擎设定。MySQL数据库性能基准测试工具还有很多,比如MySQL自带的mysqlslap和Perl编写的MyBench、Super-Smack等。Sysbench自动支持了事务处理测试,还是比较方便的。
二、应用性能测试
网站应用除了数据库之外,另一个重要部分就是HTTP服务。尤其是大规模扩展的情况下,应用组件之间也大多采用HTTP接口相互调用,HTTP服务性能测试就更加重要。这里介绍三个各有优势的HTTP性能测试工具。
1.http_load
http_load是一个极为简单的小工具,它只利用单核单进程完成测试,可以很放心地在服务器上使用。使用方面,在总结过运维最常见的需求后,http_load只提供两对测试参数来随机测试一组URL列表。在一些需要快速定位的场合中,非常实用。
官网地址:http://www.acme.com/software/http_load/
使用详解:https://www.cnblogs.com/shijingjing07/p/6539179.html
2.AB(ApacheBench)
AB是Apache httpd项目自带的测试工具。也是大多数运维人员最熟悉和最早接触的HTTP服务性能测试工具。
AB对HTTP协议的支持比较全面,包括HEAD、GET、POST和PUT四种请求方式,以及自定义TCP收发缓冲的大小,自定义RequestHeader和Cookie,支持KeepAlive特性、HTTPS协议和WWW-Authentication认证等。不过AB只支持单个URL和并发请求/总请求数的测试模式(相对于http_load的-p/-f模式)。
AB的安装和使用参考:https://www.cnblogs.com/Ryana/p/6279232.html
AB的使用详解:https://www.cnblogs.com/xiaoyaowuming/p/5622660.html
3.weighttp
weighttp和AB类似,它是另一款著名开源HTTP服务器Lighttpd项目下的性能测试工具。官网地址:http://redmine.lighttpd.net/projects/weighttp/wiki
weighttp目前的测试模式将很少。但作为年龄比较小的项目,weighttp也有自己的特点-它底层使用libev库。libev是一个性能比著名的libevent还要好一些的网络事件驱动库。所以weighttp本身的性能也很不错。
安装和使用:https://blog.csdn.net/yang382197207/article/details/19190089?locationNum=2&fps=1
三、分布式测试环境
1.AutoBench
AutoBench是一个用Perl编写的基于Httperf开发的分布式测试系统。代码量不大,使用也很简单,我们可以从这个系统中学习如何构建一个分布式测试环境。
官网地址:http://www.xenoclast.org/autobench/
AutoBench安装和使用:https://www.cnblogs.com/Ryana/p/6279232.html
2.TCPCopy
TCPCopy的用途很广,常见的应用场景如下:
(1)分布式压力测试:利用在线数据,可以测试系统能够承受的压力大小,也可以提前发现一些bug。
(2)上线测试:可以发现新系统是否稳定,提前发现上线过程中会出现的诸多问题。
(3)对比测试:针对不同程序或相同程序的不同版本,使用相同的流量请求做性能对比。
(4)流量放大:可以利用多种手段构造无限在线压力,满足压力测试要求。
(5)利用TCPCopy转发传统压力测试工具发出的请求,可以增加网络延迟,使其压力测试更加真实。
(6)热备份
代码托管地址:https://github.com/wangbin579/tcpcopy
TCPCopy安装和使用:https://www.cnblogs.com/phennry/p/6382755.html?utm_source=itdadao&utm_medium=referral