測(cè)試工具
測(cè)試工具
1. 基本概述
IoT-benchmark 是基于 Java 和大數(shù)據(jù)環(huán)境開發(fā)的時(shí)序數(shù)據(jù)庫(kù)基準(zhǔn)測(cè)試工具,由清華大學(xué)軟件學(xué)院研發(fā)并開源。它使用方便,支持多種寫入以及查詢方式,支持存儲(chǔ)測(cè)試信息和結(jié)果以供進(jìn)一步查詢或分析,支持與 Tableau 集成以可視化測(cè)試結(jié)果。
下圖1-1囊括了測(cè)試基準(zhǔn)流程及其他擴(kuò)展功能。這些流程可以由IoT-benchmark 統(tǒng)一來(lái)完成。IoT Benchmark 支持多種工作負(fù)載,包括純寫入、純查詢、寫入查詢混合等,支持軟硬件系統(tǒng)監(jiān)控、測(cè)試指標(biāo)度量等監(jiān)控功能,還實(shí)現(xiàn)了初始化數(shù)據(jù)庫(kù)自動(dòng)化、測(cè)試數(shù)據(jù)分析及系統(tǒng)參數(shù)優(yōu)化等功能。

圖1-1
借鑒 YCSB 測(cè)試工具將工作負(fù)載生成、性能指標(biāo)測(cè)量和數(shù)據(jù)庫(kù)接口三個(gè)組件分離的設(shè)計(jì)思想,IoT-benchmark 的模塊化設(shè)計(jì)如圖1-2所示。與基于 YCSB 的測(cè)試工具系統(tǒng)不同的是,IoT-benchmark 增加了系統(tǒng)監(jiān)控模塊,支持測(cè)試數(shù)據(jù)和系統(tǒng)指標(biāo)監(jiān)控?cái)?shù)據(jù)的持久化。此外也增加了一些特別針對(duì)時(shí)序數(shù)據(jù)場(chǎng)景的特殊負(fù)載測(cè)試功能,如支持物聯(lián)網(wǎng)場(chǎng)景的批量寫入和多種亂序數(shù)據(jù)寫入模式。

