參考:mysql
https://yq.aliyun.com/articles/66651git
下載sysbench:github
http://github.com/akopytov/sysbenchsql
sysbench文檔:ubuntu
http://github.com/akopytov/sysbenchcentos
安裝:緩存
1)源碼安裝:bash
build requirements:服務器
1.ubuntu:併發
apt -y install make automake libtool pkg-config libaio-dev
# For MySQL support
apt -y install libmysqlclient-dev libssl-dev
# For PostgreSQL support
apt install libpq-dev
2.centos:
yum -y install make automake libtool pkgconfig libaio-devel
# For MySQL support, replace with mysql-devel on RHEL/CentOS 5
yum -y install mariadb-devel openssl-devel
# For PostgreSQL support
yum -y install postgresql-devel
build and install:
./autogen.sh
# Add --with-pgsql to build with PostgreSQL support
./configure
make -j
make install
2)二進制包安裝:
1.ubuntu:
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.deb.sh | sudo bash
sudo apt -y install sysbench
2.centos:
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
sudo yum -y install sysbench
測試:
1)測試cpu:sysbench --test=cpu --cpu-max-prime=2000 run
2) 測試線程:sysbench --test=threads --num-threads=500 --thread-yields=100 --thread-locks=4 run
3) 測試IO:
準備
sysbench --test=fileio --num-threads=16 --file-total-size=2G --file-test-mode=rndrw prepare
測試
sysbench --test=fileio --num-threads=16 --file-total-size=2G --file-test-mode=rndrw run
清理
sysbench --test=fileio --num-threads=20 --file-total-size=2G --file-test-mode=rndrw cleanup
4)測試內存:sysbench --test=memory --memory-block-size=8k --memory-total-size=1G run
5)測試oltp:
1.準備階段,生成須要測試的表(測試生成10個表,每一個表5000000條數據)
sysbench --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=yourpassword --test=tests/db/oltp.lua(根據具體位置填寫) --oltp_tables_count=10 --oltp-table-size=5000000 --rand-init=on prepare
參數詳解:
--test=tests/db/oltp.lua 表示調用 tests/db/oltp.lua 腳本進行 oltp 模式測試
--oltp_tables_count=10 表示會生成 10 個測試表
--oltp-table-size=5000000 表示每一個測試表填充數據量爲 5000000
--rand-init=on 表示每一個測試表都是用隨機數據來填充的
若是在本機,也可使用 –mysql-socket 指定 socket 文件來鏈接。加載測試數據時長視數據量而定,若過程比較久須要稍加耐心等待。
真實測試場景中,數據表建議不低於10個,單表數據量不低於500萬行,固然了,要視服務器硬件配置而定。若是是配備了SSD或者PCIE SSD這種高IOPS設備的話,則建議單表數據量最少不低於1億行。
2.oltp測試:
這次測試啓動了256個線程,10個測試表,每一個表中灌入500W條數據,測試時間1個小時
./sysbench --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=yourpassword --test=tests/db/oltp.lua --oltp_tables_count=10 --oltp-table-size=5000000 --num-threads=256 --oltp-read-only=off --report-interval=10 --rand-type=uniform --max-time=3600 --max-requests=1000000 --percentile=99 run >> ./log/sysbench_oltpX_256_20160403.log
幾個選項稍微解釋下
--num-threads=8 表示發起 8個併發鏈接
--oltp-read-only=off 表示不要進行只讀測試,也就是會採用讀寫混合模式測試
--report-interval=10 表示每10秒輸出一次測試進度報告
--rand-type=uniform 表示隨機類型爲固定模式,其餘幾個可選隨機模式:uniform(固定),gaussian(高斯),special(特定的),pareto(帕累託)
--max-time=3600 表示最大執行時長爲 3600秒
--oltp-test-mode 執行模式,這裏是非事務式的。可選值有simple,complex,nontrx。默認是complex
--max-requests=0 表示總請求數爲 0,由於上面已經定義了總執行時長,因此總請求數能夠設定爲 0;也能夠只設定總請求數,不設定最大執行時長
--percentile=99 表示設定採樣比例,默認是 95%,即丟棄1%的長請求,在剩餘的99%裏取最大值
即:模擬 對10個表併發OLTP測試,每一個表1000萬行記錄,持續壓測時間爲 1小時。
測試結果:
sysbench 0.5: multi-threaded system evaluation benchmark Running the test with following options: Number of threads: 256 Report intermediate results every 10 second(s) Random number generator seed is 0 and will be ignored -- 線程啓動 Threads started! -- 每10秒鐘報告一次測試結果,tps、每秒讀、每秒寫、99%以上的響應時長統計 [ 10s] threads: 256, tps: 524.19, reads/s: 7697.05, writes/s: 2143.56, response time: 1879.46ms (99%) [ 20s] threads: 256, tps: 96.50, reads/s: 1351.01, writes/s: 373.30, response time: 9853.49ms (99%) [ 30s] threads: 256, tps: 235.50, reads/s: 3297.01, writes/s: 946.90, response time: 2150.47ms (99%) [ 40s] threads: 256, tps: 115.50, reads/s: 1617.00, writes/s: 491.40, response time: 4562.75ms (99%) [ 50s] threads: 256, tps: 262.10, reads/s: 3669.41, writes/s: 1016.10, response time: 2049.90ms (99%) [ 60s] threads: 256, tps: 121.50, reads/s: 1701.00, writes/s: 499.10, response time: 3666.03ms (99%) [ 70s] threads: 256, tps: 201.40, reads/s: 2735.10, writes/s: 769.50, response time: 3867.82ms (99%) [ 80s] threads: 256, tps: 204.70, reads/s: 2950.29, writes/s: 838.10, response time: 2724.99ms (99%) [ 90s] threads: 256, tps: 118.40, reads/s: 1657.61, writes/s: 490.00, response time: 3835.53ms (99%) OLTP test statistics: queries performed: read: 8823206 -- 讀總數 write: 2520916 -- 寫總數 other: 1260458 -- 其餘操做總數(SELECT、INSERT、UPDATE、DELETE以外的操做,例如COMMIT等) total: 12604580 -- 所有總數 transactions: 630229 (174.94 per sec.) -- 總事務數(每秒事務數) deadlocks: 0 (0.00 per sec.) -- 發生死鎖總數 read/write requests: 11344122 (3148.86 per sec.) -- 讀寫總數(每秒讀寫次數) other operations: 1260458 (349.87 per sec.) -- 其餘操做總數(每秒其餘操做次數) General statistics: -- 一些統計結果 total time: 3602.6152s -- 總耗時 total number of events: 630229 -- 共發生多少事務數 total time taken by event execution: 921887.7227s -- 全部事務耗時相加(不考慮並行因素) response time: -- 響應時間 min: 6.52ms -- 最小耗時 avg: 1462.78ms -- 平均耗時 max: 9918.51ms -- 最長耗時 approx. 99 percentile: 3265.01ms -- 超過99%平均耗時 Threads fairness: -- 線程的穩定性 events (avg/stddev): 2461.8320/34.60 -- 事件(平均值/誤差) execution time (avg/stddev): 3601.1239/0.63 -- 執行時間(平均值/誤差)
每輪測試完成後,都重啓mysqld實例,而且用下面的方法刪除系統cache,釋放swap(若是用到了swap的話),甚至能夠重啓整個OS。
# sync -- 將髒數據刷新到磁盤
# sync -- 將髒數據刷新到磁盤
# echo 3 > /proc/sys/vm/drop_caches -- 清除OS Cache
# swapoff -a && swapon -a -- 清除OS swap緩存
四、再次啓動測試流程
清理測試數據
./sysbench --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=yourpassword --test=tests/db/oltp.lua --oltp_tables_count=10 --oltp-table-size=5000000 --num-threads=256 --oltp-read-only=off --report-interval=10 --rand-type=uniform --max-time=3600 --max-requests=1000000 --percentile=99 cleanup