0
点赞
收藏
分享

微信扫一扫

性能测试方法总结

书呆鱼 2021-09-28 阅读 98
技术文章

概述

作为运维人员,当环境搭建完成后,要做的就是性能测试,检测环境等整体性能是否满足需求,符合标准。因此我这里总结了一些关于性能方面的测试方法。

CPU测试

1. 通过编译内核来进行测试

make -j 4

2. 使用superPI来进行测试

Super PI是利用CPU的浮点运算能力来计算出π(圆周率),所以目前普遍被超频玩家用做测试系统稳定性和测试CPU计算完后特定位数圆周率所需的时间。
官网:http://www.super-computing.org/
下载页:http://superpi.ilbello.com/

#因为superpi是32位的,要是在64位系统中运行需要安装32位库
sudo apt-get install lib32stdc++6 
tar -xzvf super_pi.tgz
./super_pi 20 #20为位数。表示要算2的多少次方位,如通常要算小数点后1M位(2^20)
#注意:最大到25次方,若设置再大的值,会自动缩小到该值

下面是执行的结果截图,我这里为了方便,位数设定为10


内存测试

memtester工具

  1. 下载:http://pyropus.ca/software/memtester/
  2. 安装
tar zxf memtester-4.3.0.tar.gz
cd memtester-4.3.0/
make && make install

注:安装时遇到下面的错误:

gzip -c memtester.8 >memtester.8.gz ; install -m 644 memtester.8.gz /usr/local/man/man8/
install: target ‘/usr/local/man/man8/’ is not a directory: No such file or directory

解决方法是创建该目录:

mkdir /usr/local/man/man8/
  1. 参数设置
Usage: memtester [-p physaddrbase [-d device]] <mem>[B|K|M|G] [loops]

MEMORY 申请测试内存的数量,单位默认是megabytes(兆),也可以是B K M G。
ITERATIONS 测试的次数,默认是无限

  1. 测试


IO测试

1. 利用dd来进行测试:

time dd if=/dev/zero of=test bs=1M count=4096 

用top和iostat查看wa%及写硬盘速度

2. 使用fio命令进行测试:

FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎,
包括:sync,mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio 等等。

说明: 
filename=/dev/sdb1 测试文件名称,通常选择需要测试的盘的data目录。 
direct=1 测试过程绕过机器自带的buffer。使测试结果更真实。 
rw=randwrite 测试随机写的I/O 
rw=randrw 测试随机写和读的I/O 
bs=16k 单次io的块文件大小为16k 
bsrange=512-2048 同上,提定数据块的大小范围 
size=5g 本次的测试文件大小为5g,以每次4k的io进行测试。 
numjobs=30 本次的测试线程为30. 
runtime=1000 测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止。 
ioengine=psync io引擎使用pync方式 
rwmixwrite=30 在混合读写的模式下,写占30% 
group_reporting 关于显示结果的,汇总每个进程的信息。 
此外 
lockmem=1g 只使用1g内存进行测试。 
zero_buffers 用0初始化系统buffer。 
nrfiles=8 每个进程生成文件的数量。
  1. 例子
    8k随机写:
fio -name cap_8K_rand_write -runtime=3000 -size=5G -filename=/dev/drbd0 -ioengine libaio -direct=1 -bs=8K -iodepth 16 -rw=randwrite -time_based

8k随机读:

fio -name cap_8K_rand_read -runtime=3000 -size=5G -filename=/dev/drbd0 -ioengine libaio -direct=1 -bs=8K -iodepth 16 -rw=randread -time_based

64k顺序写:

fio -name cap_64K__write -runtime=3000 -size=5G -filename=/dev/drbd0 -ioengine libaio -direct=1 -bs=64K -iodepth 16 -rw=write -time_based

64k顺序读:

fio -name cap_64K_read -runtime=3000 -size=5G -filename=/dev/drbd0 -ioengine libaio -direct=1 -bs=64K -iodepth 16 -rw=read -time_based

4k80%随机读写:

fio -name cap_4K_80_rand_read -runtime=3000 -size=5G -filename=/dev/drbd0  -ioengine libaio -direct=1 -bs=4K    -iodepth 16 -rw=randrw -rwmixread=80 -time_based