圖1-2
目前 IoT-benchmark 支持如下時(shí)間序列數(shù)據(jù)庫(kù)、版本和連接方式:
| 數(shù)據(jù)庫(kù) | 版本 | 連接方式 |
|---|---|---|
| IoTDB | v1.x v2.x | jdbc、sessionByTablet、sessionByRecord、sessionByRecords |
| InfluxDB | v1.x v2.x | SDK |
| TimescaleDB | -- | jdbc |
| OpenTSDB | -- | Http Request |
| QuestDB | v6.0.7 | jdbc |
| TDengine | v2.2.0.2 | jdbc |
| VictoriaMetrics | v1.64.0 | Http Request |
| KairosDB | -- | Http Request |
表1-1大數(shù)據(jù)測(cè)試基準(zhǔn)對(duì)比
2. 安裝運(yùn)行
2.1 前置條件
- Java 8
- Maven 3.6+
- 對(duì)應(yīng)的合適版本的數(shù)據(jù)庫(kù),如 Apache IoTDB 2.0
2.2 獲取方式
- 獲取二進(jìn)制包:進(jìn)入這里 下載需要的安裝包。下載下來(lái)為一個(gè)壓縮文件,選擇文件夾解壓即可使用。
- 源代碼編譯(可用 Apache IoTDB 2.0 的測(cè)試):
- 第一步(編譯 IoTDB Session 最新包):進(jìn)入官網(wǎng)下載 IoTDB 源碼,在根目錄下運(yùn)行命令 mvn clean package install -pl session -am -DskipTests 編譯 IoTDB Session 的最新包。
- 第二步(編譯 IoTDB Benchmark 測(cè)試包):進(jìn)入官網(wǎng)下載源碼,在根目錄下運(yùn)行 mvn clean package install -pl iotdb-2.0 -am -DskipTests 編譯測(cè)試 Apache IoTDB 2.0版本的測(cè)試包,測(cè)試包位置與根目錄的相對(duì)路徑為 ./iotdb-2.0/target/iotdb-2.0-0.0.1/iotdb-2.0-0.0.1
2.3 測(cè)試包結(jié)構(gòu)
測(cè)試包的目錄結(jié)構(gòu)如下所示。其中測(cè)試配置文件為conf/config.properties,測(cè)試啟動(dòng)腳本為benchmark.sh (Linux & MacOS) 和 benchmark.bat (Windows),詳細(xì)文件用途見下表所示。
-rw-r--r--. 1 root root 2881 1月 10 01:36 benchmark.bat
-rwxr-xr-x. 1 root root 314 1月 10 01:36 benchmark.sh
drwxr-xr-x. 2 root root 24 1月 10 01:36 bin
-rwxr-xr-x. 1 root root 1140 1月 10 01:36 cli-benchmark.sh
drwxr-xr-x. 2 root root 107 1月 10 01:36 conf
drwxr-xr-x. 2 root root 4096 1月 10 01:38 lib
-rw-r--r--. 1 root root 11357 1月 10 01:36 LICENSE
-rwxr-xr-x. 1 root root 939 1月 10 01:36 rep-benchmark.sh
-rw-r--r--. 1 root root 14 1月 10 01:36 routine| 名稱 | 子文件 | 用途 |
|---|---|---|
| benchmark.bat | - | Windows環(huán)境運(yùn)行啟動(dòng)腳本 |
| benchmark.sh | - | Linux/Mac環(huán)境運(yùn)行啟動(dòng)腳本 |
| bin | startup.sh | 初始化腳本文件夾 |
| conf | config.properties | 測(cè)試場(chǎng)景配置文件 |
| lib | - | 依賴庫(kù)文件 |
| LICENSE | - | 許可文件 |
| cli-benchmark.sh | - | 一鍵化啟動(dòng)腳本 |
| routine | 多項(xiàng)測(cè)試配置文件 | |
| rep-benchmark.sh | 多項(xiàng)測(cè)試啟動(dòng)腳本 |
表2-1文件和文件夾列表用途
2.4 執(zhí)行測(cè)試
- 按照測(cè)試需求修改配置文件,主要參數(shù)介紹見第3節(jié),對(duì)應(yīng)配置文件為conf/config.properties,比如測(cè)試Apache IoTDB 2.0,則需要修改 DB_SWITCH=IoTDB-200-SESSION_BY_TABLET
- 啟動(dòng)被測(cè)時(shí)間序列數(shù)據(jù)庫(kù)
- 通過(guò)運(yùn)行
- 啟動(dòng)IoT-benchmark執(zhí)行測(cè)試。執(zhí)行中觀測(cè)被測(cè)時(shí)間序列數(shù)據(jù)庫(kù)和IoT-benchmark狀態(tài),執(zhí)行完畢后查看結(jié)果和分析測(cè)試過(guò)程。
2.5 結(jié)果說(shuō)明
測(cè)試的所有日志文件被存放于 logs 文件夾下,測(cè)試的結(jié)果在測(cè)試完成后被存放到 data/csvOutput 文件夾下,例如測(cè)試后我們得到了如下的結(jié)果矩陣:

- Result Matrix
- OkOperation:成功的對(duì)應(yīng)操作次數(shù)
- OkPoint:對(duì)于寫入操作,是成功寫入的點(diǎn)數(shù);對(duì)于查詢操作,是成功查詢到的點(diǎn)數(shù)。
- FailOperation:失敗的對(duì)應(yīng)操作次數(shù)
- FailPoint:對(duì)于寫入操作是寫入失敗的點(diǎn)數(shù)
- Latency(mx) Matrix
- AVG:操作平均耗時(shí)
- MIN:操作最小耗時(shí)
- Pn:操作整體分布的對(duì)應(yīng)分位值,比如P25是下四分位數(shù)
3. 主要參數(shù)
3.1 IoTDB服務(wù)模型
參數(shù)IoTDB_DIALECT_MODE支持tree、table,默認(rèn)值為tree。
- 當(dāng)被測(cè)數(shù)據(jù)庫(kù)為IoTDB-2.0及以上版本時(shí)需指定sql_dialect, 并且一個(gè)IoTDB只能指定一種。
- sql_dialect等于tree時(shí),要滿足:device數(shù)量 >= database數(shù)量
3.2 工作模式
工作模式參數(shù)“BENCHMARK_WORK_MODE”可選項(xiàng)有如下四種模式:
- 常用測(cè)試模式:結(jié)合配置
OPERATION_PROPORTION參數(shù)達(dá)到“純寫入”、“純查詢”和“讀寫混合”的測(cè)試操作。 - 生成數(shù)據(jù)模式:為了生成可以重復(fù)使用的數(shù)據(jù)集,iot-benchmark提供生成數(shù)據(jù)集的模式,生成數(shù)據(jù)集到FILE_PATH,以供后續(xù)使用正確性寫入模式和正確性查詢模式使用。
- 單數(shù)據(jù)庫(kù)正確性寫入模式:為了驗(yàn)證數(shù)據(jù)集寫入的正確性,您可以使用該模式寫入生成數(shù)據(jù)模式中生成的數(shù)據(jù)集,目前該模式僅支持IoTDB v1.0 及更新的版本和InfluxDB v1.x。
- 單數(shù)據(jù)庫(kù)正確性查詢模式:在運(yùn)行這個(gè)模式之前需要先使用正確性寫入模式寫入數(shù)據(jù)到數(shù)據(jù)庫(kù)。為了驗(yàn)證數(shù)據(jù)集寫入的正確性,您可以使用該模式查詢寫入到數(shù)據(jù)庫(kù)中的數(shù)據(jù)集,目前該模式僅支持IoTDB v1.0 和 InfluxDB v1.x。
| 模式名稱 | BENCHMARK_WORK_MODE | 模式內(nèi)容 |
|---|---|---|
| 常規(guī)測(cè)試模式 | testWithDefaultPath | 支持多種讀和寫操作的混合負(fù)載 |
| 生成數(shù)據(jù)模式 | generateDataMode | 生成Benchmark本身識(shí)別的數(shù)據(jù) |
| 單數(shù)據(jù)庫(kù)正確性寫入模式 | verificationWriteMode | 需要配置 FILE_PATH 以及 DATA_SET |
| 單數(shù)據(jù)庫(kù)正確性查詢模式 | verificationQueryMode | 需要配置 FILE_PATH 以及 DATA_SET |
3.3 服務(wù)器連接信息
工作模式指定后,被測(cè)時(shí)序數(shù)據(jù)庫(kù)的信息會(huì)通過(guò)如下參數(shù)告知IoT-benchmark
| 參數(shù)名稱 | 類型 | 示例 | 系統(tǒng)描述 |
|---|---|---|---|
| DB_SWITCH | 字符串 | IoTDB-200-SESSION_BY_TABLET | 被測(cè)時(shí)序數(shù)據(jù)庫(kù)類型 |
| HOST | 字符串 | 127.0.0.1 | 被測(cè)時(shí)序數(shù)據(jù)庫(kù)網(wǎng)絡(luò)地址 |
| PORT | 整數(shù) | 6667 | 被測(cè)時(shí)序數(shù)據(jù)庫(kù)網(wǎng)絡(luò)端口 |
| USERNAME | 字符串 | root | 被測(cè)時(shí)序數(shù)據(jù)庫(kù)登錄用戶名 |
| PASSWORD | 字符串 | root | 被測(cè)時(shí)序數(shù)據(jù)庫(kù)登錄用戶的密碼 |
| DB_NAME | 字符串 | test | 被測(cè)時(shí)序數(shù)據(jù)庫(kù)名稱 |
| TOKEN | 字符串 | 被測(cè)時(shí)序數(shù)據(jù)庫(kù)連接認(rèn)證Token(InfluxDB 2.0使用) |
3.4 寫入場(chǎng)景
| 參數(shù)名稱 | 類型 | 示例 | 系統(tǒng)描述 |
|---|---|---|---|
| CLIENT_NUMBER | 整數(shù) | 100 | 客戶端總數(shù) |
| GROUP_NUMBER | 整數(shù) | 20 | 數(shù)據(jù)庫(kù)的數(shù)量;僅針對(duì)IoTDB。 |
| DEVICE_NUMBER | 整數(shù) | 100 | 設(shè)備總數(shù) |
| SENSOR_NUMBER | 整數(shù) | 300 | 每個(gè)設(shè)備的傳感器總數(shù); 如果使用 IoTDB 表模型,則控制屬性列數(shù)量 |
| INSERT_DATATYPE_PROPORTION | 字符串 | 1:1:1:1:1:1 | 設(shè)備的數(shù)據(jù)類型比例,BOOLEAN:INT32:INT64:FLOAT:DOUBLE:TEXT |
| POINT_STEP | 整數(shù) | 1000 | 數(shù)據(jù)間時(shí)間戳間隔,即生成的數(shù)據(jù)兩個(gè)時(shí)間戳之間的固定長(zhǎng)度。 |
| OP_MIN_INTERVAL | 整數(shù) | 0 | 操作最小執(zhí)行間隔:若操作耗時(shí)大于該值則立即執(zhí)行下一個(gè),否則等待 (OP_MIN_INTERVAL-實(shí)際執(zhí)行時(shí)間) ms;如果為0,則參數(shù)不生效;如果為-1,則其值和POINT_STEP一致 |
| IS_OUT_OF_ORDER | 布爾 | false | 是否亂序?qū)懭?/td> |
| OUT_OF_ORDER_RATIO | 浮點(diǎn)數(shù) | 0.3 | 亂序?qū)懭氲臄?shù)據(jù)比例 |
| BATCH_SIZE_PER_WRITE | 整數(shù) | 1 | 批寫入數(shù)據(jù)行數(shù)(一次寫入多少行數(shù)據(jù)) |
| START_TIME | 時(shí)間 | 2022-10-30T00:00:00+08:00 | 寫入數(shù)據(jù)的開始時(shí)間戳;以該時(shí)間戳為起點(diǎn)開始模擬創(chuàng)建數(shù)據(jù)時(shí)間戳。 |
| LOOP | 整數(shù) | 86400 | 總操作次數(shù):具體每種類型操作會(huì)按OPERATION_PROPORTION定義的比例劃分 |
| OPERATION_PROPORTION | 字符 | 1:0:0:0:0:0:0:0:0:0:0 | # 各操作的比例,按照順序?yàn)?寫入:Q1:Q2:Q3:Q4:Q5:Q6:Q7:Q8:Q9:Q10, 請(qǐng)注意使用英文冒號(hào)。比例中的每一項(xiàng)是整數(shù)。 |
3.5 查詢場(chǎng)景
| 參數(shù)名稱 | 類型 | 示例 | 系統(tǒng)描述 |
|---|---|---|---|
| QUERY_DEVICE_NUM | 整數(shù) | 2 | 每條查詢語(yǔ)句中查詢涉及到的設(shè)備數(shù)量 |
| QUERY_SENSOR_NUM | 整數(shù) | 2 | 每條查詢語(yǔ)句中查詢涉及到的傳感器數(shù)量 |
| QUERY_AGGREGATE_FUN | 字符 | count | 在聚集查詢中使用的聚集函數(shù),比如count、avg、sum、max_time等 |
| STEP_SIZE | 整數(shù) | 1 | 時(shí)間過(guò)濾條件的時(shí)間起點(diǎn)變化步長(zhǎng),若設(shè)為0則每個(gè)查詢的時(shí)間過(guò)濾條件是一樣的,單位:POINT_STEP |
| QUERY_INTERVAL | 整數(shù) | 250000 | 起止時(shí)間的查詢中開始時(shí)間與結(jié)束時(shí)間之間的時(shí)間間隔,和Group By中的時(shí)間間隔 |
| QUERY_LOWER_VALUE | 整數(shù) | -5 | 條件查詢子句時(shí)的參數(shù),where xxx > QUERY_LOWER_VALUE |
| GROUP_BY_TIME_UNIT | 整數(shù) | 20000 | Group by語(yǔ)句中的組的大小 |
| LOOP | 整數(shù) | 10 | 總操作次數(shù):具體每種類型操作會(huì)按OPERATION_PROPORTION定義的比例劃分 |
| OPERATION_PROPORTION | 字符 | 0:0:0:0:0:0:0:0:0:0:1 | 寫入:Q1:Q2:Q3:Q4:Q5:Q6:Q7:Q8:Q9:Q10 |
3.6 操作比例
| 編號(hào) | 查詢類型 | IoTDB 示例 SQL |
|---|---|---|
| Q1 | 精確點(diǎn)查詢 | select v1 from root.db.d1 where time = ? |
| Q2 | 時(shí)間范圍查詢 | select v1 from root.db.d1 where time > ? and time < ? |
| Q3 | 帶值過(guò)濾的時(shí)間范圍查詢 | select v1 from root.db.d1 where time > ? and time < ? and v1 > ? |
| Q4 | 時(shí)間范圍聚合查詢 | select count(v1) from root.db.d1 where and time > ? and time < ? |
| Q5 | 帶值過(guò)濾的全時(shí)間范圍聚合查詢 | select count(v1) from root.db.d1 where v1 > ? |
| Q6 | 帶值過(guò)濾的時(shí)間范圍聚合查詢 | select count(v1) from root.db.d1 where v1 > ? and time > ? and time < ? |
| Q7 | 時(shí)間分組聚合查詢 | select count(v1) from root.db.d1 group by ([?, ?), ?, ?) |
| Q8 | 最新點(diǎn)查詢 | select last v1 from root.db.d1 |
| Q9 | 倒序范圍查詢 | select v1 from root.sg.d1 where time > ? and time < ? order by time desc |
| Q10 | 倒序帶值過(guò)濾的范圍查詢 | select v1 from root.sg.d1 where time > ? and time < ? and v1 > ? order by time desc |
3.7 測(cè)試過(guò)程和測(cè)試結(jié)果持久化
IoT-benchmark目前支持通過(guò)配置參數(shù)將測(cè)試過(guò)程和測(cè)試結(jié)果持久化:
| 參數(shù)名稱 | 類型 | 示例 | 系統(tǒng)描述 |
|---|---|---|---|
| TEST_DATA_PERSISTENCE | 字符串 | None | 結(jié)果持久化選擇,支持None,IoTDB,MySQL和CSV |
| RECORD_SPLIT | 布爾 | true | 是否將結(jié)果劃分后輸出到多個(gè)記錄, IoTDB 暫時(shí)不支持 |
| RECORD_SPLIT_MAX_LINE | 整數(shù) | 10000000 | 記錄行數(shù)的上限(每個(gè)數(shù)據(jù)庫(kù)表或CSV文件按照總行數(shù)為1千萬(wàn)切分存放) |
| TEST_DATA_STORE_IP | 字符串 | 127.0.0.1 | 輸出數(shù)據(jù)庫(kù)的IP地址 |
| TEST_DATA_STORE_PORT | 整數(shù) | 6667 | 輸出數(shù)據(jù)庫(kù)的端口號(hào) |
| TEST_DATA_STORE_DB | 字符串 | result | 輸出數(shù)據(jù)庫(kù)的名稱 |
| TEST_DATA_STORE_USER | 字符串 | root | 輸出數(shù)據(jù)庫(kù)的用戶名 |
| TEST_DATA_STORE_PW | 字符串 | root | 輸出數(shù)據(jù)庫(kù)的用戶密碼 |
- 如果我們?cè)O(shè)置“
TEST_DATA_PERSISTENCE=CSV”,測(cè)試執(zhí)行時(shí)和執(zhí)行完畢后我們可以在IoT-benchmark根目錄下看到新生成的data文件夾,其下包含csv文件夾記錄測(cè)試過(guò)程;csvOutput文件夾記錄測(cè)試結(jié)果。 - 如果我們?cè)O(shè)置“
TEST_DATA_PERSISTENCE=MySQL”,它會(huì)在測(cè)試開始前在指定的MySQL數(shù)據(jù)庫(kù)中創(chuàng)建命名如“testWithDefaultPath_被測(cè)數(shù)據(jù)庫(kù)名稱_備注_測(cè)試啟動(dòng)時(shí)間”的數(shù)據(jù)表記錄測(cè)試過(guò)程;會(huì)在名為“CONFIG”的數(shù)據(jù)表(如果不存在則創(chuàng)建該表),寫入本次測(cè)試的配置信息;當(dāng)測(cè)試完成時(shí)會(huì)在名為“FINAL_RESULT”的數(shù)據(jù)表(如果不存在則創(chuàng)建該表)中寫入本次測(cè)試結(jié)果。
3.8 自動(dòng)化腳本
一鍵化啟動(dòng)腳本
您可以通過(guò)cli-benchmark.sh腳本一鍵化啟動(dòng)IoTDB、監(jiān)控的IoTDB Benchmark和測(cè)試的IoTDB Benchmark,但需要注意該腳本啟動(dòng)時(shí)會(huì)清理IoTDB中的所有數(shù)據(jù),請(qǐng)謹(jǐn)慎使用。
首先,您需要修改cli-benchmark.sh中的IOTDB_HOME參數(shù)為您本地的IoTDB所在的文件夾。
然后您可以使用腳本啟動(dòng)測(cè)試
> ./cli-benchmark.sh測(cè)試完成后您可以在logs文件夾中查看測(cè)試相關(guān)日志,在server-logs文件夾中查看監(jiān)控相關(guān)日志。
自動(dòng)執(zhí)行多項(xiàng)測(cè)試
通常,除非與其他測(cè)試結(jié)果進(jìn)行比較,否則單個(gè)測(cè)試是沒有意義的。因此,我們提供了一個(gè)接口來(lái)通過(guò)一次啟動(dòng)執(zhí)行多個(gè)測(cè)試。
- 配置 routine
這個(gè)文件的每一行應(yīng)該是每個(gè)測(cè)試過(guò)程會(huì)改變的參數(shù)(否則就變成復(fù)制測(cè)試)。例如,"例程"文件是:
LOOP=10 DEVICE_NUMBER=100 TEST
LOOP=20 DEVICE_NUMBER=50 TEST
LOOP=50 DEVICE_NUMBER=20 TEST然后依次執(zhí)行3個(gè)LOOP參數(shù)分別為10、20、50的測(cè)試過(guò)程。
注意:
您可以使用“LOOP=20 DEVICE_NUMBER=10 TEST”等格式更改每個(gè)測(cè)試中的多個(gè)參數(shù),不允許使用不必要的空間。 關(guān)鍵字"TEST"意味著新的測(cè)試開始。如果您更改不同的參數(shù),更改后的參數(shù)將保留在下一次測(cè)試中。
- 開始測(cè)試
配置文件routine后,您可以通過(guò)啟動(dòng)腳本啟動(dòng)多測(cè)試任務(wù):
> ./rep-benchmark.sh然后測(cè)試信息將顯示在終端中。
注意:
如果您關(guān)閉終端或失去與客戶端機(jī)器的連接,測(cè)試過(guò)程將終止。 如果輸出傳輸?shù)浇K端,則與任何其他情況相同。
使用此接口通常需要很長(zhǎng)時(shí)間,您可能希望將測(cè)試過(guò)程作為守護(hù)程序執(zhí)行。這樣,您可以通過(guò)啟動(dòng)腳本將測(cè)試任務(wù)作為守護(hù)程序啟動(dòng):
> ./rep-benchmark.sh > /dev/null 2>&1 &在這種情況下,如果您想知道發(fā)生了什么,可以通過(guò)以下命令查看日志信息:
> cd ./logs
> tail -f log_info.log4. 實(shí)際案例
我們以中車青島四方車輛研究所有限公司應(yīng)用為例,參考《ApacheIoTDB在智能運(yùn)維平臺(tái)存儲(chǔ)中的應(yīng)用》中描述的場(chǎng)景進(jìn)行實(shí)際操作說(shuō)明。
測(cè)試目標(biāo):模擬中車青島四方所場(chǎng)景因切換時(shí)間序列數(shù)據(jù)庫(kù)實(shí)際需求,對(duì)比預(yù)期使用的IoTDB和原有系統(tǒng)使用的KairosDB性能。
測(cè)試環(huán)境:為了保證在實(shí)驗(yàn)過(guò)程中消除其他無(wú)關(guān)服務(wù)與進(jìn)程對(duì)數(shù)據(jù)庫(kù)性能的影響,以及不同數(shù)據(jù)庫(kù)之間的相互影響,本實(shí)驗(yàn)中的本地?cái)?shù)據(jù)庫(kù)均部署并運(yùn)行在資源配置相同的多個(gè)獨(dú)立的虛擬機(jī)上。因此,本實(shí)驗(yàn)搭建了 4 臺(tái) Linux( CentOS7 /x86) 虛擬機(jī),并分別在上面部署了IoT-benchmark、 IoTDB數(shù)據(jù)庫(kù)、KairosDB數(shù)據(jù)庫(kù)、MySQL數(shù)據(jù)庫(kù)。每一臺(tái)虛擬機(jī)的具體資源配置如表4-1所示。每一臺(tái)虛擬機(jī)的具體用途如表4-2所示。
表4-1虛擬機(jī)配置信息
| 硬件配置信息 | 系統(tǒng)描述 |
|---|---|
| OS System | CentOS7 |
| CPU核數(shù) | 16 |
| 內(nèi)存 | 32G |
| 硬盤 | 200G |
| 網(wǎng)卡 | 千兆 |
表4-2虛擬機(jī)用途
| IP | 用途 |
|---|---|
| 172.21.4.2 | IoT-benchmark |
| 172.21.4.3 | Apache-iotdb |
| 172.21.4.4 | KaiosDB |
| 172.21.4.5 | MySQL |
4.1 寫入測(cè)試
場(chǎng)景描述:創(chuàng)建100個(gè)客戶端來(lái)模擬100列車、每列車3000個(gè)傳感器、數(shù)據(jù)類型為DOUBLE類型、數(shù)據(jù)時(shí)間間隔為500ms(2Hz)、順序發(fā)送。參考以上需求我們需要修改IoT-benchmark配置參數(shù)如表4-3中所列。
表4-3配置參數(shù)信息
| 參數(shù)名稱 | IoTDB值 | KairosDB值 |
|---|---|---|
| DB_SWITCH | IoTDB-013-SESSION_BY_TABLET | KairosDB |
| HOST | 172.21.4.3 | 172.21.4.4 |
| PORT | 6667 | 8080 |
| BENCHMARK_WORK_MODE | testWithDefaultPath | |
| OPERATION_PROPORTION | 1:0:0:0:0:0:0:0:0:0:0 | |
| CLIENT_NUMBER | 100 | |
| GROUP_NUMBER | 10 | |
| DEVICE_NUMBER | 100 | |
| SENSOR_NUMBER | 3000 | |
| INSERT_DATATYPE_PROPORTION | 0:0:0:0:1:0 | |
| POINT_STEP | 500 | |
| OP_MIN_INTERVAL | 0 | |
| IS_OUT_OF_ORDER | false | |
| BATCH_SIZE_PER_WRITE | 1 | |
| LOOP | 10000 | |
| TEST_DATA_PERSISTENCE | MySQL | |
| TEST_DATA_STORE_IP | 172.21.4.5 | |
| TEST_DATA_STORE_PORT | 3306 | |
| TEST_DATA_STORE_DB | demo | |
| TEST_DATA_STORE_USER | root | |
| TEST_DATA_STORE_PW | admin | |
| REMARK | demo |
首先在172.21.4.3和172.21.4.4上分別啟動(dòng)被測(cè)時(shí)間序列數(shù)據(jù)庫(kù)Apache-IoTDB和KairosDB,之后在172.21.4.2、172.21.4.3和172.21.4.4上通過(guò)ser-benchamrk.sh腳本啟動(dòng)服務(wù)器資源監(jiān)控(圖4-1)。然后按照表4-3在172.21.4.2分別修改iotdb-0.13-0.0.1和kairosdb-0.0.1文件夾內(nèi)的conf/config.properties文件滿足測(cè)試需求。先后使用benchmark.sh啟動(dòng)對(duì)Apache-IoTDB和KairosDB的寫入測(cè)試。

