寫在前面
因爲我的科研方向是內存數據庫機制設計,所以就選了經典的高性能分佈式內存數據庫(也是關係數據庫)來作爲研究的工具基礎,以期做出足夠大貢獻的改進。
H-Store是由MIT,CMU,Brown大學聯合開發的用於學術的分佈式內存數據庫,它的商業版本是voltDB。H-Store是開源的,所以你可以完全可以研讀它的源碼,做出任意的修改併發布。H-Store下載地址是:https://github.com/apavlo/h-store,主頁是在http://hstore.cs.brown.edu/。
H-Store Benchmark
H-Store 研究者在設計之初就考慮了對各種benchmark的支持和測試,比如工業界的標準tpcc和著名的由雅虎開發的ycsb,其他的如smallbank, wikepedia benchmark, auctionmark benchmark也都可以用來測試。本文着重介紹tm1, tpcc, ycsb三種benchmark的結構以及如何測試及相應的測試結果。
tm1
這是一個模擬電信服務商電話呼叫業務的OLTP benchmark,包含四個table。
測試命令爲:
export BENCHMARK = tm1
ant hstore-prepare -Dproject=$BENCHMARK
ant hstore-benchmark -Dproject=$BENCHMARK
輸出結果如下所示:
[java] ======================================== BENCHMARK RESULTS ========================================
[java] Execution Time: 60000 ms
[java] Transactions: Total:600172 / Distributed:0 (0.0%) / SpecExec:0 (0.0%)
[java] Throughput: 10002.87 txn/s [min:9995.40 / max:10016.50 / stdev:7.89]
[java] Latency: 6.79 ms [min:5.00 / max:37.00 / stdev:2.55]
[java]
[java] ----------------------------------------------------------------------------------------------------
[java] TOTAL EXECUTED DISTRIBUTED THROUGHPUT AVG LATENCY
[java] Delete Call Forwarding: 11976 ( 2.0%) 0 ( 0.0%) 199.60 txn/s 6.79 ms
[java] Get New Destination: 60140 ( 10.0%) 0 ( 0.0%) 1002.33 txn/s 6.72 ms
[java] Update Location: 83736 ( 14.0%) 0 ( 0.0%) 1395.60 txn/s 6.81 ms
[java] Insert Call Forwarding: 12170 ( 2.0%) 0 ( 0.0%) 202.83 txn/s 10.04 ms
[java] Get Access Data: 216295 ( 36.0%) 0 ( 0.0%) 3604.92 txn/s 6.71 ms
[java] Get Subscriber Data: 203849 ( 34.0%) 0 ( 0.0%) 3397.48 txn/s 6.70 ms
[java] Update Subscriber Data: 12006 ( 2.0%) 0 ( 0.0%) 200.10 txn/s 6.73 ms
[java] ====================================================================================================
[java] Client Response Statuses:
[java] OK [583744 - 97.3%] **************************************************
[java] ABORT_USER [ 16439 - 2.7%] *
[java] ====================================================================================================
[java]
BUILD SUCCESSFUL
Total time: 1 minute 37 seconds
tpcc
這是工業界採用的標準benchmark,可以看到tpcc裏的table數量很多,如Item,Customer, Warehouse等table,都是在模擬真實的工業流水線場景。
測試命令爲:
export BENCHMARK = tpcc
ant hstore-prepare -Dproject=$BENCHMARK
ant hstore-benchmark -Dproject=$BENCHMARK
輸出結果如下所示:
[java] ======================================== BENCHMARK RESULTS ========================================
[java] Execution Time: 60000 ms
[java] Transactions: Total:600199 / Distributed:0 (0.0%) / SpecExec:0 (0.0%)
[java] Throughput: 10003.32 txn/s [min:9997.00 / max:10020.40 / stdev:8.63]
[java] Latency: 6.63 ms [min:5.00 / max:185.00 / stdev:7.35]
[java]
[java] ----------------------------------------------------------------------------------------------------
[java] TOTAL EXECUTED DISTRIBUTED THROUGHPUT AVG LATENCY
[java] Delivery: 17969 ( 3.0%) 0 ( 0.0%) 299.48 txn/s 6.73 ms
[java] New Order: 270494 ( 45.1%) 0 ( 0.0%) 4508.23 txn/s 6.62 ms
[java] Stock Level: 30262 ( 5.0%) 0 ( 0.0%) 504.37 txn/s 6.76 ms
[java] Payment: 257804 ( 43.0%) 0 ( 0.0%) 4296.73 txn/s 6.61 ms
[java] Reset Warehouse: 0 ( 0.0%) 0 ( 0.0%) 0.00 txn/s - ms
[java] Order Status: 23670 ( 3.9%) 0 ( 0.0%) 394.50 txn/s 6.60 ms
[java] ====================================================================================================
[java] Client Response Statuses:
[java] OK [600188 - 100.0%] **************************************************
[java] ABORT_USER [ 11 - 0.0%]
[java] ====================================================================================================
[java]
BUILD SUCCESSFUL
Total time: 1 minute 42 seconds
ycsb
全稱是Yahoo! Cloud Serving Benchmark,由Yahoo開發。整個數據庫只有一個usertable大表,用於測試單個table的事務處理性能。
測試命令爲:
export BENCHMARK = ycsb
ant hstore-prepare -Dproject=$BENCHMARK
ant hstore-benchmark -Dproject=$BENCHMARK
輸出結果如下所示:
[java] Execution Time: 60000 ms
[java] Transactions: Total:600177 / Distributed:0 (0.0%) / SpecExec:0 (0.0%)
[java] Throughput: 10002.95 txn/s [min:9991.20 / max:10019.70 / stdev:10.36]
[java] Latency: 5.36 ms [min:5.00 / max:27.00 / stdev:0.57]
[java]
[java] ----------------------------------------------------------------------------------------------------
[java] TOTAL EXECUTED DISTRIBUTED THROUGHPUT AVG LATENCY
[java] UpdateRecord: 294044 ( 49.0%) 0 ( 0.0%) 4900.73 txn/s 5.36 ms
[java] InsertRecord: 0 ( 0.0%) 0 ( 0.0%) 0.00 txn/s - ms
[java] DeleteRecord: 0 ( 0.0%) 0 ( 0.0%) 0.00 txn/s - ms
[java] ReadRecord: 306133 ( 51.0%) 0 ( 0.0%) 5102.22 txn/s 5.36 ms
[java] ScanRecord: 0 ( 0.0%) 0 ( 0.0%) 0.00 txn/s - ms
[java] ====================================================================================================
[java] Client Response Statuses:
[java] OK [600175 - 100.0%] **************************************************
[java] ====================================================================================================
[java]
BUILD SUCCESSFUL
Total time: 1 minute 37 seconds
機器信息
需要注意一點,在不同的機器上執行benchmark的結果會不盡相同,因爲事務處理有多快不僅取決於數據庫的設計,還取決於機器的CPU、內存等。
我是在服務器上做的,使用free命令,得到如下結果:
total used free shared buffers cached
Mem: 16323928 3116276 13207652 106288 209540 2358680
-/+ buffers/cache: 548056 15775872
Swap: 16668668 0 16668668
可以看出我使用的內存是16G,使用cat /proc/cpuinfo,得到如下結果:
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 63
model name : Intel(R) Xeon(R) CPU E5-2643 v3 @ 3.40GHz
stepping : 2
microcode : 0x2a
cpu MHz : 1286.953
cache size : 20480 KB
physical id : 0
siblings : 12
core id : 0
cpu cores : 6
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 15
wp : yes
······
可以看出cpu信息 Intel(R) Xeon(R) CPU E5-2643 v3 @ 3.40GHz。
命令行hstore使用
h-store本身就是數據庫應用,提供了命令行終端供用戶使用,進行事務處理操作。我們以tpc-c benchmark爲例演示如何使用hstore終端。
啓動server
- 開啓一個終端,進入hstore文件夾,依次敲入如下命令:
export BENCHMARK = tpcc
ant hstore-prepare -Dproject=$BENCHMARK
ant hstore-benchmark -Dproject=$BENCHAMRK -Dnoexecute=true -Dnoshutdown=true
- 開啓一個新終端,敲入命令:
./hstore tpcc
此時新終端下顯示界面如下所示:
_ _ ___ _____ ___ ___ ___
| || |___/ __|_ _/ _ \| _ \ __|
| __ |___\__ \ | || (_) | / _|
|_||_| |___/ |_| \___/|_|_\___|
Connected to localhost:21213 / Server Version: 1.0.01
hstore>
交互命令
要正確熟練地使用hstore提供的交互命令,首先要非常瞭解benchmark數據庫的結構組成:有多少個table,每個table裏有哪些attribute,每個attribute分別是什麼類型,取值範圍等等。
我們下面簡單舉幾個例子:
- 鍵入
SELECT COUNT(*) FROM CUSTOMER
返回:
Result #1 / 1
┌───────┐
│ C1 │
│ ----- │
│ 60000 │
└───────┘
1 row in set (1.25 sec)
- 鍵入
SELECT (*) FROM ITEM
返回:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2367)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:130)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:114)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:415)
at java.lang.StringBuilder.append(StringBuilder.java:132)
at edu.brown.utils.TableUtil.table(TableUtil.java:407)
at org.voltdb.utils.VoltTableUtil.format(VoltTableUtil.java:102)
at edu.brown.terminal.HStoreTerminal.formatResult(HStoreTerminal.java:450)
at edu.brown.terminal.HStoreTerminal.run(HStoreTerminal.java:189)
at edu.brown.terminal.HStoreTerminal.main(HStoreTerminal.java:491)
哦,搞砸了,堆空間數據溢出,內存不夠大了。H-Store畢竟是爲大數據服務的,因此這個benchmark本身量級也很大。
- 鍵入
SELECT (*) FROM ITEM LIMIT 5
返回:
Result #1 / 1
┌──────────────────────────────────────────────────────── ─────────────────────────────────────────────────┐
│ I_ID | I_IM_ID | I_NAME | I_PRICE | I_DATA │
│ ------------------------------------------------------------------------------------------------------- │
│ 50000 | 7930 | nrwgdbjzhcvhcailtrcg | 12.98 | qwortjdyinfphksotatcaiiduqwipt │
│ ------------------------------------------------------------------------------------------------------- │
│ 50001 | 5063 | iethsavzagfgswjjqnoklrp | 65.86 | wtlaqcggejmsvwlxnwpokuvufclxxjlc │
│ ------------------------------------------------------------------------------------------------------- │
│ 50002 | 9046 | sswmrmjybunkdlpd | 37.45 | jvobwdqfucwpwrivqkciwrbogsctfdpyqnmzbmbbvendplyfo │
│ ------------------------------------------------------------------------------------------------------- │
│ 50003 | 6934 | cuuairhbfvlyrvquufr | 97.23 | pqmmsntzxsrortlfoliaubonfpsnlhoamoqzpyxkhttaic │
│ ------------------------------------------------------------------------------------------------------- │
│ 50004 | 878 | xsnmfblnmjghgraiaut | 27.65 | vvnwmowetnqdbkklliiihhuwpppqpzgqcumcqytcolzcafu │
└──────────────────────────────────────────────────────── ─────────────────────────────────────────────────┘
5 rows in set (0.37 sec)
當然,有興趣的話還可以嘗試插入和刪除操作啦,這裏就不再贅述了,我對與數據庫SQL語句也不是特別嫺熟的說。
今天的部分就先到這裏,下回我們分析hstore的benchmark運行參數設置。