1.sysbench
sysbench是percon公司开发的一款软件,主要是针对系统和数据库压测是项目上线前必做的一项,这里使用的是最新版本的sysbench做的压测使用详解。sysbench可以做系统层面的压力测试(CPU、内存、硬盘IO、互斥锁、Thead),也可以做数据库(MySQL/Oracle/PG)层面的压力测试。安装容易,操作便捷,是压测使用的重要工具之一
2.安装sysbench(这里是基于二进制mysql包的安装,这里我的二进制mysql目录是安装在/application/mysql 目录下)
这里是直接从github上面进行下载
git clone https://github.com/akopytov/sysbench.git
下载完毕后然后再进行编译安装
./autogen.sh ---》执行这个命令生成configure文件 ,在生成configure文件之前这个命令会检查一下依赖包是否完整
编译之前这里可能需要先要提前安装一些依赖包
yum -y install automake
yum -y install libtool ----》缺少什么依赖包就要补啥依赖包
总体要安装的包:yum -y install autoconf automake mysql-devel libtool openssl-devel
./configure --prefix=/usr/local/sysbench --with-mysql=/application/mysql --with-mysql-includes=/application/mysql/include/ --with-mysql-libs=/application/mysql/lib ----》这一步很重要,如果后面什么都不加的话会默认安装的
make && make install
3.简单使用
sysbench 0.5版本或之前版本
-----准备阶段
sysbench --db-driver=mysql --mysql-user=root --mysql-password='123' \
--mysql-socket=/data/mysql/3307/mysql.sock --mysql-db=foo --range_size=100 \
--table_size=10000 --tables=2 --threads=1 --events=0 --time=60 \
--rand-type=uniform /usr/local/sysbench/share/sysbench/oltp_read_write.lua perpare
-------测试阶段
sysbench --db-driver=mysql --mysql-user=root --mysql-password='123' \
--mysql-socket=/data/mysql/3307/mysql.sock --mysql-db=foo --range_size=100 \
--table_size=10000 --tables=2 --threads=1 --events=0 --time=60 \
--rand-type=uniform /usr/local/sysbench/share/sysbench/oltp_read_write.lua run
-------清除阶段
sysbench --db-driver=mysql --mysql-user=root --mysql-password='123' \
--mysql-socket=/data/mysql/3307/mysql.sock --mysql-db=foo --range_size=100 \
--table_size=10000 --tables=2 --threads=1 --events=0 --time=60 \
--rand-type=uniform /usr/local/sysbench/share/sysbench/oltp_read_write.lua cleanup
4.sysbench 测磁盘io(sysbench 1.0版本之后)
sysbench fileio --file-num=20 --threads=20 --file-total-size=20G --events=1000000 --file-test-mode=rndrw prepare
sysbench fileio --file-num=20 --threads=20 --file-total-size=20G --events=1000000 --file-test-mode=rndrw run
sysbench fileio --file-num=20 --threads=20 --file-total-size=20G --events=1000000 --file-test-mode=rndrw cleanup
这里我对比了一下我的虚拟机(一个处理器内核,1G的内存)读性能为85MB/s 写性能为55MB/s ,而我的阿里云(单核1G内存)读性能23MB/s 写性能为15MB/s
5.测试cpu
常用参数:
--cpu-max-prime: 素数生成数量的上限
- 若设置为3,则表示2、3、5(这样要计算1-5共5次)
- 若设置为10,则表示2、3、5、7、11、13、17、19、23、29(这样要计算1-29共29次)
- 默认值为10000
--threads: 线程数
- 若设置为1,则sysbench仅启动1个线程进行素数的计算
- 若设置为2,则sysbench会启动2个线程,同时分别进行素数的计算
- 默认值为1
--time: 运行时长,单位秒
- 若设置为5,则sysbench会在5秒内循环往复进行素数计算,
从输出结果可以看到在5秒内完成了几次,
比如配合--cpu-max-prime=3,则表示第一轮算得3个素数,
如果时间还有剩就再进行一轮素数计算,直到时间耗尽。
每完成一轮就叫一个event
- 默认值为10
- 相同时间,比较的是谁完成的event多
--events: event上限次数
- 若设置为100,则表示当完成100次event后,即使时间还有剩,也停止运行
- 默认值为0,则表示不限event次数
- 相同event次数,比较的是谁用时更少
案例分析:
# 素数上限2万,默认10秒,2个线程
sysbench cpu --cpu-max-prime=20000 --threads=2 run
结果:
[root@node01 tmp]# sysbench cpu --cpu-max-prime=20000 --threads=2 run
sysbench 1.1.0-bbee5d5 (using bundled LuaJIT 2.1.0-beta3)
Running the test with following options:
Number of threads: 2 //指定线程个数
Initializing random number generator from current time
Prime numbers limit: 20000 //每个线程产生的素数上限均为2万个
Initializing worker threads...
Threads started!
CPU speed:
events per second: 446.69 //所有线程每秒完成了446.69次event
Throughput:
events/s (eps): 446.6855
time elapsed: 10.0026s //共耗时10秒
total number of events: 4468 //在10秒内共完成了4468次event
Latency (ms):
min: 2.09 //完成1次event最少耗时2.09ms
avg: 4.44 //完成所有events平均耗时4.44ms
max: 24.57 //完成1次event最大耗时24.57毫秒
95th percentile: 13.22 //95%的events完成都在13.22ms完成
sum: 19842.20 //每个线程耗时10ms,2个线程总共耗时20ms
Threads fairness:
events (avg/stddev): 2234.0000/0.00 //平均每完成2234次event,标准差是0.00
execution time (avg/stddev): 9.9211/0.02 //每个线程平均耗时10秒,标准差为0.02
event:表示完成了几轮素数计算
stddev:标准差,在相同时间内,多个线程分别完成素数计算次数是否稳定,如果数值越低,那么多个线程的结果就越接近(即越稳定),该线程对单线程无意义。
分析:
如果有2台服务器进行CPU性能对比,当素数上限和线程数一致时:
相同时间,比较event
相同event,比较时间
时间和event都相同,比较stddev(标准差)
6.测oltp
sysbench --db-driver=mysql --mysql-user=root --mysql-password=123 --mysql-socket=/data/mysql/3307/mysql.sock --threads=20 --mysql-db=foo --table_size=10000 --tables=2 oltp_read_write.lua prepare //这个是准备数据
.......run //运行
.......clearup //清理数据
结果分析:
Threads started!
SQL statistics:
queries performed:
read: 27356
write: 7816
other: 3908
total: 39080
transactions: 1954 (193.55 per sec.) //每秒处理的事务数TPS
queries: 39080 (3870.99 per sec.) //每秒请求的次数QPS
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
Throughput:
events/s (eps): 193.5497
time elapsed: 10.0956s
total number of events: 1954
Latency (ms):
min: 5.20
avg: 102.95
max: 496.24
95th percentile: 137.35
sum: 201163.87
Threads fairness:
events (avg/stddev): 97.7000/2.15
execution time (avg/stddev): 10.0582/0.02