安装性能测试工具:sysbench和使用apache的ab
一、软件的用途,它主要包括以下几种方式的测试:
1、cpu性能
2、磁盘io性能
3、调度程序性能
4、内存分配及传输速度
5、POSIX线程性能
6、数据库性能(OLTP基准测试)
这个软件为什么找不到官网呢?giulib上面的网址只能下载源码。但是使用说明,却没有了。估计是一个个人软件,没有后续更新了。
最新版本是0.5版本。本来就是基本的功能,不需要完善的。所以更新不需要很频繁。比如memcache这种软件也十一月的。也就算1.x的版本。
二、归纳安装步骤:
1、解压
2、运行源码目录中的./autogen.sh脚本。目的是进行自动清理,结果会在源码目录中生成一个configure文件
3、./configure --with-mysql-libs=/mysql安装目录/lib/ --with-mysql-includes=/mysql安装目录/include/
4、make && make install
5、设置环境变量
export LD_LIBRARY_PATH=/usr/mysql/lib
可能涉及到的软件:
libtool工具
三、安装过程中遇到的疑惑和理解
在解压好的目录下运行命令:./autogen.sh,对环境进行清理(该操作是sysbench0.4.12独有的,不进行的话可能会报错)
运行上面命令后才会出现configure文件出来。
./configure --with-mysql-includes=/usr/local/include/mysql --with-mysql-libs=/usr/local/lib/mysql
--with-mysql-includes是指定mysql的什么目录,是安装目录还是什么? mysql安装目录下有个include目录, /usr/local/mysql/lib/include/
--with-mysql-libs项是指定mysql的什么目录呢? mysql安装目录下有个lib目录/usr/local/mysql/lib/
备注:网上有人说,这样子情况下,mysql必须是编译安装,不能rpm方式安装的mysql。
通过运行
./configure --with-mysql-includes=/usr/local/mysql/include/--with-mysql-libs=/usr/local/mysql/lib/
make && make install
没有报错。以为安装成功了?
于是运行: sysbench --test=cpu --cpu-max-prime=5000 run
想测试一下cpu
报错:
sysbench: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory
这说明sysbench无法找到mysql的库文件,这很可能是环境变量LD_LIBRARY_PATH没有设置,设置后即可解决该问题。
export LD_LIBRARY_PATH=/usr/mysql/lib
网上有些人的解决办法是:
# in -s /usr/local/mysql-5.5.8/lib/libmysqlclient.so.16 /lib64/libmysqlclient.so.16
这种解决思路是,考虑到sysbench会去/lib64/libmysqlclient.so.16目录下寻找mysqlclient,所以设置一个软链接的指向真实的mysqlclient目录去。
疑问:没有搞明白思路。很多人就是依样画葫芦,没有解释清楚里面的缘由。
/usr/local/mysql/lib/libmysqlclient.so.18这个文件是干嘛的呢?
我的是报错libmysqlclient.so.18这个文件,而网上有些是libmysqlclient.so.16这个文件
我第二天来开虚拟机,发现会报这样的错误了。不知道什么原因。把export LD_LIBRARY_PATH=/usr/mysql/lib加到/etc/rc.local文件里面去,设置为开机就运行环境变量,竟然都没用。
ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib/libmysqlclient.so.18
如果操作系统是64位的,那么/usr/lib/libmysqlclient.so.18,中的lib要改成lib64,如:
ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64/libmysqlclient.so.18
四、安装完毕,进行测试
cpu的测试结果如何阅读?
sysbench --test=cpu --cpu-max-prime=5000 run
Number of threads: 1表示使用了一个线程。默认使用一个线程。
primer numbers limit,表示最大的质数限制,就是参数--cpu-max-prime指定的值
total numbers oof events, 最大的请求数目,默认为10000,0代表不限制
respones time是响应速度的计算。min为多次请求中执行耗费最小的时间,avg平均时间。max为多次请求中执行耗费最长的时间
参数疑问:线程数,和最大请求数目有什么区别呢?
是不是表示一个线程都会进行total numbers of events次数的请求呢。那么总共接受的请求数就是“线程数*total numbers of events”
sysbench --help命令中的解释是概要
--num-threads=N number of threads to use [1] 使用多少个线程
--max-requests=N limit for total number of requests [10000] 最大请求数
根据推测,我是这么理解:多少个线程,可以想像多少台客户端(电脑或多少个用户)同时对测试目标发起请求,每个客户端发--max-requests个请求。
注:每台电脑不可能只发一个请求,发一个请求根本测试不出什么来。所以一般是连续发很多次请求。那么--max-requests就是指每个线程要发这么多次请求来进行测试。
所以最终的请求数:--num-threads*--max-requests。
我表示疑问了,对cpu性能进行测试,使用的是最大质数测试,实际含义是什么?怎么阅读上面的数据。
为什么对cpu性能进行测试,是使用素数的加法运算呢?
是素性测试吧。官网是这么讲的
In this mode each request consists in calculation of prime numbers up
to a value specified by the --cpu-max-primes option. All calculations
are performed using 64-bit integers.
primes英文意思是“最初的、最基本的、首要的"意思。prime numbers指的就是质数的意思。
1、cpu测试的原理:针对素数做加法运算
素数也叫做质数。什么是质数,一个数为a,它只能除以两个数:1和它自己,但是不能除以其他数了。比如,3可以除以1,3可以除以3(它自己)。3除以2是无法整除的。
网上列出1000以内的质数:
1000以内
2,3,5,7都是属质数。比如7能够除以1,也能够除以7。但是除以2,3,4,5,6都不能除了(不能比7还大,大的数去相除,结果得到肯定是小数了)
2、测试文件的读写性能的原理:
1、先创建文件
2、然后针对文件模拟多少个并发线程进行读写操作。看看响应速度。这种方式可以测试出磁盘的i/0能力
总结:sysbench都是针对本地的cpu,内存性能进行测试。无法进行远程测试。因为都没有提供url的参数
使用参考资料:
http://blog.csdn.net/clh604/article/details/12108477
http://www.cnblogs.com/ylqmf/archive/2012/09/29/2708562.html
http://www.cnblogs.com/dyllove98/archive/2013/07/28/3221603.html 各个参数解释全面
附:测试选项说明
[root@localhost bin]# sysbench 测试用例: sysbench [general-options]... --test=<test-name> [test-options]... command 通用选项: --num-threads=N 创建测试线程的数目。默认为1. --max-requests=N 请求的最大数目。默认为10000,0代表不限制。 --max-time=N 最大执行时间,单位是s。默认是0,不限制。 --forced-shutdown=STRING 超过max-time强制中断。默认是off。] --thread-stack-size=SIZE 每个线程的堆栈大小。默认是32K。 --init-rng=[on|off] 在测试开始时是否初始化随机数发生器。默认是off。 --test=STRING 指定测试项目名称。值为以下值之一: fileio,cpu,memory,threads,mutex,oltp --debug=[on|off] 是否显示更多的调试信息。默认是off。 --validate=[on|off] 在可能情况下执行验证检查。默认是off。
帮助命令的使用:
列出所有命令
sysbench --help
列出指定的测试项使用说明
sysbench --test=cpu help
查看具体的测试项的参数
sysbench --test=threads help
参数名 |
描述 |
--thread-yields=N |
内存块大小,默认为1K |
--thread-locks=N |
传输的数据量,默认为100G |
sysbench --test=cpu help
apache的ab工具使用
D:\soft\kaifa\ide\wamp\bin\apache\apache2.4.9\bin>ab.exe -n 50 -c 40 http://www.ab.com:1080/test_mc_pconnect.php
其中-n代表请求数,-c代表并发数
50个请求,40个并发。并发是不是可以理解成40个用户,每个用户发送(50/40)个请求。
备注:url可以使用引号引起来。也可以不引。
这里的统计结果要怎么读取,怎么获取到有用的信息呢?
网友有解释:
---------------------------------------
10个并发,就是瞬间10个请求到服务器上去(模拟10个并发请求),如果服务器处理的快,那么就继续,但是使用参数中有请求总数,
其实就是以每次10个并发的方式,将你设置的请求总数都压到服务器上去,看服务器多久可以处理完,计算平均每秒的响应情况。
---------------------------------------
-n 600 -c 500
是这样理解:创建500个线程,同时请求指定url。每个线程要连续请求600次(是分批请求的,我们会看到统计信息中提示,已经完成100个请求,已经完成200个请求。已经完成300个请求。)
纠正:理解错误了。n不是表示每个线程请求这么多次数。而是表示c个线程,总共请求这么多次数。
所以每个线程请求是(n/c)个。这么来说,至少每个线程要发一个请求。所以呢。n的值必须是>=c才行。否则不好分配每个线程,每个线程至少的分到一个请求才行。
目前,非常确定的是。c表示瞬间这么多个请求到服务器(也就是我们常常说的并发)。ab的命令中已经解释了这个参数是Number of multiple requests to make at a time
make a time就是瞬间。
同时创建这么多个并发请求到服务器。如果服务器还能接受,则继续发起请求,怎么个发起法呢?
比如目前设置n是10000万。并发数设置为5000个并发。那么则第一次发起掉5000个。服务器能够处理完。
那好继续发起并发请求。此时是10000-5000个了。
终于明白这个n表示的实际含义正如英文描述的那样: Number of requests to perform。总请求次数。是多次请求累加得到的结果。
ab.exe -n 10000 -c 5000
5千个并发请求到服务器去。如果能够接受,那么继续发起剩下的(总数-已请求的次数),也就是(10000-5000)个。
为什么请求数不能比并发数低呢?这个参数就好理解了。
参考:http://wenku.baidu.com/link?url=HZxYk5tFJIeTkyWMaRaIF79fLiDCsW1mJ9dqchYEaDi84T37u1Xxy__-HiSt4R8RnJZPcxsmurykQ61kkMk0_B-7OSapCwzE4FucHuQpk1q
ab的原理:ab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问。它的测试目标是基于URL的,因此,它既可以用来测试apache的负载压力,也可以测试nginx、lighthttp、tomcat、IIS等其它Web服务器的压力。
ab命令对发出负载的计算机要求很低,它既不会占用很高CPU,也不会占用很多内存。但却会给目标服务器造成巨大的负载,其原理类似CC攻击。自己测试使用也需要注意,否则一次上太多的负载。可能造成目标服务器资源耗完,严重时甚至导致死机。
Server Software: Apache/2.0.54
//平台apache 版本2.0.54
Server Hostname: 127.0.0.1
//服务器主机名
Server Port: 80
//服务器端口
Document Path: /index.html.zh-cn.gb2312
//测试的页面文档
Document Length: 1018 bytes
//文档大小
Concurrency Level: 1000
//并发数
Time taken for tests: 8.188731 seconds
//整个测试持续的时间
Complete requests: 1000
//完成的请求数量
Failed requests: 0
//失败的请求数量
Write errors: 0
Total transferred: 1361581 bytes
//整个场景中的网络传输量
HTML transferred: 1055666 bytes
//整个场景中的HTML内容传输量
Requests per second: 122.12 [#/sec] (mean)
//大家最关心的指标之一,相当于 LR 中的 每秒事务数 ,后面括号中的 mean 表示这是一个平均值
Time per request: 8188.731 [ms] (mean)
//大家最关心的指标之二,相当于 LR 中的 平均事务响应时间 ,后面括号中的 mean 表示这是一个平均值
Time per request: 8.189 [ms] (mean, across all concurrent requests)
//每个请求实际运行时间的平均值
Transfer rate: 162.30 [Kbytes/sec] received
//平均每秒网络上的流量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题
Connection Times (ms)
min mean[+/-sd] median max
Connect: 4 646 1078.7 89 3291
Processing: 165 992 493.1 938 4712
Waiting: 118 934 480.6 882 4554
Total: 813 1638 1338.9 1093 7785
//网络上消耗的时间的分解,各项数据的具体算法还不是很清楚
Percentage of the requests served within a certain time (ms)
50% 1093
66% 1247
75% 1373
80% 1493
90% 4061
95% 4398
98% 5608
99% 7368
100% 7785 (longest request)
//整个场景中所有请求的响应情况。在场景中每个请求都有一个响应时间,其中50%的用户响应时间小于1093 毫秒,60% 的用户响应时间小于1247 毫秒,最大的响应时间小于7785 毫秒
由于对于并发请求,cpu实际上并不是同时处理的,而是按照每个请求获得的时间片逐个轮转处理的,所以基本上第一个Time per request时间约等于第二个Time per request时间乘以并发请求数