H-Store科研入門(2)

寫在前面

因爲我的科研方向是內存數據庫機制設計,所以就選了經典的高性能分佈式內存數據庫(也是關係數據庫)來作爲研究的工具基礎,以期做出足夠大貢獻的改進。

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運行參數設置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章