3. iozone测试

IOZONE主要用来测试操作系统文件系统性能的测试工具。使用iozone可以在多线程、多cpu,并指定cpu cache空间大小以及同步或异步I/O读写模式的情况下进行测试文件操作性能

官方:http://www.iozone.org/
下载安装:

wget http://www.iozone.org/src/current/iozone3_482.tar
tar -xvf iozone3_429.tar
cd iozone3_429/src/current
make
make linux-ia64

该工具所测试的范围主要有,write , Re-write, Read, Re-Read, Random Read, Random Write, Random Mix, Backwards Read, Record Rewrite, Strided Read, Fwrite, Frewrite, Fread, Freread, Mmap, Async I/O

  • Write: 测试向一个新文件写入的性能。当一个新文件被写入时,不仅仅是那些文件中的数据需要被存储,还包括那些用于定位数据存储在存储介质的具体位置的额外信息。这些额外信息被称作“元数据”。它包括目录信息,所分配的空间和一些与该文件有关但又并非该文件所含数据的其他数据。拜这些额外信息所赐,Write的性能通常会比Re-write的性能低。
  • Re-write: 测试向一个已存在的文件写入的性能。当一个已存在的文件被写入时,所需工作量较少,因为此时元数据已经存在。Re-write的性能通常比Write的性能高。
  • Read: 测试读一个已存在的文件的性能。
  • Re-Read: 测试读一个最 近读过的文件的性能。Re-Read性能会高些,因为操作系统通常会缓存最 近读过的文件数据。这个缓存可以被用于读以提高性能。
  • Random Read: 测试读一个文件中的随机偏移量的性能。许多因素都可能影响这种情况下的系统性能,例如:操作系统缓存的大小,磁盘数量,寻道延迟和其他。
  • Random Write: 测试写一个文件中的随机偏移量的性能。同样,有许多因素可能影响这种情况下的系统性能,例如:操作系统缓存的大小,磁盘数量,寻道延迟和其他。
  • Random Mix: 测试读写一个文件中的随机偏移量的性能。许多因素可能影响这种情况下的系统性能运作,例如:操作系统缓存的大小,磁盘数量,寻道延迟和其他。这个测试只有在吞吐量测试模式下才能进行。每个线程/进程运行读或写测试。这种分布式读/写测试是基于round robin 模式的。最好使用多于一个线程/进程执行此测试。
  • Backwards Read: 测试使用倒序读一个文件的性能。这种读文件方法可能看起来很可笑,事实上,有些应用确实这么干。MSC Nastran是一个使用倒序读文件的应用程序的一个例子。它所读的文件都十分大(大小从G级别到T级别)。尽管许多操作系统使用一些特殊实现来优化顺序读文件的速度,很少有操作系统注意到并增强倒序读文件的性能。
  • Record Rewrite: 测试写与覆盖写一个文件中的特定块的性能。这个块可能会发生一些很有趣的事。如果这个块足够小(比CPU数据缓存小),测出来的性能将会非常高。如果比CPU数据缓存大而比TLB小,测出来的是另一个阶段的性能。如果比此二者都大,但比操作系统缓存小,得到的性能又是一个阶段。若大到超过操作系统缓存,又是另一番结果。
  • Strided Read: 测试跳跃读一个文件的性能。举例如下:在0偏移量处读4Kbytes,然后间隔200Kbytes,读4Kbytes,再间隔200Kbytes,如此反复。此时的模式是读4Kbytes,间隔200Kbytes并重复这个模式。这又是一个典型的应用行为,文件中使用了数据结构并且访问这个数据结构的特定区域的应用程序常常这样做。
    许多操作系统并没注意到这种行为或者针对这种类型的访问做一些优化。同样,这种访问行为也可能导致一些有趣的性能异常。一个例子是在一个数据片化的文件系统里,应用程序的跳跃导致某一个特定的磁盘成为性能瓶颈。
  • Fwrite: 测试调用库函数fwrite()来写文件的性能。这是一个执行缓存与阻塞写操作的库例程。缓存在用户空间之内。如果一个应用程序想要写很小的传输块,fwrite()函数中的缓存与阻塞I/O功能能通过减少实际操作系统调用并在操作系统调用时增加传输块的大小来增强应用程序的性能。
    这个测试是写一个新文件,所以元数据的写入也是要的。
  • Frewrite:测试调用库函数fwrite()来写文件的性能。这也是一个执行缓存与阻塞写操作的库例程。是缓存在用户空间之内。如果一个应用程序想要写很小的传输块,fwrite()函数中的缓存与阻塞I/O功能可以通过减少实际操作系统调用并在操作系统调用时增加传输块的大小来增强应用程序的性能。
    这个测试是写入一个已存在的文件,由于无元数据操作,测试的性能会高些。
  • Fread:测试调用库函数fread()来读文件的性能。这是一个执行缓存与阻塞读操作的库例程。缓存在用户空间之内。如果一个应用程序想要读很小的传输块,fwrite()函数中的缓存与阻塞I/O功能能通过减少实际操作系统调用并在操作系统调用时增加传输块的大小从而增强应用程序的性能。
    几个特殊测试:
  • Mmap:许多操作系统支持mmap()的使用来映射一个文件到用户地址空间。映射之后,对内存的读写将同步到文件中去。这对一些希望将文件当作内存块来使用的应用程序来说很方便。一个例子是内存中的一块将同时作为一个文件保存在于文件系统中。

