TPC-C是專門針對聯機交易處理系統(OLTP系統)的規范,一般情況下我們也把這類系統稱為業務處理系統。
tpcc-mysql是percona基於TPC-C(下面簡寫成TPCC)衍生出來的產品,專用於MySQL基准測試。其源碼放在launchpad上,用bazaar管理,項目地址:https://code.launchpad.net/~percona-dev/perconatools/tpcc-mysql。
一、 下載源碼包
安裝epel包後以便安裝bzr客戶端:
rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
然後就可以開始安裝bzr客戶端了:
yum install bzr
之後,就可以開始用bzr客戶端下載tpcc-mysql源碼了。
cd /tmp
bzr branch lp:~percona-dev/perconatools/tpcc-mysql
MySQL中文網便捷下載地址:
http://imysql.com/wp-content/uploads/2014/09/tpcc-mysql-src.tgz
下載到本地後,先執行 gunzip 解壓縮文件,再執行 tar xf 解包,直接 tar zxf 可能會報告異常。
tpcc-mysql的業務邏輯及其相關的幾個表作用如下:
New-Order:新訂單,一次完整的訂單事務,幾乎涉及到全部表
Payment:支付,主要對應 orders、history 表
Order-Status:訂單狀態,主要對應 orders、order_line 表
Delivery:發貨,主要對應 order_line 表
Stock-Level:庫存,主要對應 stock 表
其他相關表:
客戶:主要對應 customer 表
地區:主要對應 district 表
商品:主要對應 item 表
倉庫:主要對應 warehouse 表
二、編譯安裝
編譯非常簡單,只需要一個 make 即可。
cd /tmp/tpcc-mysql/src
make
如果 make 沒有報錯,就會在 /tmp/tpcc-mysql 下生成 tpcc 二進制命令行工具 tpcc_load 、 tpcc_start
三、TPCC測試前准備
初始化測試庫環境
cd /tmp/tpcc-mysql
mysqladmin create tpcc1000
mysql -f tpcc1000 < create_table.sql
初始化完畢後,就可以開始加載測試數據了
tpcc_load用法如下:
tpcc_load [server] [DB] [user] [pass] [warehouse]
或者
tpcc_load [server] [DB] [user] [pass] [warehouse] [part] [min_wh] [max_wh]
選項 warehouse 意為指定測試庫下的倉庫數量。
真實測試場景中,倉庫數一般不建議少於100個,視服務器硬件配置而定,如果是配備了SSD或者PCIE SSD這種高IOPS設備的話,建議最少不低於1000個。
執行下面的命令,開始灌入測試數據:
cd /tmp/tpcc-mysql
./tpcc_load localhost tpcc1000 tpcc_user "tpcc_password" 1000
在這裡,需要注意的是 tpcc 默認會讀取 /var/lib/mysql/mysql.sock 這個socket 文件。
因此,如果你的 socket 文件不在相應路徑的話,可以做個軟連接,或者通過TCP/IP的方式連接測試服務器,例如:
cd /tmp/tpcc-mysql
./tpcc_load 1.2.3.4:3306 tpcc1000 tpcc_user "tpcc_password" 1000
加載測試數據時長視倉庫數量而定,若過程比較久需要稍加耐心等待。
2015.07.22更新:
tpcc_load其實是可以並行加載的,一方面是可以區分 ITEMS、WAREHOUSE、CUSTOMER、ORDERS 四個維度的數據並行加載。
另外,比如最終想加載1000個 warehouse的話,也可以分開成1000個並發並行加載的。看下 tpcc_load 工具的參數就知道了:
usage: tpcc_load [server] [DB] [user] [pass] [warehouse]
OR
tpcc_load [server] [DB] [user] [pass] [warehouse] [part] [min_wh] [max_wh]
* [part]: 1=ITEMS 2=WAREHOUSE 3=CUSTOMER 4=ORDERS
本來想自己寫個並行加載腳本的,後來發現萬能的github上已經有人做好了,我就直接拿來用了,這是項目鏈接 tpcc_load_parallel.sh,加載效率至少提升10倍以上。
四、進行TPCC測試
tpcc_start 工具用於tpcc壓測,其用法如下:
tpcc_start -h server_host -P port -d database_name -u mysql_user \
-p mysql_password -w warehouses -c connections -r warmup_time \
-l running_time -i report_interval -f report_file
幾個選項稍微解釋下
-w 指定倉庫數量
-c 指定並發連接數
-r 指定開始測試前進行warmup的時間,進行預熱後,測試效果更好
-l 指定測試持續時間
-i 指定生成報告間隔時長
-f 指定生成的報告文件名
現在我們來開啟一個測試案例:
tpcc_start -hlocalhost -d tpcc1000 -u tpcc_user -p "tpcc_password" \
-w 1000 -c 32 -r 120 -l 3600 \
-f tpcc_mysql_20140921.log >> tpcc_caseX_20140921.log 2>&1
即:模擬 1000個倉庫規模,並發 16個線程進行測試,熱身時間為 60秒, 壓測時間為 1小時。
真實測試場景中,建議預熱時間不小於5分鐘,持續壓測時長不小於30分鐘,否則測試數據可能不具參考意義。
五、TPCC測試結果解讀:
發起測試:
./tpcc_start -h 1.2.3.4 -P 3306 -d tpcc10 -u tpcc -p tpcc \
-w 10 -c 64 -r 30 -l 120 \
-f tpcclog_201409211538_64_THREADS.log >> tpcc_noaid_2_20140921_64.log 2>&1
測試結果輸出如下:
-- 本輪tpcc壓測的一些基本信息
***************************************
*** ###easy### TPC-C Load Generator ***
***************************************
option h with value '1.2.3.4' -- 主機
option P with value '3306' -- 端口
option d with value 'tpcc10' -- 數據庫
option u with value 'tpcc' -- 賬號
option p with value 'tpcc' -- 密碼
option w with value '10' -- 倉庫數
option c with value '64' -- 並發線程數
option r with value '30' -- 數據預熱時長
option l with value '120' -- 壓測時長
option f with value 'tpcclog_20140921_64_THREADS.res' -- 輸出報告日志文件
[server]: 1.2.3.4
[port]: 3306
[DBname]: tpcc10
[user]: tpcc
[pass]: tpcc
[warehouse]: 10
[connection]: 64
[rampup]: 30 (sec.)
[measure]: 120 (sec.)
RAMP-UP TIME.(30 sec.)
-- 預熱結束,開始進行壓測
MEASURING START.
-- 每10秒鐘輸出一次壓測數據
10, 8376(0):2.744|3.211, 8374(0):0.523|1.626, 838(0):0.250|0.305, 837(0):3.241|3.518, 839(0):9.086|10.676
20, 8294(0):2.175|2.327, 8292(0):0.420|0.495, 829(0):0.206|0.243, 827(0):2.489|2.593, 827(0):7.214|7.646
…
110, 8800(0):2.149|2.458, 8792(0):0.424|0.710, 879(0):0.207|0.244, 878(0):2.461|2.556, 878(0):7.042|7.341
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%事務的響應時間|本輪測試最大響應時間,新訂單事務數也被認為是總有效事務數的指標
-- 第三列,支付業務成功執行次數(推遲執行次數):90%事務的響應時間|本輪測試最大響應時間
-- 第四列,訂單狀態業務的結果,後面幾個的意義同上
-- 第五列,物流發貨業務的結果,後面幾個的意義同上
-- 第六列,庫存倉儲業務的結果,後面幾個的意義同上
-- 壓測結束
STOPPING THREADS................................................................
-- 第一次結果統計
[0] sc:100589 lt:0 rt:0 fl:0 -- New-Order,新訂單業務成功(success,簡寫sc)次數,延遲(late,簡寫lt)次數,重試(retry,簡寫rt)次數,失敗(failure,簡寫fl)次數
[1] sc:100552 lt:0 rt:0 fl:0 -- Payment,支付業務統計,其他同上
[2] sc:10059 lt:0 rt:0 fl:0 -- Order-Status,訂單狀態業務統計,其他同上
[3] sc:10057 lt:0 rt:0 fl:0 -- Delivery,發貨業務統計,其他同上
[4] sc:10058 lt:0 rt:0 fl:0 -- Stock-Level,庫存業務統計,其他同上
in 120 sec.
-- 第二次統計結果,其他同上
[0] sc:100590 lt:0 rt:0 fl:0
[1] sc:100582 lt:0 rt:0 fl:0
[2] sc:10059 lt:0 rt:0 fl:0
[3] sc:10057 lt:0 rt:0 fl:0
[4] sc:10059 lt:0 rt:0 fl:0
(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結果值(每分鐘事務數,該值是第一次統計結果中的新訂單事務數除以總耗時分鐘數,例如本例中是:100589/2 = 50294.500)
script目錄下的一些腳本主要是一些性能數據采集以及分析的,可以自行摸索下怎麼用。