安装性能测试工具: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 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97 101 103 107 109 113
127 131 137 139 149 151 157 163 167 173
179 181 191 193 197 199 211 223 227 229
233 239 241 251 257 263 269 271 277 281
283 293 307 311 313 317 331 337 347 349
353 359 367 373 379 383 389 397 401 409
419 421 431 433 439 443 449 457 461 463
467 479 487 491 499 503 509 521 523 541
547 557 563 569 571 577 587 593 599 601
607 613 617 619 631 641 643 647 653 659
661 673 677 683 691 701 709 719 727 733
739 743 751 757 761 769 773 787 797 809
811 821 823 827 829 839 853 857 859 863
877 881 883 887 907 911 919 929 937 941
947 953 967 971 977 983 991 997
1000以内共168个

 

 

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时间乘以并发请求数

 

posted @ 2015-06-14 16:24  王滔  阅读(992)  评论(0编辑  收藏  举报