標籤:mysql tpcc-mysql
由於測試環境使用的是經過裁剪過的線上環境的ISO鏡像,所以在初始階段碰到了很多問題:
第一個錯誤:# cd /root/tpcc-mysql/src && makecc -w -O2 -g -I. `mysql_config --include` -c load.ccc -w -O2 -g -I. `mysql_config --include` -c support.ccc load.o support.o `mysql_config --libs_r` -lrt -o ../tpcc_load/usr/bin/ld: cannot find -lsslcollect2: ld returned 1 exit statusmake: *** [../tpcc_load] Error 1 解決方案:安裝openssl-devel 第二個錯誤: libperconaserverclient.so報錯,貌似/etc/ld.so.conf.d/mysql.conf定義沒有生效,不知道為什麼!# ln -sv /opt/mysql/lib/libperconaserverclient.so.18.1.0 /usr/lib64/libperconaserverclient.so 另外,在/root/mysql-tpcc/load中也可以直接定義lib export LD_LIBRARY_PATH=/opt/mysql/lib 第三個錯誤: 當使用tpcc_load載入完資料,進行壓力測試時,卻報錯"Segmentation fault" , 搜尋資料發現,大概意思是許可權問題, 使用echo "0" > /proc/sys/kernel/randomize_va_space命令無效 在重新編譯tpcc_load也無效的情況,只能挨個測試環境的問題。 首先,在rpm安裝的mysql-5.1.73上面可以正常使用,確定了不是tpcc-mysql版本問題; 接著,在rpm安裝的percona-5.6上面可以正常使用,確定了不是percona-5.6的問題; 最後,當然從自身找原因,無奈水平有限! 多次測試後,發現使用"/opt/mysql/support-files/binary-configure"產生的表,不會再有錯誤產生。、u 查看其資訊,“./scripts/mysql_install_db --no-defaults” ——“Don‘t read default options from any option file.” 相比我不加任何參數的去初始化,這裡依然會去讀取/etc/my.cnf, 所以依然不明所以!但是至少目前能夠使用了! 第四個錯誤: 在匯入表結構後,不要立即加索引,因為網上大部分資料都是這麼寫的。這會加長匯入資料的時間。 另外,還不明白的一點是,一次tpcc_load後的資料庫,能不能多次tpcc_start使用?
OK,tpcc-mysql start:
# mysqladmin create tpcc1000; # mysql tpcc1000 < create_table.sql;# ./tpcc_load 127.0.0.1:3306 tpcc1000 root "" 100 # mysql tpcc1000 < add_fkey_idx.sql# ./tpcc_start -h127.0.0.1 -P3306 -d tpcc1000 -uroot -c 23 -r 3600 -l 10800 -w 500 > tpcc100.log # 葉金榮部落格提到對於SSD需要測試1000個倉庫才能測出準確的結果,但目前情況緊急,所以折半!鑒於第一次測試,所以壓測時間縮短為3個小時。
Done!
結果詳解解讀:http://imysql.cn/2014/10/10/tpcc-mysql-full-user-manual.shtml
New-Order:新訂單,一次完整的訂單事務,幾乎涉及到全部表Payment:支付,主要對應 orders、history 表Order-Status:訂單狀態,主要對應 orders、order_line 表Delivery:發貨,主要對應 order_line 表Stock-Level:庫存,主要對應 stock 表其他相關表:客戶:主要對應 customer 表地區:主要對應 district 表商品:主要對應 item 表倉庫:主要對應 warehouse 表
結果分析
120, 8819(0):2.147|2.327, 8820(0):0.424|0.568, 882(0):0.208|0.237, 881(0):2.483|2.561, 883(0):7.025|7.405 -- 以“逗號”分隔,共6列-- 第一列,第N次10秒-- 第二列,新訂單成功執行壓測的次數(括弧內,延遲執行壓測的次數):90%事務的回應時間|本輪測試最大回應時間, 新訂單事務數也被認為是總有效事務數的指標,也就是在這10秒內總共完成的多少次完整的事務。-- 第三列,支付業務成功執行次數(延遲執行次數):90%事務的回應時間|本輪測試最大回應時間-- 第四列,訂單狀態業務的結果,後面幾個的意義同上-- 第五列,物流發貨業務的結果,後面幾個的意義同上-- 第六列,庫存倉儲業務的結果,後面幾個的意義同
最終成績:
(all must be [OK]) -- 下面所有商務邏輯結果都必須為 OK 才行 [transaction percentage] Payment: 43.47% (>=43.0%) [OK] -- 支付成功次數(上述統計結果中 sc + lt)必須大於43.0%,否則結果為NG,而不是OK Order-Status: 4.35% (>= 4.0%) [OK] -- 訂單狀態,其他同上 Delivery: 4.35% (>= 4.0%) [OK] -- 發貨,其他同上 Stock-Level: 4.35% (>= 4.0%) [OK] -- 庫存,其他同上 [response time (at least 90% passed)] -- 響應耗時指標必須超過90%通過才行 New-Order: 100.00% [OK] -- 下面幾個響應耗時指標全部 100% 通過 Payment: 100.00% [OK] Order-Status: 100.00% [OK] Delivery: 100.00% [OK] Stock-Level: 100.00% [OK] 50294.500 TpmC -- TpmC結果值,Tpm表示transaction per minute,每分鐘已執行的事務總量,而C表示基準測試! (每分鐘事務數,該值是“第一次統計結果”中的新訂單事務數除以總耗時分鐘數,例如本例中是:100589/2 = 50294.500)
結果出來後,需要做成圖形,首先得先將需要的資料截取出來:這裡取得是第一列的時間和第二列的已完成事務數量。
# vim tpcc-output-analyze.sh#!/bin/shTIMESLOT=1if [ -n "$2" ]thenTIMESLOT=$2ficat $1 | grep -v HY000 | grep -v payment | grep -v neword | awk -v timeslot=$TIMESLOT ‘BEGIN { FS="[,():]"; s=0; cntr=0; aggr=0 } /MEASURING START/ { s=1} /STOPPING THREADS/ {s=0} /0/ { if (s==1) { cntr++; aggr+=$2; } if ( cntr==timeslot ) { printf ("%d %3d\n",$1,(aggr/timeslot)) ; cntr=0; aggr=0 } }‘
然後,就是圖形工具的操作了:
# vim log.confset terminal gif small size 1024,768 #指定輸出成gif圖片,且圖片大小為550×25set output "performance_fenxibaogao_dierci" #指定產生的gif圖片的檔案名稱set title "MySQL transaction performance" #圖片標題set style data lines #顯示網格set xlabel "The N ge ten second" #X軸標題set ylabel "transaction completed shuliang" #Y軸標題set grid #顯示網格plot "tpcc-graphic-data.txt" using 1:2 title "transactions_completed_shuliang per ten second" with lines # 從tpcc-graphic-data.txt檔案中讀取第一列和第二列作為X軸和Y軸資料, # 樣本名"Total throughput"
tpcc-mysql 壓力測試出圖操作:
# tpcc-output-analyze.sh tpcc1000.log > tpcc-graphic-data.txt# cat log.conf | gnuplot 注意:gnulot安裝時,不需要圖形介面,你可以在伺服器上安裝後,再拉到本地,當然線上是不可能的了!
壓力測試時,當然不能忘記使用其他方式統計qps,因為qp10s的波動有點大,(以下又是抄的高效能mysql中的內容,呵呵!)
#vim qps.sh#!/bin/bashINTERVAL=5PREFIX=$INTERVAL-sec-statusRUNFILE=/tmp/runningmysql -e ‘SHOW GLOBAL VARIABLES‘ >> mysql-variableswhile test -e $RUNFILE;dofile=$(date +%F_%I)sleep=$(date +%s.%N |awk "{print $INTERVAL - (\$1 % $INTERVAL)}")sleep $sleepts="$(date +"TS %s.%N %F %T")"loadavg="$(uptime)"echo "$ts $loadavg" >> $PREFIX-${file}-statusmysql -e ‘SHOW GLOBAL STATUS‘ >> $prefix-${file}-status &echo "$ts $loadavg" >> $PREFIX-${file}-innodbstatusmysql -e ‘SHOW ENGINE INNODB STATUS\G‘ >> $PREFIX-${file}-innodb-status &echo "$ts $loadavg" >> $PREFIX-${file}-processlistmysql -e ‘SHOW FULL PROCESSLIST\G‘ >> $PREFIX-${file}-processlist &echo $tsdoneecho Exiting because $RUNFILE does not exist
正如作者所言,注意這裡的sleep的技巧!
下面是qps分析指令碼:
# vim fenxi.sh#!/bin/bashawk ‘BEGIN{printf "#ts date time load QPS";fmt= "%.2f";}/^TS/{ # The timestamp lines begin with TS.ts= substr($2,1,index($2,"." - 1);load= NF - 2;diff= ts - prev_ts;prev_ts= ts;printf "\n%s %s %s %s", ts, $3, $4, substr($load, 1, length($load)-1);}/Queries/ {printf fmt, ($2-Queries)/diff;Queries= $2}‘ "[email protected]"
本文出自 “Go right on” 部落格,請務必保留此出處http://caduke.blog.51cto.com/3365689/1657450
tpcc-mysql 對percona5.6進行壓力測試