圖4-1服務(wù)器監(jiān)控任務(wù)
? 例如我們首先啟動(dòng)對(duì)KairosDB的測(cè)試,IoT-benchmark會(huì)在MySQL數(shù)據(jù)庫(kù)中創(chuàng)建CONFIG數(shù)據(jù)表存放本次測(cè)試配置信息(圖4-2),測(cè)試執(zhí)行中會(huì)有日志輸出當(dāng)前測(cè)試進(jìn)度(圖4-3)。測(cè)試完成時(shí)會(huì)輸出本次測(cè)試結(jié)果(圖4-3),同時(shí)將結(jié)果寫入FINAL_RESULT數(shù)據(jù)表中(圖4-4)。

圖4-2測(cè)試配置信息表




圖4-3測(cè)試進(jìn)度和結(jié)果

圖4-4測(cè)試結(jié)果表
之后我們?cè)賳?dòng)對(duì)Apache-IoTDB的測(cè)試,同樣的IoT-benchmark會(huì)在MySQL數(shù)據(jù)庫(kù)CONFIG數(shù)據(jù)表中寫入本次測(cè)試配置信息,測(cè)試執(zhí)行中會(huì)有日志輸出當(dāng)前測(cè)試進(jìn)度。測(cè)試完成時(shí)會(huì)輸出本次測(cè)試結(jié)果,同時(shí)將結(jié)果寫入FINAL_RESULT數(shù)據(jù)表中。
依照測(cè)試結(jié)果信息我們知道同樣的配置寫入Apache-IoTDB和KairosDB寫入延時(shí)時(shí)間分別為:55.98ms和1324.45ms;寫入吞吐分別為:5,125,600.86點(diǎn)/秒和224,819.01點(diǎn)/秒;測(cè)試分別執(zhí)行了585.30秒和11777.99秒。并且KairosDB有寫入失敗出現(xiàn),排查后發(fā)現(xiàn)是數(shù)據(jù)磁盤使用率已達(dá)到100%,無(wú)磁盤空間繼續(xù)接收數(shù)據(jù)。而Apache-IoTDB無(wú)寫入失敗現(xiàn)象,全部數(shù)據(jù)寫入完畢后占用磁盤空間僅為4.7G(如圖4-5所示);從寫入吞吐和磁盤占用情況上看Apache-IoTDB均優(yōu)于KairosDB。當(dāng)然后續(xù)還有其他測(cè)試來(lái)從多方面觀察和對(duì)比,比如查詢性能、文件壓縮比、數(shù)據(jù)安全性等。