参数:

-a 用来使用全自动模式。生成包括所有测试操作的报告,使用的块 大小从4k到16M,文件大小从64k到512M
-R 产生execl格式的输出日志。
-b 将产生二进制的execl的日志文件名。
-s 测试的文件大小。
-q 指定最大文件块大小(这里的 -q 64k 包括了4K,8K,16K,32K,64K)
-r 指测试的文件块大小(与-q有别,-r 64k只进行64k的测试)
-a 在希望的文件系统上测试,不过只有-a的话会进行全面测试,要花费很长时间,最好用-i指定测试范围。
-g 指定最大测试文件大小。
-n 指定最小测试文件大小。
-f 指定测试文件的名字,完成后会自动删除(这个文件必须指定在你要测试的那个硬盘中)
-C 显示每个节点的吞吐量。
-c 测试包括文件的关闭时间
-t 指定线程数
-D 对mmap文件使用msync(MS_ASYNC) 。这告诉操作系统在mmap空间的所有数据需要被异步地写到磁盘上。
-G 对mmap文件使用msync(MS_SYNC)。这告诉操作系统在mmap空间的所有数据需要被同步地写到磁盘上。

针对文件系统的测试可以按一下几项执行操作:

iozone -a -n 512m -g 4g -i 0 -i 1 -i 5 -f /mnt/iozone -Rb ./iozone.xls

进行全面测试.最小测试文件为512M直到测试到4G.测试read,write,和Strided Read.测试的地方在mnt下。生成Excel的文件

1.多线程下的同步I/O读写测试

分别针对128K,16M,256M,2G文件大小和8进程,64进程,128进程数进行测试

主要测试文件写和重复写、读和重复读、随即读写、后向读、文件内随即点写、大间隔文件点读、文件内的随即点读写等测试项,记录大小1M cpu cache 2048kbyte。

1.1 128k 文件性能测试:

测试命令为:

iozone -s 128k -i 0 -i 1 -i 2 -i 3 -i 4 -i 5 -i 8 -t 8 -G -o -B -Rb iozone.xls
iozone -s 128k -i 0 -i 1 -i 2 -i 3 -i 4 -i 5 -i 8 -t 64 -G -o -B -Rb iozone.xls
iozone -s 128k -i 0 -i 1 -i 2 -i 3 -i 4 -i 5 -i 8 -t 128 -G -o -B -Rb iozone.xls

1.2 16M文件性能测试

测试命令为:

iozone -s 16M -i 0 -i 1 -i 2 -i 3 -i 4 -i 5 -i 8 -t 8 -G -o -B -Rb iozone.xls
iozone -s 16M -i 0 -i 1 -i 2 -i 3 -i 4 -i 5 -i 8 -t 64 -G -o -B -Rb iozone.xls
iozone -s 16M -i 0 -i 1 -i 2 -i 3 -i 4 -i 5 -i 8 -t 128 -G -o -B -Rb iozone.xls

