安裝、使用、測試 sysbench
下載地址:
https://github.com/akopytov/sysbench/tree/0.5
進入解壓目錄,并且創建安裝目錄:
[root@10-248-56-192 software]# unzip sysbench-0.5.zip
[root@10-248-56-192 software]# cd sysbench-0.5
安裝依賴包:yum -y install automake autoconf libtool
準備編譯:
./autogen.sh
遇到報錯:
~~~
[root@localhost sysbench-0.4.12.14]# ./autogen.sh
./autogen.sh: running `libtoolize --copy --force'
libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, `config'.
libtoolize: copying file `config/ltmain.sh'
libtoolize: putting macros in AC_CONFIG_MACRO_DIR, `m4'.
libtoolize: copying file `m4/libtool.m4'
libtoolize: copying file `m4/ltoptions.m4'
libtoolize: copying file `m4/ltsugar.m4'
libtoolize: copying file `m4/ltversion.m4'
libtoolize: copying file `m4/lt~obsolete.m4'
./autogen.sh: running `aclocal -I m4'
./autogen.sh: running `autoheader'
./autogen.sh: running `automake -c --foreign --add-missing'
./autogen.sh: running `autoconf'
configure.ac:49: error: possibly undefined macro: AC_LIB_PREFIX
If this token and others are legitimate, please use m4_pattern_allow.
See the Autoconf documentation.
Can't execute autoconf
~~~
查閱資料,解決方法;
[root@localhost sysbench-0.4.12.14]# cat configure.ac | grep AC_LIB_PREFIX
AC_LIB_PREFIX()
注釋掉這個函數就可以了
./configure
ERROR: cannot find MySQL libraries. If you want to compile with MySQL support 沒找到mysql庫 需要用參數指定下 --with-mysql-includes和--with-mysql-libs
`./configure --prefix=/usr/sysbench/ --with-mysql-includes=/usr/include/mysql/ --with-mysql-libs=/usr/lib64/ --with-mysql`
由于是yum安裝的mysql,我也不知道路徑在哪里。如何查找mysql的安裝路徑?
安裝mysql-devel,才能使用mysql_config
~~~
#yum install -y mysql-devel
#mysql_config -help
Usage: /usr/bin/mysql_config-64 [OPTIONS]
Options:
--cflags [-I/usr/include/mysql -g -fstack-protector -m64 -fPIC -g -fabi-version=2 -fno-omit-frame-pointer -fno-strict-aliasing]
--cxxflags [-I/usr/include/mysql -g -fexceptions -fstack-protector -m64 -fPIC -g -fabi-version=2 -fno-omit-frame-pointer -fno-strict-aliasing]
--include [-I/usr/include/mysql]
--libs [-L/usr/lib64/mysql -lmysqlclient -lpthread -lm -lrt -ldl]
--libs_r [-L/usr/lib64/mysql -lmysqlclient -lpthread -lm -lrt -ldl]
--plugindir [/usr/lib64/mysql/plugin]
--socket [/var/lib/mysql/mysql.sock]
--port [0]
--version [5.6.39]
--libmysqld-libs [-L/usr/lib64/mysql -lmysqld -lpthread -lm -lrt -lcrypt -ldl -laio -lnuma]
--variable=VAR VAR is one of:
pkgincludedir [/usr/include/mysql]
pkglibdir [/usr/lib64/mysql]
plugindir [/usr/lib64/mysql/plugin]
~~~
報錯:
configure: error: cannot find MySQL client libraries in /usr/lib64/
編譯之前,先處理一下mysql的庫,默認查找libmysqlclient_r.so,可是mysql默認為libmysqlclient.so,內容完全一樣,做個鏈接即可
ln -s /usr/lib64/libmysqlclient.so.15.0.0 /usr/lib64/libmysqlclient_r.so
4、make && make install
5、此時在終端中輸入sysbench命令會出現
-bash: sysbench: command not found
將編譯的安裝目錄添加至環境變量:
export PATH=$PATH:/usr/sysbench/bin
source .bash_profile
6. 執行下命令:
~~~
#sysbench --help
#sysbench: error while loading shared libraries: libmysqlclient.so.20: cannot open shared object file: No such file or directory
#問題原因:sysbench無法找到mysql的庫文件,可能是環境變量LD_LIBRARY_PATH沒有設置,設置后即可解決該問題:
#export LD_LIBRARY_PATH=/alidata/server/mysql5.7/lib/lib
#sysbench --version
sysbench 1.0.12 (using bundled LuaJIT 2.1.0-beta2)
~~~
查詢sysbench是否正確安裝 sysbench –v
開始測試
1、CPU測試?
sysbench?CPU測試使用64位整數,測試計算素數直到某個最大值所需要的時間
sysbench --test=cpu --cpu-max-prime=20000 run
輸出如下:
Maximum prime number checked in CPU test: 200000
Test execution summary:
total time: 286.5703s
total number of events: 10000
total time taken by event execution: 285197.4463
per-request statistics:
min: 109.67ms
avg: 28519.74ms
max: 36760.02ms
approx. 95 percentile: 31751.56ms
Threads fairness:
events (avg/stddev): 9.7656/0.81
execution time (avg/stddev): 278.5131/6.05
我們只需要關心測試的總時間(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
在sysbench的測試中,–num-threads取值為”線程數量”即可,再大的值沒有什么意義,對測試結果也沒有什么影響。
#3.2 線程(thread)測試
測試線程調度器的性能。對于高負載情況下測試線程調度器的行為非常有用。
sysbench --test=threads --num-threads=64 run
下面是輸出結果:
Number of threads: 64
Doing thread subsystem performance test
Thread yields per test: 1000 Locks used: 8
Threads started!
Done.
Test execution summary:
total time: 4.5845s
total number of events: 10000
total time taken by event execution: 291.9995
per-request statistics:
min: 0.76ms
avg: 29.20ms
max: 152.71ms
approx. 95 percentile: 71.11ms
Threads fairness:
events (avg/stddev): 156.2500/5.81
execution time (avg/stddev): 4.5625/0.02
說實話,我也不怎么會分析這個測試結果,網上搜了半天也沒有搜到,幾乎所有的資料都是簡單的羅列出測試結果, 也不告訴我們應該怎么分析,實在是太不照顧新手了。 我自己是通過(total time:)判斷線程調度的性能的,下面是我在服務器上運行這個測試的輸出:
Number of threads: 64
Doing thread subsystem performance test
Thread yields per test: 1000 Locks used: 8
Threads started!
Done.
Test execution summary:
total time: 2.4829s
total number of events: 10000
total time taken by event execution: 157.3468
per-request statistics:
min: 0.21ms
avg: 15.73ms
max: 166.69ms
approx. 95 percentile: 119.14ms
Threads fairness:
events (avg/stddev): 156.2500/22.25
execution time (avg/stddev): 2.4585/0.02
可以看到total time 比在我自己電腦上少了一半,服務器的線程調度肯定比普通電腦快多了。
#3.3 互斥鎖(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
為了不誤導別人,我就不解釋各參數的含義了,可以請參考這里。
##3.4 內存測試
內存測試測試了內存的連續讀寫性能。
sysbench --test=memory --memory-block-size=8K --memory-total-size=2G --num-threads=16 run
上面這條語句指定了整個測試過程中,傳輸2G的數據量,每個block的大小為8K(大寫的K)。 測試結果如下所示,我們最關心的是吞吐量(8030.45MB/sec),和后面的磁盤io 測試結果比較可知,內存的連續讀寫比磁盤的連續讀寫快十幾倍。
Number of threads: 16
Doing memory operations speed test
Memory block size: 8K
Memory transfer size: 2048M
Memory operations type: write
Memory scope type: global
Threads started!
Done.
Operations performed: 262144 (1027897.89 ops/sec)
2048.00 MB transferred (8030.45 MB/sec)
Test execution summary:
total time: 0.2550s
total number of events: 262144
total time taken by event execution: 3.1911
per-request statistics:
min: 0.00ms
avg: 0.01ms
max: 29.55ms
approx. 95 percentile: 0.00ms
Threads fairness:
events (avg/stddev): 16384.0000/926.14
execution time (avg/stddev): 0.1994/0.02
##3.5 文件IO基準測試
文件IO(fileio)基準測試可以測試系統在不同IO負載下的性能。這對于比較不同的硬盤驅動器,不同的RAID 卡,不同的RAID 模式,都很有幫助。可以根據測試結果調整IO子系統。文件IO基準測試模擬了很多InnoDB 的IO特性。
測試的第一步是準備(Prepare)階段,生成測試用到的數據文件,生成的數據文件至少要比內存大。 如果文件中的數據能完全放入內存中,則操作系統 緩存大部分的數據,導致測試結果無法體現IO密集型的工作負載。首先通過下面的命令創建一個數據集:
sysbench --test=fileio --file-total-size=40G prepare
這個命令會在當前工作目錄下創建測試文件,后續的運行(run)階段將通過讀寫這些文件進行測試。 第二步就是運行(run)階段,針對不同的IO 類型有不同的測試選項:
seqwr 順序寫入
seqrewr 順序重寫
seqrd 順序讀取
rndrd 隨機讀取
rndwr 隨機寫入
rndrw 混合隨機讀/寫
下面的命令運行文件I/O混合隨機讀/寫基準測試:
sysbench --test=fileio --file-total-size=40G --file-test-mode=rndrw\
--init-rng=on --max-time=300 --max-requests=0 run
結果如下:
Extra file open flags: 0
128 files, 240Mb each
30Gb total file size
Block size 16Kb
Number of random requests for random IO: 0
Read/Write ratio for combined random IO test: 1.50
Periodic FSYNC enabled, calling fsync() each 100 requests.
Calling fsync() at the end of test, Enabled.
Using synchronous I/O mode
Doing random r/w test
Threads started!
Time limit exceeded, exiting...
Done.
Operations performed: 15900 Read, 10600 Write, 33842 Other = 60342 Total
Read 248.44Mb Written 165.62Mb Total transferred 414.06Mb (1.3802Mb/sec)
88.33 Requests/sec executed
Test execution summary:
total time: 300.0074s
total number of events: 26500
total time taken by event execution: 164.1563
per-request statistics:
min: 0.01ms
avg: 6.19ms
max: 315.51ms
approx. 95 percentile: 15.83ms
Threads fairness:
events (avg/stddev): 26500.0000/0.00
execution time (avg/stddev): 164.1563/0.00
輸出結果中包含了大量的信息。和IO子系統密切相關的包括每秒請求數和總吞吐量。在上述例子中, 每秒請求數是88.33 Requests/sec , 吞吐量是1.3802Mb/sec 。另外,時間信息也非常有用, 尤其是大約95%的時間分布。這些數據對于評估磁盤性能十分有用。
測試完成以后,運行清除(cleanup)操作刪除第一步生成的測試文件。
sysbench --test=fileio --fil-total-size=30G cleanup
##3.6 oltp
下面來看最重要也是最復雜的測試————oltp。oltp 基準測試模擬了一個簡單的事物處理系統的工作負載。 下面的例子使用的是一張超過百萬行記錄的表,第一步是先生成這張表:
sysbench --test=oltp --oltp-table-size=1000000 --mysql-db=test \
--mysql-user=root prepare
生成數據只需要上面這條簡單的命令即可。這條命令在test 數據庫中新建了一個表(sbtest),并在表中插入了1000000條記錄。
對于非默認安裝的mysql,需要指定連接到msyql服務器的socket(my.cnf中的socket值),如下所示:
sysbench --test=oltp --oltp-table-size=1000000 --mysql-user=root \
--mysql-db=test --mysql-socket=/data/ntse/lmx/sysbench/var/mysqld.sock \
prepare
數據加載完成以后就可以開始測試了,這個例子采用了16個線程,測試時長為720秒:
sysbench --test=oltp --oltp-table-size=1000000 --mysql-db=test \
--mysql-user=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 cases)
Using "BEGIN" for starting transactions
Using auto_inc on the id column
Threads started!
Time limit exceeded, exiting...
(last message repeated 15 times)
Done.
OLTP test statistics:
queries performed:
read: 26225724
write: 9366330
other: 3746532
total: 39338586
transactions: 1873266 (2601.71 per sec.)
deadlocks: 0 (0.00 per sec.)
read/write requests: 35592054 (49432.47 per sec.)
other operations: 3746532 (5203.42 per sec.)
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 sec.)。
oltp 測試注意事項:
**0.4版本的測試選項,0.5版本就通過lua的模式來測試。**
–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 這種模式只是簡單的執行selec語句。
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
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模式和在complex模式下開啟read-only選項都只包含select語句。但是 simple 模式只包含最簡單的select語句,相反地,complex 模式中,如果我們開啟read-only 選項,即--oltp-read-only=on,則會包含復雜的SQL語句。如:
SELECT SUM(K) FROM sbtest WHERE id BETWEEN N and M
SELECT DISTINCT c FROM sbtest WHERE id BETWEEN N and M ORDER BY c
測試自有的存儲引擎
測試自有的存儲引擎需要告訴sysbench,這個存儲引擎是否支持事務。
如下所示:
準備
sysbench --test=oltp --mysql-table-engine=tnt --mysql-engine-trx=yes \
--oltp-table-size=100000 --mysql-user=root --mysql-db=test \
--mysql-socket=/data/ntse/lmx/sysbench/var/mysqld.sock \
prepare
測試
sysbench --test=oltp --mysql-table-engine=tnt --mysql-engine-trx=yes \
--oltp-table-size=100000 --mysql-user=root --mysql-db=test \
--mysql-socket=/data/ntse/lmx/sysbench/var/mysqld.sock \
--oltp-test-mode=complex --num-threads=16 --max-time=720 \
--max-requests=0 run
清除
sysbench --test=oltp --mysql-table-engine=tnt --mysql-engine-trx=yes \
--oltp-table-size=100000 --mysql-user=root --mysql-db=test \
--mysql-socket=/data/ntse/lmx/sysbench/var/mysqld.sock \
clean
- 一、日常運維腳本
- 1.1 批量創建用戶并賦予sudo權限
- 1.2 批量主機建立互信
- 1.3create_images.sh
- 1.4monitor.sh
- 1.5ftp腳本
- 1.6格式化分區
- 1.7簡單的遠程執行腳本
- 二、常用服務使用
- 1 ceph (分布式文件系統)
- 1.1 ceph 簡介
- 1.2 準備環境
- 1.3 開始部署
- 1.4 cephfs掛載
- 1.5 RBD塊存儲
- 1.6 object 對象存儲
- 1.7 集群擴展
- 1.7.1 增加刪除MON
- 1.7.2 增加刪除OSD
- 1.7.3 刪除MDS
- 注意事項
- 遇到的問題
- 1.8ceph查找數據文件
- 1.9卸載并清理環境
- 2、mysql (數據庫)
- 2.1 搭建
- 2.2 使用教程
- 2.2.1 mysql基礎配置
- 2.2.1.1 用戶權限管理
- 2.2.1.2用戶資源限制
- 2.2.1.3 密碼管理
- 2.2.1.4用戶lock
- 2.2.2mysql語法詳解
- 2.2.1建庫、表語句
- 2.2.2.2 插入 insert
- 2.2.2.3更新 update
- 2.2.2.4刪除 delete
- 2.2.2.5查詢 select
- 2.2.6視圖 索引 view index
- 2.2.7 修改 alert
- 2.2.2.8清理 truncate drop
- 2.2.9重命名 rename
- 示例語句
- 2.2.3mysql常用函數
- 2.3.1 對比操作符統概
- 2.3.2對比操作符詳解
- 2.3.3邏輯操作符
- 2.2.4分配操作符
- 2.2.5流程控制函數
- 2.2.6字符串函數
- 2.2.7字符串對比函數
- 2.2.8數字函數
- 2.2.9日期和時間函數
- 2.2.10聚合/格式轉換函數
- 2.2.11 子查詢
- 示例語句
- 2.2.4 mysql 高級應用
- 2.2.4.1 存儲過程 函數
- 2.2.4.2流程控制
- 2.2.4.3游標
- 2.2.4.4觸發器
- 課堂練習
- 2.2.2.5 數據庫設計
- 2.2.5.1 數據類型
- 2.2.5.2存儲引擎
- 2.2.6Innodb內核
- 1、innodb事務和多版本控制
- 2、體系結構
- 3、InnoDB配置
- 4、buffer pool設置
- 5、其他配置
- innodb限制
- 2.7 字符集
- 2.8鎖機制和事務
- 2.8.1鎖機制
- 2.8.2事務
- 2.9分區
- 2.9.1 自動分區
- 2.10復制
- 2.11mysql搬移數據目錄
- 2.12組復制 GR
- 簡介
- 搭建
- 2.3日常運維
- 2.3.1定時任務
- 2.4mycat
- 2.4.1 報錯分析
- 2.4.2 修改字符集
- 2.11 mycat使用
- 2.5遇到問題
- 2.5.1 表名庫名忽略大小寫
- 3、PAAS平臺搭建
- 問題匯總
- 1、docker
- 2、日常運維
- 3.1 Kubernetes
- 3.1 kubernetes 高版本搭建
- 4、GlusterFS搭建
- 5、MooseFS搭建
- 5.1搭建
- 5.2運維
- 5.2.1 mfs日志解析
- 5.2.2清理mfs的垃圾數據
- 5.2.3元數據故障恢復
- 5.2.4 MFS優化
- 5.2.5 配置機架感知
- 5.2.6 客戶端工具集
- 6、集群切換命令
- 7、ntp服務
- 8、monggoDB
- 8.1搭建單機
- 2、搭建集群及分片
- 9、MariaDB Galera Cluster
- 9.1源碼安裝MariaDB
- 9.2galera cluster 優劣
- 9.3 rpm安裝mariadb
- 10 HAproxy1.7搭建
- 11、sysbench 搭建使用
- 0.5版本
- 12 percona-xtradb-cluster
- 13http服務相關
- 13.1 http狀態碼解析
- 14 zookeeper
- 14.1 zookeeper日志查看
- 14.2 配置解析
- 14.3 優化
- 15搭建私有pip源
- 16/var/log的日志文件解釋
- 15 ansible的搭建及使用
- 15.1 搭建
- 15.2 使用說明
- 16. 搭建本地yum源
- zookeeper
- 優化
- 四、開發語言
- 1、GO語言
- 1.1go簡介
- 1.1.1hello_world初識GO
- 1.1.2并發介紹
- 1.1.3 chan介紹
- 1.1.4多返回值
- 1.2go基礎
- 1.2.1數據類型
- 1.2.2 go基礎結構
- 1.2.3 const及變量介紹
- 1.2.3os和time介紹
- 1.2.4 字符串
- 1.2.5條件判斷
- 1.2.6 homework
- go--help
- 1.3 go基礎2
- 1.3.1 數組 array
- 1.3.2切片 slice
- 1.3.3 時間和日期
- 1.3.4指針類型
- 1.3.5函數
- 1.3.6可變參數
- 1.3.7 defer
- 1.3.8遞歸
- 1.9閉包
- 1.10 map
- 1.11 sort
- 1.12 struct 結構體
- 2.perl語言
- 2.1 安裝lib包
- 3 python
- 1.語言基礎
- 2、編程教學
- 2.1變量和序列
- 2.2 條件語句