sysbench的安装和做性能测试
sysbench是一个模块化的、跨平台、多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况。关于这个项目的详细介绍请看:。
它主要包括以下几种方式的测试:
1、cpu性能
2、磁盘io性能
3、调度程序性能
4、内存分配及传输速度
5、POSIX线程性能
6、数据库性能(OLTP基准测试)
目前sysbench主要支持 MySQL,pgsql,oracle 这3种数据库。
一、安装
首先,在 /projects/sysbench 下载源码包。
接下来,按照以下步骤安装:
tar zvxf sysbench-0.
cd sysbench-0.5
./configure && make && make install
strip /usr/local/bin/sysbench
以上方法适用于 MySQL 安装在标准默认目录下的情况,如果 MySQL 并不是安装在标准目录下的话,那么就需要自己指定 MySQL 的路径了。比如我的 MySQL 喜欢自己安装在 /opt/mysql 下,则按照以下方法编译:
A.cd sysbench-0.5
B.运行autogen.sh
西藏英文./autogen.sh
如果不成功 执行 sh autogen.sh
./configure --with-mysql-includes=/opt/mysql/include --with-mysql-libs=/opt/mysql/lib && make && make install (如果提示失败 看看你mysql 路径在什么位置 本次实验为/OPT/mysql)
安装完成马上测试一下:
复制代码 代码如下:
[root@beanvm sysbench-0.5]# sysbench
sysbench: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory
说是缺少libmysqlclient.so.18文件,额,这个文件是存在的,需要手动链接一下:
ln ln -s /opt/mysql/lib/libmysqlclient.so.18 /usr/lib/ (mysql目录是那个 路径就设置为哪个)
当然了,用上面的参数编译的话,就要确保你的 MySQL lib目录下有对应的 so 文件,如果没有,可以自己下载 devel 或者 share 包来安装。
另外,如果想要让 sysbench 支持 pgsql/oracle 的话,就需要在编译的时候加上参数
--with-pgsql
或者
--with-oracle
这2个参数默认是关闭的,只有 MySQL 是默认支持的。
二、开始测试
编译成功之后,就要开始测试各种性能了,测试的方法官网网站上也提到一些,但涉及到 OLTP 测试的部分却不够准确。在这里我大致提一下:
1、cpu性能测试
sysbench --test=cpu --cpu-max-prime=20000 run
cpu测试主要是进行素数的加法运算,在上面的例子中,指定了最大的素数为 20000,自己可以根据机器cpu的性能来适当调整数值。
下面例子:
[root@localhost lib]# sysbench --test=cpu --cpu-max-prime=20000 run
sysbench 0.5: multi-threaded system evaluation benchmark
Running the test with following options:
firmamentNumber of threads: 1
Random number generator ed is 0 and will be ignored
Primer numbers limit: 20000
Threads started!
Test execution summary:
tot
al time: 44.5620s
total number of events: 10000
total time taken by event execution: 44.5572s
per-request statistics:
min: 4.17ms
avg: 4.46ms
max: 16.41ms
approx. 95 percentile: 4.92ms
Threads fairness:
events (avg/stddev): 10000.0000/0.00
execution time (avg/stddev): 44.5572/0.00
我们只需要关心测试的总时间(total time)即可。
CPU性能测试有一个需要注意的地方,上面的测试只使用了一个线程,如果在两个cpu processor不同的电脑上做比较,这是不公平的。公平的做法是指定合理的线程数,如下所示:
sysbench --test=cpu --num-threads=`grep "processor" /proc/cpuinfo | wc -l` \
--cpu-max-prime=200000 run
补充知识:
查看CPU核数的方法
查看物理cpu个数
grep "physical id" /proc/cpuinfo | sort -u | wc -l
查看核心数量
grep "core id" /proc/cpuinfo | sort -u | wc -l
查看线程数量
grep "processor" /proc/cpuinfo | sort -u | wc -l
# 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
# 查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq
# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l
查看CPU信息(型号)
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
查看内 存信息
# cat /proc/meminfo
在sysbench的测试中,--num-threads取值为"线程数量"即可,再大的值没有什么意义,对测试结果也没有什么影响。
2、线程测试
sysbench --test=threads --num-threads=64 --thread-yields=100 --thread-locks=2 run
下面是输出结果:
[root@localhost lib]# sysbench --test=threads --num-threads=64 run
sysbench 0.5: multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads: 64
Random number generator ed is 0 and will be ignored
Threads started!
Test execution summary:
total time: 6.1911s
total number of events: 10000
total time taken by event execution: 394.2028s
per-request statistics:
min: 0.73ms
avg: 39.42ms
max: 149.35ms
approx. 95 percentile: 90.76ms
Threads fairness:
events (avg/stddev): 156.2500/3.17
execution time (avg/stddev): 6.1594/0.03
可以看到total time 比在我自己电脑上少了一半,服务器的线程调度肯定比普通电脑快多了。
3、磁盘IO性能测试
首先生成需要的测试文件,文件总大小1000M,16个并发线程,随机读写模式。执行完后会在当前目录下生成一堆小文件。
sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw prepare
sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw run
sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw cleanup
sysbench 0.5: multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads: 16
会议纪要英文Random number generator ed is 0 and will be ignored
Threads started!
Operations performed: 6003 reads, 3997 writes, 12800 Other = 22800 Total
Read 93.797Mb Written 62.453Mb Total transferred 156.25Mb (162.1Mb/c)
10374.34 Requests/c executed
Test execution summary:
total time: 0.9639s
total number of events: 10000
total time taken by event execution: 5.9638s
per-request statistics:
min: 0.00ms
avg: 0.60ms
max: 50.77ms
approx. 95 percentile: 1.52ms
Threads fairness:
extendedevents (avg/stddev): 625.0000/43.92
execution time (avg/stddev): 0.3727/0.05
上述参数指定了最大创建16个线程,创建的文件总大小为3G,文件读写模式为随机读。
4、内存测试
内存测试测试了内存的连续读写性能。
上面这条语句指定了整个测试过程中,传输4G的数据量,每个block的大小为8K(大写的K)。
测试结果如下所示,我们最关心的是吞吐量(3980.82MB/c),和后面的磁盘io 测试结果比较可知,内存的连续读写比磁盘的连续读写快十几倍。
sysbench --test=memory --memory-block-size=8k --memory-total-size=4G run
sysbench 0.5: multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads: 1
新目标九年级英语听力下载出埃及记马克西姆钢琴曲mp3下载Random number generator ed is 0 and will be ignored
Threads started!
Operations performed: 524288 (509544.86 ops/c)
4096.00 MB transferred (3980.82 MB/c)
Test execution summary:
total time: 1.0289s
total number of events: 524288
total time taken by event execution: 0.8602s
per-request statistics:
min: 0.00ms
avg: 0.00ms
max: 0.52ms
approx. 95 percentile: 0.00ms
Threads fairness:
events (avg/stddev): 524288.0000/0.00
execution time (avg/stddev): 0.8602/0.00
上述参数指定了本次测试整个过程是在内存中传输 4G 的数据量,每个 block 大小为 8K。
5、文件IO基准测试
文件IO(fileio)基准测试可以测试系统在不同IO负载下的性能。这对于比较不同的硬盘驱动器,不同的RAID 卡,不同的RAID 模式,都很有帮助。可以根据测试结果调整IO子
系统。
文件IO基准测试模拟了很多InnoDB 的IO特性。
测试的第一步是准备(Prepare)阶段,生成测试用到的数据文件,生成的数据文件至少要比内存大。
如果文件中的数据能完全放入内存中,则操作系统 缓存大部分的数据,导致测试结果无法体现IO密集型的工作负载。首先通过下面的命令创建一个数据集:
sysbench --test=fileio --file-total-size=10G prepare
这个命令会在当前工作目录下创建测试文件,后续的运行(run)阶段将通过读写这些文件进行测试。 第二步就是运行(run)阶段,针对不同的IO 类型有不同的测试选项:
qwr 顺序写入
qrewr 顺序重写
qrd 顺序读取
rndrd 随机读取
rndwr 随机写入
rndrw 混合随机读/写
下面的命令运行文件I/O混合随机读/写基准测试:
sysbench --test=fileio --file-total-size=10G --file-test-mode=rndrw\
--init-rng=on --max-time=300 --max-requests=0 run
dbcoopersysbench 0.5: multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads: 1
Random number generator ed is 0 and will be ignored
Threads started!
Operations performed: 614700 reads, 409800 writes, 1311274 Other = 2335774 Total
Read 9.3796Gb Written 6.2531Gb Total transferred 15.633Gb (53.357Mb/c)
3414.85 Requests/c executed
Test execution summary:
total time: 300.0136s
total number of events: 1024500
total time taken by event execution: 230.5468s
per-request statistics:
min: 0.00ms
avg: 0.23ms
max: 508.81ms
approx. 95 percentile: 0.18ms
Threads fairness:
events (avg/stddev): 1024500.0000/0.00
execution time (avg/stddev): 230.5468/0.00
输出结果中包含了大量的信息。和IO子系统密切相关的包括每秒请求数和总吞吐量。在上述例子中, 每秒请求数是3414.85 Requests/c , 吞吐量是53.357Mb/c 。
另外,时间信息也非常有用, 尤其是大约95%的时间分布。这些数据对于评估磁盘性能十分有用。
测试完成以后,运行清除(cleanup)操作删除第一步生成的测试文件。
sysbench --test=fileio --fil-total-size=10G cleanup
互斥锁(mutex)
测试互斥锁的性能,方式是模拟所有线程在同一时刻并发运行,并都短暂请求互斥锁。
sysbench --test=mutex --num-threads=16 --mutex-num=2048 \
--mutex-locks=1000000 --mutex-loops=5000 run
输出结果如下:
Number of threads: 16
Doing mutex performance test
Threads started!
Done.
Test execution summary:
total time: 3.6123s
total number of events: 16
total time taken by event execution: 57.6636
per-
request statistics:
min: 3580.79ms
avg: 3603.98ms
max: 3610.94ms
approx. 95 percentile: 10000000.00ms
Threads fairness:
events (avg/stddev): 1.0000/0.00
execution time (avg/stddev): 3.6040/0.01
6、互斥锁(mutex)
测试互斥锁的性能,方式是模拟所有线程在同一时刻并发运行,并都短暂请求互斥锁。
sysbench --test=mutex --num-threads=16 --mutex-num=2048 \
--mutex-locks=1000000 --mutex-loops=5000 run
输出结果如下:
Running the test with following options:
Number of threads: 16
Random number generator ed is 0 and will be ignored
Threads started!
Test execution summary:
total time: 0.7081s
total number of events: 16
total time taken by event execution: 10.9535s
per-request statistics:
min: 649.61ms
avg: 684.59ms
max: 700.39ms
approx. 95 percentile: 700.10ms
Threads fairness:
events (avg/stddev): 1.0000/0.00
execution time (avg/stddev): 0.6846/0.02
7、OLTP测试
下面来看最重要也是最复杂的测试————oltp。oltp 基准测试模拟了一个简单的事物处理系统的工作负载。 下面的例子使用的是一张超过百万行记录的表,第一步是先生成这张表:
sysbench --test=oltp --oltp-table-size=1000000 --mysql-db=test \
--mysql-ur=root prepare
生成数据只需要上面这条简单的命令即可。这条命令在test 数据库中新建了一个表(sbtest),并在表中插入了1000000条记录。
对于非默认安装的mysql,需要指定连接到msyql服务器的f中的socket值),如下所示:
sysbench --test=oltp --oltp-table-size=1000000 --mysql-ur=root \
--mysql-db=test --mysql-socket=/data/nt/lmx/sysbench/var/mysqld.sock \
prepare
数据加载完成以后就可以开始测试了,这个例子采用了16个线程,测试时长为720秒:
sysbench --test=oltp --oltp-table-size=1000000 --mysql-db=test \
--mysql-ur=root --max-time=720 --max-requests=0 \
--num-threads=16 --oltp-test-mode=complex run
与插入记录时一样,如果mysql是非默认安装,还需要指定--mysql-socket的值。
Number of threads: 16
Doing OLTP test.
Running mixed OLTP test
Using Special distribution (12 iterations, 1 pct of values are returned in 75 pct cas)
Using "BEGIN" for starting transactions
Using auto_inc on the id column
Threads started!
Time limit exceeded,
(last message repeated 15 times)
Done.
生活大爆炸第4季
OLTP test statistics:
queries performed:
read: 26225724
write:
9366330
other: 3746532
total: 39338586
transactions: 1873266 (2601.71 per c.)
deadlocks: 0 (0.00 per c.)
read/write requests: 35592054 (49432.47 per c.)
other operations: 3746532 (5203.42 per c.)
Test execution summary:
total time: 720.0136s
total number of events: 1873266
total time taken by event execution: 11506.8251
per-request statistics:
min: 2.37ms
avg: 6.14ms
max: 400.48ms
approx. 95 percentile: 14.90ms
Threads fairness:
events (avg/stddev): 117079.1250/275.62
execution time (avg/stddev): 719.1766/0.01
如上所示,结果中包含了相当多的信息。其中最有价值的信息如下;
总的事务数
每秒事务数
时间统计信息(最小,平均,最大响应时间,以及95%百分比响应时间)
线程公平性统计信息
最最重要的当然是每秒事务数(2601.71 per c.)。
oltp 测试注意事项:
--max-requests --max-requests 默认值为10000 ,如果设置了--max-requests 或者使用默认值 ,分析结果的时候主要查看运行时间(total time),一般情况下,都将--max-requests 赋值为0 ,即不限制请求数量,通过--max-time 来指定测试时长,然后查看系统的每秒事务数。
--oltp-test-mode
--oltp-test-mode用以指定测试模式,取值有(simeple,complex,nontrx),默认是complex。不同模式会执行不同的语句。 具体执行语句如下所示:
Simple 这种模式只是简单的执行lec语句。
SELECT c FROM sbtest WHERE id=N
complex(Advanced transactional) 在事务中,可能包含下列语句。
Point queries:
SELECT c FROM sbtest WHERE id=N
Range queries:
SELECT c FROM sbtest WHERE id BETWEEN N AND M
Range SUM() queries:
SELECT SUM(K) FROM sbtest WHERE id BETWEEN N and M
Range ORDER BY queries:
SELECT c FROM sbtest WHERE id between N and M ORDER BY c
Range DISTINCT queries:
SELECT DISTINCT c FROM sbtest WHERE id BETWEEN N and M ORDER BY c
UPDATEs on index column:
UPDATE sbtest SET k=k+1 WHERE id=N
UPDATEs on non-index column:
UPDATE sbtest SET c=N WHERE id=M
DELETE queries:
DELETE FROM sbtest WHERE id=N
INSERT queries:
INSERT INTO sbtest VALUES (...)
nontrx(Non-transactional) 这种模式包含下列SQL语句。
儿童英文歌Point queries:
SELECT pad FROM sbtest WHERE id=N
why
UPDATEs on index column:
UPDATE sbtest SET k=k+1 WHERE id=N
UPDATEs on non-index column:
UPDATE sbtest SET c=N WHERE id=M
DELETE queries:
DELETE FROM sbtest WHERE id=N
INSERT queries:
INSERT INTO sbtest (k, c, pad) VALUES(N, M, S)
simple 与 --oltp-read-only 的区别
simple模式和