阅读《高性能MySQL》第二章时,作者列举了几种基准测试工具。这些测试工具,相当惭愧,我都没怎么用到。因此根据书中作者的建议,就下载了 sysbench 进行学习。
现在分享下安装的过程:
目前安装的系统是 Centos7 以下皆以此为背景。
git 地址 https://github.com/akopytov/sysbench
命令 git clone https://github.com/akopytov/sysbench.git sysbench
yum -y install make automake libtool pkgconfig libaio-devel
yum -y install mariadb-devel
cd sysbench
./autogen.sh
./configure
如果 MySQL 并不是安装在标准目录 /usr/local/bin/ 下的话,那么就需要自己指定 MySQL 的路径了
./configure --with-mysql-includes=/usr/local/mysql-5.7.17/include --with-mysql-libs=/usr/local/mysql-5.7.17/lib
make -j
make install
添加环境变量
vim /etc/profile
export LD_LIBRARY_PATH=/usr/local/mysql/lib
source /etc/profile
验证安装是否正确:
sudo yum -y install sysbench
1.sysbench: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory
解决:
vim /etc/profile
export LD_LIBRARY_PATH=/usr/local/mysql/lib
source /etc/profile
sysbench --help
Usage:
sysbench [options]... [testname] [command]
Commands implemented by most tests: prepare run cleanup help
*command部分有4类:prepare run cleanup和help:
prepare:准备数据的命令。例如,在sysbench压力测试之前,需要先准备好测试库、测试表以及测试表中的数据。
run:表示进行压力测试。
cleanup:清除测试时产生的数据。
help:输出给定lua脚本的帮助信息。
General options: //普通功能
--threads=N 指定线程数 [1]
--events=N 事件总数的限制 [0]
--time=N 限制总执行时间(以秒为单位)[10]
--warmup-time=N 在启用统计信息运行实际基准测试之前,在禁用统计信息的情况下执行事件这么长时间 [0]
--forced-shutdown=STRING 强制关闭或禁用“off”之前,在—时间限制之后等待的秒数 [off]
--thread-stack-size=SIZE 每个线程的堆栈大小 [64K]
--thread-init-timeout=N 等待工作线程初始化的时间(以秒为单位) [30]
--rate=N 平均事务率。0表示不限制[0]
--report-interval=N 以秒为单位定期报告中间统计信息。0禁用间隔报告 [0]
--report-checkpoints=[LIST,...] 转储完整的统计信息,并在指定的时间点重置所有计数器。参数是一个逗号分隔的值列表,表示从测试开始到必须执行报表检查点所花费的时间(以秒为单位)。默认情况下,报表检查点是关闭的。 []
--debug[=on|off] 打印更多调试信息 [off]
--validate[=on|off] 在可能的情况下执行验证检查[off]
--help[=on|off] 打印帮助并退出 [off]
--version[=on|off] 打印版本并退出[off]
--config-file=FILENAME 包含命令行选项的文件
--luajit-cmd=STRING 执行LuaJIT控制命令。这个选项相当于“luajit -j”。有关更多信息,请参见LuaJIT文档
Pseudo-Random Numbers Generator options: //伪随机数生成器选项
--rand-type=STRING 随机数分布{均匀,高斯,special,帕累托,zipfian}默认使用 [special]
--rand-seed=N 种子为随机数发生器。当为0时,将当前时间用作RNG种子。 [0]
--rand-spec-iter=N 特殊分布的迭代次数[12]
--rand-spec-pct=N “特殊”值落在特殊分布中的整个范围的百分比[1]
--rand-spec-res=N 用于特殊分布的“特殊”值的百分比 [75]
--rand-pareto-h=N 形状参数为帕累托分布[0.2]
--rand-zipfian-exp=N Zipfian分布的形状 参数 (exponent, theta) [0.8]
Log options: //日志选项
--verbosity=N verbosity level {5 - debug, 0 - only critical messages} [3] 冗长级别{5 -调试,0 -只有关键消息}
--percentile=N 在延迟统计中计算的百分位数(1-100)。使用0的特殊值禁用百分位数计算 [95]
--histogram[=on|off] 在报表中打印延迟直方图 [off]
General database options: //一般数据库选项
--db-driver=STRING 指定要使用的数据库驱动程序(“帮助”获取可用驱动程序列表) [mysql]
--db-ps-mode=STRING 语句使用模式 {auto, disable} [auto]
--db-debug[=on|off] 打印特定于数据库的调试信息 [off]
Compiled-in database drivers: //对数据库驱动程序
mysql - MySQL driver
mysql options:
--mysql-host=[LIST,...] MySQL服务器主机[localhost]
--mysql-port=[LIST,...] MySQL服务器端口 [3306]
--mysql-socket=[LIST,...] MySQL socket
--mysql-user=STRING MySQL 用户[sbtest]
--mysql-password=STRING MySQL 密码[]
--mysql-db=STRING MySQL 数据库名称 [sbtest]
--mysql-ssl=STRING SSL模式。这接受与MySQL客户机实用程序中的——ssl-mode选项相同的值。默认情况下禁用 [disabled]
--mysql-ssl-key=STRING 客户端私钥文件的路径名称
--mysql-ssl-ca=STRING CA文件的路径名
--mysql-ssl-cert=STRING 客户端公钥证书文件的路径名
--mysql-ssl-cipher=STRING 为SSL连接使用特定的密码 []
--mysql-compression[=on|off] 如果在客户端库中可用,则使用压缩 [off]
--mysql-debug[=on|off] 跟踪所有客户机库调用 [off]
--mysql-ignore-errors=[LIST,...] 要忽略的错误列表,或“全部” [1213,1020,1205]
--mysql-dry-run[=on|off] 试运行,假设所有MySQL客户端API调用都是成功的,而没有执行它们 [off]
Compiled-in tests: //编译测试
fileio - 文件 I/O 测试
cpu - CPU性能测试
memory - 缓存功能速度测试
threads - 线程子系统性能测试
mutex - 互斥锁的性能测试
1、使用自带的测试模块,如对cpu,I/O,memory等的测试。
2、使用自带的lua脚本进行测试,如果使用快速安装的方式,默认的脚本路径为:/usr/share/sysbench
3、使用自定义的lua脚本。
1.CPU测试:
sysbench cpu --cpu-max-prime=2000 run
--cpu-max-prime=N 质数发生器的上限 [10000]
注:使用 sysbench 1.1.0-faaff4f sysbench --test=cpu --cpu-max-prime=2000 run
会出现报错
FATAL: Cannot find benchmark 'run': no such built-in test, file or module
网上又是一堆这种教程,没有关于这种报错的记录,请路过知道的大神解惑,感谢!
2.线程测试:
sysbench threads --threads=64 --thread-yields=100 --thread-locks=2 run
--thread-yields=N 每个请求要执行的收益率数 [1000]
--thread-locks=N 每个线程的锁数[8]
fileio options:
--file-num=N 代表生成测试文件的数量 [128]
--file-block-size=N 在所有IO操作中使用的块大小 [16384]
--file-total-size=SIZE 要创建的文件的总大小 [2G]
--file-test-mode=STRING 测试模式 {seqwr, seqrewr, seqrd, rndrd, rndwr, rndrw}
--file-io-mode=STRING 文件操作模式 {sync,async,mmap} [sync]
--file-async-backlog=N 每个线程要排队的异步操作数 [128]
--file-extra-flags=[LIST,...] 用于打开文件的附加标志列表 {sync,dsync,direct} []
--file-fsync-freq=N 执行fsync()函数的频率。fsync主要是同步磁盘文件,因为可能有系统和磁盘缓冲的关系。 0代表不使用fsync函数。默认值为100。
--file-fsync-all[=on|off] 每执行完一次写操作,就执行一次fsync。默认为off。
--file-fsync-end[=on|off] 在测试结束时执行fsync函数。默认为on。
--file-fsync-mode=STRING 文件同步函数的选择,同样是和API相关的参数,由于多个操作系统对于fdatasync支持不同,因此不建议使用fdatasync。默认为fsync。
--file-merged-requests=N 大多情况下,合并可能的IO的请求数,默认为0。
--file-rw-ratio=N 测试时的读写比例,默认时为1.5,即可3:2。
sysbench fileio --threads=16 --file-total-size=1G --file-test-mode=rndrw prepare //准备
sysbench fileio --threads=16 --file-total-size=1G --file-test-mode=rndrw run //运行
sysbench fileio --threads=16 --file-total-size=1G --file-test-mode=rndrw cleanup //清理
上述参数指定了最大创建16个线程,创建的文件总大小为1G,文件读写模式为随机读。
4.内存测试:
sysbench memory --memory-block-size=8k --memory-total-size=1G run
本次测试整个过程是在内存中传输 1G 的数据量,每个 block 大小为 8K
--memory-block-size=SIZE 测试内存块的大小 [1K]
--memory-total-size=SIZE 要传输的数据的总大小100G]
--memory-scope=STRING 内存访问范围 {global,local} [global]
--memory-hugetlb[=on|off] 从内存池中分配内存[off]
--memory-oper=STRING 存储操作类型 {read, write, none} [write]
--memory-access-mode=STRING 存储器存取方式 {seq,rnd} [seq]
5.数据库性能(OLTP测试):
之前有内建的–test=oltp方法,现在改成了外部的lua脚本形式
1.在数据库创建 sbtest 库
2.准备
sysbench
--mysql-host=127.0.0.1 \
--mysql-port=3306 \
--mysql-user=root \
--mysql-password=P@ssword1! \
自己的oltp_common.lua路径 \
--tables=10 \
--table_size=100 \
prepare
tables:设定10张表
table_size:每张表100条数据
3.开始测试
sysbench
--mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=P@ssword1! \
自己的oltp_read_write.lua \
--threads=8 \
--report-interval=10 --rand-type=uniform --time=120 \
--events=0 --percentile=99 \
run >> ./log/sysbench_oltp_20190422.log
time:时间
threads:并发数为8
events:表示总请求数为 0
report-interval: 表示每10秒输出一次测试进度报告
percentile:表示设定采样比例,默认是 95%,即丢弃1%的长请求,在剩余的99%里取最大值
结果示例:
sysbench 1.1.0-faaff4f (using bundled LuaJIT 2.1.0-beta3)
Running the test with following options:
Number of threads: 8 #并发数8
Report intermediate results every 10 second(s) # 每10秒钟报告一次测试结果
Initializing random number generator from current time
Initializing worker threads...
Threads started!
#thds 线程数
#每秒传输的事物处理个数,即服务器每秒处理的事务数
#一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,即每秒的响应请求数,也即是最大吞吐能力
#r/w/o:每秒读、每秒写、其余
#lat 99%以上的响应时长统
#err 错误数
[ 10s ] thds: 8 tps: 72.05 qps: 1505.41 (r/w/o: 1059.71/80.55/365.16) lat (ms,99%): 390.30 err/s: 3.00 reconn/s: 0.00
[ 20s ] thds: 8 tps: 78.72 qps: 1576.51 (r/w/o: 1103.22/105.62/367.67) lat (ms,99%): 344.08 err/s: 0.20 reconn/s: 0.00
[ 30s ] thds: 8 tps: 77.80 qps: 1553.04 (r/w/o: 1087.06/118.40/347.59) lat (ms,99%): 458.96 err/s: 0.00 reconn/s: 0.00
[ 40s ] thds: 8 tps: 57.00 qps: 1149.08 (r/w/o: 803.89/98.30/246.90) lat (ms,99%): 549.52 err/s: 0.00 reconn/s: 0.00
[ 50s ] thds: 8 tps: 52.09 qps: 1041.88 (r/w/o: 729.32/96.09/216.48) lat (ms,99%): 816.63 err/s: 0.00 reconn/s: 0.00
[ 60s ] thds: 8 tps: 50.11 qps: 991.41 (r/w/o: 693.78/94.71/202.92) lat (ms,99%): 746.32 err/s: 0.10 reconn/s: 0.00
[ 70s ] thds: 8 tps: 67.80 qps: 1365.35 (r/w/o: 957.93/143.01/264.41) lat (ms,99%): 530.08 err/s: 0.00 reconn/s: 0.00
[ 80s ] thds: 8 tps: 65.70 qps: 1313.30 (r/w/o: 919.30/145.00/249.00) lat (ms,99%): 475.79 err/s: 0.00 reconn/s: 0.00
[ 90s ] thds: 8 tps: 63.69 qps: 1274.95 (r/w/o: 891.60/149.48/233.87) lat (ms,99%): 520.62 err/s: 0.00 reconn/s: 0.00
[ 100s ] thds: 8 tps: 69.61 qps: 1388.73 (r/w/o: 971.79/162.22/254.72) lat (ms,99%): 314.45 err/s: 0.00 reconn/s: 0.00
[ 110s ] thds: 8 tps: 75.90 qps: 1518.91 (r/w/o: 1063.31/189.50/266.10) lat (ms,99%): 287.38 err/s: 0.00 reconn/s: 0.00
[ 120s ] thds: 8 tps: 63.50 qps: 1276.50 (r/w/o: 893.33/165.29/217.88) lat (ms,99%): 484.44 err/s: 0.10 reconn/s: 0.00
SQL statistics:
queries performed: #执行的查询
read: 111748 # 读总数
write: 15482 # 写总数
other: 32337 #其他操作总数(SELECT、INSERT、UPDATE、DELETE之外的操作,例如COMMIT等)
total: 159567 #全部总数
transactions: 7948 (66.14 per sec.) #总事务数(每秒事务数)
queries: 159567 (1327.85 per sec.) #查询总数
ignored errors: 34 (0.28 per sec.) #忽略错误数
reconnects: 0 (0.00 per sec.) #重新连接数
Throughput: #吞吐量
events/s (eps): 66.1398 #每秒事件数
time elapsed: 120.1697s #花费时间
total number of events: 7948 #总事件数
Latency (ms): #等待时间
min: 20.38 #最小耗时
avg: 120.92 #平均耗时
max: 876.60 #最长耗时
99th percentile: 549.52 #超过99%平均耗时
sum: 961039.39 #总时间
Threads fairness: #并发统计
events (avg/stddev): 993.5000/10.62 #总处理事件数/标准偏差
execution time (avg/stddev): 120.1299/0.01 #平均处理事件时间/标准偏差
清除测试数据:
sysbench
--mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=P@ssword1! \
自己的oltp_read_write.lua \
--tables=10 \
cleanup