1.3 256M文件性能测试

测试命令为:

iozone -s 256M -i 0 -i 1 -i 2 -i 3 -i 4 -i 5 -i 8 -t 8 -G -o -B -Rb iozone.xls
iozone -s 256M -i 0 -i 1 -i 2 -i 3 -i 4 -i 5 -i 8 -t 64 -G -o -B -Rb iozone.xls
iozone -s 256M -i 0 -i 1 -i 2 -i 3 -i 4 -i 5 -i 8 -t 128 -G -o -B -Rb iozone.xls

1.4 2G文件性能测试

测试命令为:

iozone -s 2G -i 0 -i 1 -i 2 -i 3 -i 4 -i 5 -i 8 -t 8 -G -o -B -Rb iozone.xls
iozone -s 2G -i 0 -i 1 -i 2 -i 3 -i 4 -i 5 -i 8 -t 64  -G -o -B -Rb iozone.xls
iozone -s 2G -i 0 -i 1 -i 2 -i 3 -i 4 -i 5 -i 8 -t 128 -G -o -B -Rb iozone.xls

2. 多线程下的异步I/O读写测试

分别针对128K,16M,256M,2G文件大小和8进程,64进程,128进程数进行测试

主要测试文件写和重复写、读和重复读、随即读写、后向读、文件内随即点写、大间隔文件点读、文件内的随即点读写等测试项。

2.1 128k 文件性能测试:

测试命令为:

iozone -s 128k -i 0 -i 1 -i 2 -i 3 -i 4 -i 5 -i 8 -t 8 -D -o -B -Rb iozone.xls
iozone -s 128k -i 0 -i 1 -i 2 -i 3 -i 4 -i 5 -i 8 -t 64 -D -o -B -Rb iozone.xls
iozone -s 128k -i 0 -i 1 -i 2 -i 3 -i 4 -i 5 -i 8 -t 128 -D -o -B -Rb iozone.xls

2.2 16M文件性能测试
测试命令为:

iozone -s 16M -i 0 -i 1 -i 2 -i 3 -i 4 -i 5 -i 8 -t 8 -D -o -B -Rb iozone.xls
iozone -s 16M -i 0 -i 1 -i 2 -i 3 -i 4 -i 5 -i 8 -t 64 -D -o -B -Rb iozone.xls
iozone -s 16M -i 0 -i 1 -i 2 -i 3 -i 4 -i 5 -i 8 -t 128 -D -o -B -Rb iozone.xls

2.3 256M文件性能测试

测试命令为:

iozone -s 256M -i 0 -i 1 -i 2 -i 3 -i 4 -i 5 -i 8 -t 8 -D -o -B -Rb iozone.xls
iozone -s 256M -i 0 -i 1 -i 2 -i 3 -i 4 -i 5 -i 8 -t 64 -D -o -B -Rb iozone.xls
iozone -s 256M -i 0 -i 1 -i 2 -i 3 -i 4 -i 5 -i 8 -t 128 -D -o -B -Rb iozone.xls

2.4 2G文件性能测试

测试命令为:

iozone -s 2G -i 0 -i 1 -i 2 -i 3 -i 4 -i 5 -i 8 -t 8 -D -o -B -Rb iozone.xls
iozone -s 2G -i 0 -i 1 -i 2 -i 3 -i 4 -i 5 -i 8 -t 64 -D -o -B -Rb iozone.xls
iozone -s 2G -i 0 -i 1 -i 2 -i 3 -i 4 -i 5 -i 8 -t 128 -D -o -B -Rb iozone.xls

网络测试

Iperf 是一个网络性能测试工具。Iperf可以测试TCP和UDP带宽质量。Iperf可以测量最大TCP带宽,具有多种参数和UDP特性。Iperf可以报告带宽,延迟抖动和数据包丢失。

  1. Iperf使用方法与参数说明

参数说明:

-s 以server模式启动,eg:iperf -s
-c host以client模式启动,host是server端地址,eg:iperf -c 222.35.11.23
通用参数
-f [k|m|K|M] 分别表示以Kbits, Mbits, KBytes, MBytes显示报告,默认以Mbits为单位,eg:iperf -c 222.35.11.23 -f K
-i sec 以秒为单位显示报告间隔,eg:iperf -c 222.35.11.23 -i 2
-l 缓冲区大小,默认是8KB,eg:iperf -c 222.35.11.23 -l 16
-m 显示tcp最大mtu值
-o 将报告和错误信息输出到文件eg:iperf -c 222.35.11.23 -o c:\iperflog.txt
-p 指定服务器端使用的端口或客户端所连接的端口eg:iperf -s -p 9999;iperf -c 222.35.11.23 -p 9999
-u 使用udp协议
-w 指定TCP窗口大小,默认是8KB
-B 绑定一个主机地址或接口(当主机有多个地址或接口时使用该参数)
-C 兼容旧版本(当server端和client端版本不一样时使用)
-M 设定TCP数据包的最大mtu值
-N 设定TCP不延时
-V 传输ipv6数据包

server专用参数
-D 以服务方式运行ipserf,eg:iperf -s -D
-R 停止iperf服务,针对-D,eg:iperf -s -R

client端专用参数
-d 同时进行双向传输测试
-n 指定传输的字节数,eg:iperf -c 222.35.11.23 -n 100000
-r 单独进行双向传输测试
-t 测试时间,默认10秒,eg:iperf -c 222.35.11.23 -t 5
-F 指定需要传输的文件
-T 指定ttl值

apache ab 压力测试:

ab是Apache超文本传输协议(HTTP)的性能测试工具。 其设计意图是描绘当前所安装的Apache的执行性能, 主要是显示你安装的Apache每秒可以处理多少个请求

ab是Apache超文本传输协议(HTTP)的性能测试工具。 其设计意图是描绘当前所安装的Apache的执行性能, 主要是显示你安装的Apache每秒可以处理多少个请求。

  1. 安装
sudo apt-get install apache2-utils
  1. 用法:
ab [ -A auth-username ] [ -c concurrency ] [ -C cookie-name=value ] [ -d ] [ -e csv-file ] [ -g gnuplot-file ] [ -h ] [ -H custom-header ] [ -i ] [ -k ] [ -n requests ] [ -p POST-file ] [ -P proxy-auth-username ] [ -q ] [ -s ] [ -S ] [ -t timelimit ] [ -T content-type ] [ -v verbosity] [ -V ] [ -w ] [ -x <table>-attributes ] [ -X proxy[] ] [ -y <tr>-attributes ] [ -z <td>-attributes ] [http://]hostname[:port]/path

选项:

-A auth-username:password 对服务器提供BASIC认证信任。 用户名和密码由一个:隔开,并以base64编码形式发送。 无论服务器是否需要(即, 是否发送了401认证需求代码),此字符串都会被发送。 
-c concurrency 一次产生的请求个数。默认是一次一个。 
-C cookie-name=value 对请求附加一个Cookie:行。 其典型形式是name=value的一个参数对。 此参数可以重复。 
-d 不显示"percentage served within XX [ms] table"的消息(为以前的版本提供支持)。 
-e csv-file 产生一个以逗号分隔的(CSV)文件, 其中包含了处理每个相应百分比的请求所需要(从1%到100%)的相应百分比的(以微妙为单位)时间。 由于这种格式已经“二进制化”,所以比'gnuplot'格式更有用。 
-g gnuplot-file 把所有测试结果写入一个'gnuplot'或者TSV (以Tab分隔的)文件。 此文件可以方便地导入到Gnuplot, IDL, Mathematica, Igor甚至Excel中。 其中的第一行为标题。 
-h 显示使用方法。 
-H custom-header 对请求附加额外的头信息。 此参数的典型形式是一个有效的头信息行,其中包含了以冒号分隔的字段和值的对 (如, "Accept-Encoding: zip/zop;8bit"). 
-i 执行HEAD请求,而不是GET。 
-k 启用HTTP KeepAlive功能,即, 在一个HTTP会话中执行多个请求。 默认时,不启用KeepAlive功能. 
-n requests 在测试会话中所执行的请求个数。 默认时,仅执行一个请求,但通常其结果不具有代表意义。 
-p POST-file 包含了需要POST的数据的文件. 
-P proxy-auth-username:password 对一个中转代理提供BASIC认证信任。 用户名和密码由一个:隔开,并以base64编码形式发送。 无论服务器是否需要(即, 是否发送了401认证需求代码),此字符串都会被发送。 
-q 如果处理的请求数大于150, ab每处理大约10%或者100个请求时,会在stderr输出一个进度计数。 此-q标记可以抑制这些信息。 
-s 用于编译中(ab -h会显示相关信息)使用了SSL的受保护的https, 而不是http协议的时候。此功能是实验性的,也是很简陋的。最好不要用。 
-S 不显示中值和标准背离值, 而且在均值和中值为标准背离值的1到2倍时,也不显示警告或出错信息。 默认时,会显示 最小值/均值/最大值等数值。(为以前的版本提供支持). 
-t timelimit 测试所进行的最大秒数。其内部隐含值是-n 50000。 它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。 
-T content-type POST数据所使用的Content-type头信息。 
-v verbosity 设置显示信息的详细程度 - 4或更大值会显示头信息, 3或更大值可以显示响应代码(404, 200等), 2或更大值可以显示警告和其他信息。 
-V 显示版本号并退出。 
-w 以HTML表的格式输出结果。默认时,它是白色背景的两列宽度的一张表。 
-x <table>-attributes 设置<table>属性的字符串。 此属性被填入<table 这里 >. 
-X proxy[:port] 对请求使用代理服务器。 
-y <tr>-attributes 设置<tr>属性的字符串. 
-z <td>-attributes 设置<td>属性的字符串.
  1. 测试样例
# ab -c 500 -n 500 http://127.0.0.1/test
This is ApacheBench, Version 2.3 <$Revision: 1528965 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Finished 500 requests


Server Software:        WSGIServer/0.1
Server Hostname:        127.0.0.1
Server Port:            80

Document Path:          /test
Document Length:        36 bytes

Concurrency Level:      500
Time taken for tests:   16.381 seconds
Complete requests:      500
Failed requests:        0
Total transferred:      109000 bytes
HTML transferred:       18000 bytes
Requests per second:    30.52 [#/sec] (mean)
Time per request:       16381.498 [ms] (mean)
Time per request:       32.763 [ms] (mean, across all concurrent requests)
Transfer rate:          6.50 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    5  11.3      0      45
Processing:     8   98 911.8     20   16221
Waiting:        4   83 912.0     19   16220
Total:         17  103 912.0     20   16221

Percentage of the requests served within a certain time (ms)
  50%     20
  66%     22
  75%     26
  80%     50
  90%    150
  95%    161
  98%    174
  99%    182
 100%  16221 (longest request)

下面我们详细理解下显示信息:

  • Concurrency Level: 500 #并发的用户数
  • Time taken for tests: 16.381 seconds #表示所有这些请求被处理完成所花费的时间总和
  • Total transferred: 109000 bytes #所有请求的响应数据长度总和
  • HTML transferred: 18000 bytes #所有请求的响应数据中正文数据的总和
  • Requests per second: 30.52 [#/sec] (mean) #吞吐率,他等于Complete requests / Time taken for tests(相当于 LR 中的 每秒事务数 ,后面括号中的 mean 表示这是一个平均值)
  • Time per request: 16381.498 [ms] (mean) #用户平均请求等待时间,他等于Time taken for tests /(Complete requests / Concurrency Level)【相当于 LR 中的 平均事务响应时间】
  • Time per request: 32.763 [ms] (mean, across all concurrent requests) #服务器平均请求处理时间他等于Time taken for tests / Complete requests (每个请求实际运行时间的平均值)
  • Transfer rate: 6.50 [Kbytes/sec] received #请求在单位时间内从服务器获取数据的长度。他等于Total transferred / Time taken for tests 这个统计选项可以很好的说明服务器在处理能力达到极限时其出口带宽的需求量
举报

相关推荐

0 条评论