圖4-5磁盤使用情況
那么測(cè)試過(guò)程中各個(gè)服務(wù)器資源使用情況如何呢?每個(gè)寫操作具體的表現(xiàn)如何呢?這個(gè)時(shí)候我們就可以通過(guò)安裝和使用Tableau來(lái)可視化服務(wù)器監(jiān)控表和測(cè)試過(guò)程記錄表內(nèi)的數(shù)據(jù)了。Tableau的使用本文不展開介紹,通過(guò)它連接測(cè)試數(shù)據(jù)持久化的數(shù)據(jù)表后具體結(jié)果下如圖(以Apache-IoTDB為例):


圖4-6Tableau可視化測(cè)試過(guò)程
4.2 查詢測(cè)試
場(chǎng)景描述:在寫入測(cè)試場(chǎng)景下模擬10個(gè)客戶端對(duì)時(shí)序數(shù)據(jù)庫(kù)Apache-IoTDB內(nèi)存放的數(shù)據(jù)進(jìn)行全類型查詢?nèi)蝿?wù)。配置如下:
表4-4配置參數(shù)信息
| 參數(shù)名稱 | 示例 |
|---|---|
| CLIENT_NUMBER | 10 |
| QUERY_DEVICE_NUM | 2 |
| QUERY_SENSOR_NUM | 2 |
| QUERY_AGGREGATE_FUN | count |
| STEP_SIZE | 1 |
| QUERY_INTERVAL | 250000 |
| QUERY_LOWER_VALUE | -5 |
| GROUP_BY_TIME_UNIT | 20000 |
| LOOP | 30 |
| OPERATION_PROPORTION | 0:1:1:1:1:1:1:1:1:1:1 |
執(zhí)行結(jié)果:

圖4-7查詢測(cè)試結(jié)果
4.3 其他參數(shù)說(shuō)明
之前章節(jié)中針對(duì)Apache-IoTDB和KairosDB進(jìn)行寫入性能對(duì)比,但是用戶如果要執(zhí)行模擬真實(shí)寫入速率測(cè)試該如何配置?測(cè)試時(shí)間過(guò)長(zhǎng)該如何控制呢?生成的模擬數(shù)據(jù)有哪些規(guī)律嗎?如果IoT-Benchmark服務(wù)器配置較低,可以使用多臺(tái)機(jī)器模擬壓力輸出嗎?
表4-5配置參數(shù)信息
| 場(chǎng)景 | 參數(shù) | 值 | 說(shuō)明 |
|---|---|---|---|
| 模擬真實(shí)寫入速率 | OP_INTERVAL | -1 | 也可輸入整數(shù)控制操作間隔 |
| 指定測(cè)試時(shí)長(zhǎng)(1小時(shí)) | TEST_MAX_TIME | 3600000 | 單位 ms;需要LOOP執(zhí)行時(shí)間大于該值 |
| 定義模擬數(shù)據(jù)規(guī)律:支持全部數(shù)據(jù)類型,數(shù)量平均分類;支持五種數(shù)據(jù)分布,數(shù)量平均分布;字符串長(zhǎng)度為10;小數(shù)位數(shù)為2 | INSERT_DATATYPE_PROPORTION | 1:1:1:1:1:1 | 數(shù)據(jù)類型分布比率 |
| LINE_RATIO | 1 | 線性 | |
| SIN_RATIO | 1 | 傅里葉函數(shù) | |
| SQUARE_RATIO | 1 | 方波 | |
| RANDOM_RATIO | 1 | 隨機(jī)數(shù) | |
| CONSTANT_RATIO | 1 | 常數(shù) | |
| STRING_LENGTH | 10 | 字符串長(zhǎng)度 | |
| DOUBLE_LENGTH | 2 | 小數(shù)位數(shù) | |
| 三臺(tái)機(jī)器模擬300臺(tái)設(shè)備數(shù)據(jù)寫入 | BENCHMARK_CLUSTER | true | 開啟多benchmark模式 |
| BENCHMARK_INDEX | 0、1、3 | 以寫入測(cè)試寫入?yún)?shù)為例:0號(hào)負(fù)責(zé)設(shè)備編號(hào)0-99數(shù)據(jù)寫入;1號(hào)負(fù)責(zé)設(shè)備編號(hào)100-199數(shù)據(jù)寫入;2號(hào)負(fù)責(zé)設(shè)備編號(hào)200-299數(shù)據(jù)寫入; |