Hologres是相容PostgreSQL協議的一站式即時數倉引擎,支援海量資料即時寫入、即時更新、即時分析,既支援PB級資料多維分析(OLAP)與即席分析(Ad Hoc),又支援高並發低延遲的線上資料服務(Serving)。本文為您介紹Hologres在資料寫入、資料更新、點查情境的效能測試方法與結果。
測試方案介紹
測試情境
本文進行測試的情境如下。
-
資料寫入情境:主要用於測試Hologres針對行存、列存、行列共存表進行資料寫入的效能。
-
資料更新情境:主要用於測試Hologres針對行存、列存、行列共存表,在有主鍵的情況下進行資料更新的效能,包含全域更新與局部更新兩個情境。
-
點查情境:主要用於測試Hologres針對行存、行列共存表進行主鍵過濾的點查效能。
測試載入器
本文採用Hologres研發的開源測試載入器holo-e2e-performance-tool進行測試,詳情請參見holo-e2e-performance-tool(包含測試載入器下載地址)。
holo-e2e-performance-tool測試載入器具備如下優勢:
-
測試過程簡便:holo-e2e-performance-tool測試載入器整合了建表、寫入資料構造、效能測試等全部模組,無需提前準備測試資料。
-
參數配置靈活:僅需簡單調整配置項,即可對錶的列數、大小、行數等參數進行定製化設計,完成更加貼近實際業務情境的效能測試。
-
測試結果準確:測試資料的主鍵為遞增的連續整數,因此只需對應調整參數配置項中的資料量,即可保證更新與點查情境的測試資料主鍵全部命中。
測試流程
使用holo-e2e-performance-tool進行資料寫入、更新與點查情境測試的步驟如下:
-
進行資料寫入測試,完成基本參數配置後測試一定行數下的寫入效能。
-
保留寫入情境的測試資料表,沿用寫入情境的參數配置再次進行寫入測試,即可實現資料更新情境的效能測試。
-
仍使用資料更新情境的測試資料表,配置需要查詢的主鍵範圍等參數,進行點查情境效能測試。
準備工作
基礎環境準備
您需要準備測試所需的基礎環境。具體內容如下:
為了減少可能對測試結果有影響的變數,建議每次使用新建立的執行個體進行測試,不要使用升降配的執行個體。
-
建立ECS執行個體。
登入阿里雲,建立一個ECS執行個體,用於用戶端測試。建議ECS規格如下:
-
執行個體規格:ecs.g6.4xlarge。
-
作業系統:Alibaba Cloud Linux 3.2104 LTS 64位。
-
儲存:ESSD雲端硬碟。
-
ECS與Hologres執行個體需在相同地區,使用相同的VPC網路,並處於同一服務可用性區域。
說明上述規格非必須,您只需在測試過程中監測ECS執行個體的CPU與頻寬,確保二者資源未被全部使用,即ECS執行個體資源沒有成為測試瓶頸即可。
更多關於建立ECS的操作請參見建立執行個體。
-
-
建立Hologres執行個體。
本次測試使用了獨享(隨用隨付)的執行個體,由於該執行個體僅用於測試使用,計算資源配置選擇
64核256GB。您可以根據實際業務需求,選擇計算資源配置。建立Hologres執行個體詳細操作請參見購買Hologres執行個體。
-
建立測試資料庫。
您需要登入建立的Hologres執行個體,建立一個資料庫,詳情請參見建立資料庫。
測試載入器準備
-
在ECS執行個體中安裝JDK,建議使用JDK 11版本。具體操作,請參見手動部署OpenJDK。
-
下載測試載入器holo-e2e-performance-tool。
-
將測試載入器匯入ECS執行個體,詳情可參見使用Workbench上傳或下載檔案。
效能測試
資料寫入情境
原理說明
-
寫入模式說明:資料寫入可以分為Fixed Copy和Insert兩種模式。
-
Fixed Copy模式:通過COPY語句進行資料寫入,同時通過Fixed Plan最佳化SQL執行,詳情請參見Fixed Plan加速SQL執行。
-
Insert模式:通過INSERT語句進行資料寫入,同時通過Fixed Plan最佳化SQL執行。
-
-
特殊配置說明:為便於相容各測試情境、高效推進測試與驗證,測試載入器會在配置的表列數基礎上,額外增加以下列:
-
主鍵列
id:作為表的主鍵和Distribution Key,在測試過程中從1開始逐條遞增。 -
時間列
ts:作為表的Segment Key,在測試過程中寫入目前時間。
-
-
資料寫入原理:在測試過程中,測試載入器會將主鍵
id從1開始逐條遞增寫入資料。時間列寫入目前時間。針對配置的其他TEXT列,寫入目標長度的字串加主鍵id。在達到目標時間或目標行數後停止寫入,計算測試結果。
操作步驟
-
在ECS執行個體中建立測試組態檔案。
-
使用如下命令建立名稱為test_insert.conf的檔案。
vim test_insert.conf -
在檔案內輸入
i後進入編輯模式,添加如下樣本內容。說明如下樣本以行存表為例,測試列存、行列共存表時請將
orientation參數值修改為column、row,column。# 串連配置 holoClient.jdbcUrl=jdbc:hologres://<ENDPOINT>:<PORT>/<DBNAME> holoClient.username=<AccessKey_ID> holoClient.password=<AccessKey_Secret> holoClient.writeThreadSize=100 # 寫入配置 put.threadSize=8 put.testByTime=false put.rowNumber=200000000 put.testTime=600000 # 表配置 put.tableName=kv_test put.columnCount=20 put.columnSize=20 put.orientation=row # 其他配置 put.createTableBeforeRun=true put.deleteTableAfterDone=false put.vacuumTableBeforeRun=false參數說明如下。
模組
參數
描述
備忘
串連配置
jdbcUrl
Hologres的JDBC串連串,格式為
jdbc:hologres://<ENDPOINT>:<PORT>/<DBNAME>。ENDPOINT需要填寫Hologres執行個體的指定VPC網域名稱,您可以進入Hologres管理主控台的執行個體詳情頁,從網絡資訊中擷取網域名稱。username
當前阿里雲帳號的AccessKey ID。
您可以單擊AccessKey 管理,擷取AccessKey ID。
password
當前阿里雲帳號的AccessKey Secret。
您可以單擊AccessKey 管理,擷取AccessKey Secret。
writeThreadSize
每個Holo Client啟動的寫入線程數。每個Holo Client寫入線程會佔用1個串連。僅INSERT模式生效。
Holo Client詳情請參見Holo Client。
寫入配置
threadSize
產生資料的線程數。
-
FIXED_COPY模式:每個線程會佔用一個串連,總串連數即為線程數。
-
INSERT模式:預設共用一個Holo Client,總串連數為
writeThreadSize。
針對本文測試的64核執行個體規格,在FIXED_COPY模式下推薦設定線程數為8。您需要根據執行個體規格及資料特徵適當調整該參數。
testByTime
按規定時間進行測試或按規定行數進行測試。
參數取值如下:
-
true:表示按規定時間進行測試。
-
false:表示按規定行數進行測試。
rowNumber
測試的目標行數,testByTime為false時生效。
不涉及
testTime
測試的目標時間,單位為毫秒,testByTime為true時生效。
不涉及
表配置
tableName
測試的目標表名。
不涉及
columnCount
表的列數。每列的資料類型均為TEXT。
不涉及
columnSize
表每列的字元長度。
不涉及
orientation
表的儲存類型。
參數取值如下:
-
row:行存表。
-
column:列存表。
-
row,column:行列共存表。
其他配置
createTableBeforeRun
測試開始前是否建立表。
參數取值如下:
-
true:表示建表。
-
false:表示不建表。
如果設為true,測試載入器預設會先執行刪除同名表、再建立表的操作,請注意目標表名不與執行個體中其他表名相同。
deleteTableAfterDone
測試結束後是否刪除表。
參數取值如下:
-
true:表示刪除表。
-
false:表示不刪除表。
如果在寫入測試後,需要基於同一個表進行更新、點查等測試,則需要設為true。
vacuumTableBeforeRun
測試開始前是否執行Vacuum操作。
參數取值如下:
-
true:表示執行Vacuum操作。
-
false:表示不執行Vacuum操作。
執行Vacuum會強制觸發Compaction操作。隻影響INSERT模式下的資料更新情境測試,不影響FIXED_COPY模式。
-
-
按Esc鍵,輸入
:wq並斷行符號以儲存並關閉檔案。
-
-
資料寫入測試。
執行如下語句進行測試。
# 使用Fixed copy模式進行資料寫入測試 java -jar holo-e2e-performance-tool-1.0.0.jar test_insert.conf FIXED_COPY-
測試載入器會預設將結果檔案
result.csv儲存在根目錄下。其中資料寫入與更新情境的模式參數包含兩個取值,FIXED_COPY對應Fixed Copy模式,INSERT對應Insert模式。
-
-
擷取測試結果。
使用如下命令擷取測試結果。
cat result.csv測試結果檔案
result.csv中包含如下欄位。欄位
描述
start
測試開始時間。
end
測試結束時間。
count
測試資料行數。
qps1
最後1分鐘的平均QPS。
qps5
最後5分鐘的平均QPS。
qps15
最後15分鐘的平均QPS。
latencyMean
平均延遲。
INSERT、GET模式收集。
latencyP99
P99延遲。
INSERT、GET模式收集。
latencyP999
P999延遲。
INSERT、GET模式收集。
version
執行個體版本。
資料更新情境
原理說明
-
在測試過程中,測試載入器會將主鍵
id從1開始逐條遞增進行資料更新。針對時間列,更新為目前時間。針對配置的其他需要更新的TEXT列(可配置全域更新或局部更新),重新寫入目標長度的字串加主鍵id。在達到目標時間或目標行數後停止更新,計算測試結果。 -
需要先進行資料寫入,並設定deleteTableAfterDone為false,以確保表中已有資料,可以進行資料更新。
全域更新操作步驟
-
在ECS執行個體中建立測試組態檔案。
-
使用如下命令建立名稱為test_update.conf的檔案。
vim test_update.conf -
在檔案內輸入
i後進入編輯模式,添加如下樣本內容。說明-
如下樣本以行存表為例,測試列存、行列共存表時請將
orientation參數值修改為column、row,column。 -
相比於資料寫入情境,僅需將
createTableBeforeRun參數值由true修改為false,其他參數均保持不變,即可開始資料更新情境的測試。
# 串連配置 holoClient.jdbcUrl=jdbc:hologres://<ENDPOINT>:<PORT>/<DBNAME> holoClient.username=<AccessKey_ID> holoClient.password=<AccessKey_Secret> holoClient.writeThreadSize=100 # 寫入配置 put.threadSize=8 put.testByTime=false put.rowNumber=200000000 put.testTime=600000 # 表配置 put.tableName=kv_test put.columnCount=20 put.columnSize=20 put.orientation=row # 其他配置 put.createTableBeforeRun=false put.deleteTableAfterDone=false put.vacuumTableBeforeRun=false配置參數說明請參見資料寫入情境的參數說明。
-
-
按Esc鍵,輸入
:wq並斷行符號以儲存並關閉檔案。
-
-
全域更新測試。
執行如下語句進行測試。
# 使用Fixed copy模式進行資料寫入測試 java -jar holo-e2e-performance-tool-1.0.0.jar test_update.conf FIXED_COPY -
擷取測試結果。
使用如下命令擷取測試結果。
cat result.csv測試結果檔案
result.csv中包含如下欄位。欄位
描述
start
測試開始時間。
end
測試結束時間。
count
測試資料行數。
qps1
最後1分鐘的平均QPS。
qps5
最後5分鐘的平均QPS。
qps15
最後15分鐘的平均QPS。
latencyMean
平均延遲。
INSERT、GET模式收集。
latencyP99
P99延遲。
INSERT、GET模式收集。
latencyP999
P999延遲。
INSERT、GET模式收集。
version
執行個體版本。
局部更新操作步驟
-
在ECS執行個體中建立測試組態檔案。
-
使用如下命令建立名稱為test_update_part.conf的檔案。
vim test_update_part.conf -
在檔案內輸入
i後進入編輯模式,添加如下內容。說明-
如下樣本以行存表為例,測試列存、行列共存表時請將
orientation參數值修改為column、row,column。 -
相比於全域更新情境,局部更新情境需要增加參數
writeColumnCount,該參數用於定義資料寫入全部TEXT列中的幾列。本文均將該參數設為表列數columnCount的50%。
# 串連配置 holoClient.jdbcUrl=jdbc:hologres://<ENDPOINT>:<PORT>/<DBNAME> holoClient.username=<AccessKey_ID> holoClient.password=<AccessKey_Secret> holoClient.writeThreadSize=100 # 寫入配置 put.threadSize=8 put.testByTime=false put.rowNumber=200000000 put.testTime=600000 # 表配置 put.tableName=kv_test put.columnCount=20 put.columnSize=20 put.writeColumnCount=10 put.orientation=row # 其他配置 put.createTableBeforeRun=false put.deleteTableAfterDone=false put.vacuumTableBeforeRun=false參數說明請參見全域更新情境的參數說明。
-
-
按Esc鍵,輸入
:wq並斷行符號以儲存並關閉檔案。
-
-
局部更新情境測試。
執行如下命令進行測試。
# 使用Fixed copy模式進行資料寫入測試 java -jar holo-e2e-performance-tool-1.0.0.jar test_update_part.conf FIXED_COPY -
擷取測試結果。
使用如下命令擷取測試結果。
cat result.csv測試結果檔案
result.csv中包含如下欄位。欄位
描述
start
測試開始時間。
end
測試結束時間。
count
測試資料行數。
qps1
最後1分鐘的平均QPS。
qps5
最後5分鐘的平均QPS。
qps15
最後15分鐘的平均QPS。
latencyMean
平均延遲。
INSERT、GET模式收集。
latencyP99
P99延遲。
INSERT、GET模式收集。
latencyP999
P999延遲。
INSERT、GET模式收集。
version
執行個體版本。
點查情境
原理說明
-
點查模式說明:
-
同步模式:點查介面是阻塞的,點查調用需要等待實際請求完成才返回。對於一個背景工作執行緒,每個點查請求都對應一個SQL從發起到完成,一個請求結束後才能進行下一個請求。同步模式適合latency敏感、吞吐需求相對不敏感的情境。
-
非同步模式:點查介面是非阻塞的,點查調用無須等待實際請求完成,會立即返回。多個點查請求非同步提交後,當用戶端一個背景工作執行緒中判斷滿足攢批大小或者提交間隔後,會把多個點查請求通過攢批方式用一條SQL批量處理。非同步模式適合吞吐需求高、latency需求相對較低的情境,如Flink消費即時資料進行高吞吐的維表關聯等。
-
-
點查測試原理:在測試過程中,測試載入器會在配置的主鍵範圍內,隨機產生目標
id進行同步或非同步點查。在達到目標時間後停止點查測試,計算測試結果。
操作步驟
-
如果自動產生的資料無法滿足您需要的點查業務情境,您可以自行寫入業務資料,完成主鍵、分布列、分段列等表屬性的建立,而後根據如下步驟進行點查效能測試。
-
自行建立的資料表中必須包含單列主鍵,主鍵資料類型為INT或BIGINT,同時需要注意主鍵的連續性。
-
在ECS執行個體中建立測試組態檔案。
-
使用如下命令建立名稱為test.conf的檔案。
vim test.conf -
在檔案內輸入
i後進入編輯模式,添加如下內容。說明如下樣本以行存表為例,測試行列共存表時請將
orientation參數值修改為row,column。# 串連配置 holoClient.jdbcUrl=jdbc:hologres://<ENDPOINT>:<PORT>/<DBNAME> holoClient.username=<AccessKey_ID> holoClient.password=<AccessKey_Secret> holoClient.readThreadSize=32 # 測試組態 get.threadSize=8 get.testTime=300000 get.tableName=kv_test get.async=true get.vacuumTableBeforeRun=true get.keyRangeParams=L1-200000000 # 表初始化配置(僅PREPARE_GET_DATA模式生效) prepareGetData.rowNumber=200000000 prepareGetData.orientation=row put.columnCount=20 put.columnSize=20配置參數說明如下。
模組
參數
描述
備忘
串連配置
jdbcUrl
Hologres的JDBC串連串,格式為
jdbc:hologres://<ENDPOINT>:<PORT>/<DBNAME>。ENDPOINT需要填寫Hologres執行個體的指定VPC網域名稱,您可以進入Hologres管理主控台的執行個體詳情頁,從網絡資訊中擷取網域名稱。username
當前阿里雲帳號的AccessKey ID。
您可以單擊AccessKey 管理,擷取AccessKey ID。
password
當前阿里雲帳號的AccessKey Secret。
您可以單擊AccessKey 管理,擷取AccessKey Secret。
readThreadSize
查詢情境的串連數。
-
非同步模式下為提高攢批效率,建議設為線程數
threadSize的2~4倍。 -
同步模式下為確保計算資源充分利用,建議適當調高串連數。本文設定的串連數為
100。
測試組態
threadSize
產生請求條件的線程數。
針對本文測試的64核執行個體規格:
-
在非同步點查模式下建議設定線程數為8。
-
在同步點查模式下建議設定線程數為500。
您需要根據執行個體規格及資料特徵適當調整該參數。
testTime
測試的目標時間,單位為毫秒。
不涉及。
tableName
測試的目標表名。
不涉及。
async
點查測試的模式是否為非同步。
參數取值如下:
-
true:表示非同步。
-
false:表示同步。
vacuumTableBeforeRun
測試開始前是否執行vacuum操作。
參數取值如下:
-
true:表示執行Vacuum操作。
-
false:表示不執行Vacuum操作。
執行Vacuum會強制觸發Compaction操作。
keyRangeParams
點查的主鍵參數範圍,格式為
<I/L><Start>-<End>。參數說明如下:
-
I/L:I表示INT類型,L表示BIGINT類型。 -
Start:主鍵起始值。 -
End:主鍵結束值。
點查測試過程中,測試載入器會在配置的範圍內隨機產生目標主鍵進行查詢。
表初始化配置(僅PREPARE_GET_DATA模式生效)
rowNumber
需要預產生的表的資料行數。
不涉及。
orientation
需要預產生的表的儲存類型。
參數取值如下:
-
row:行存表。
-
column:列存表。
-
row,column:行列共存表。
columnCount
需要預產生的表的列數。每列的資料類型均為TEXT。
不涉及。
columnSize
需要預產生的表每列的字元長度。
不涉及。
-
-
按Esc鍵,輸入
:wq並斷行符號以儲存並關閉檔案。
-
-
執行如下語句進行測試:
說明點查情境的模式參數包含兩個取值:
PREPARE_GET_DATA對應點查前的資料準備模式,GET對應點查模式。如果您已寫入業務資料或已經完成了資料寫入、更新情境的測試並保留了測試表,則不需使用PREPARE_GET_DATA模式進行資料準備,直接使用GET模式進行點查即可。# 使用PREPARE_GET_DATA模式進行資料準備 java -jar holo-e2e-performance-tool-1.0.0.jar test.conf PREPARE_GET_DATA # 使用GET模式進行點查測試 java -jar holo-e2e-performance-tool-1.0.0.jar test.conf GET -
擷取測試結果。
使用如下命令擷取測試結果。
cat result.csv測試結果檔案
result.csv中包含如下欄位。欄位
描述
start
測試開始時間。
end
測試結束時間。
count
測試資料行數。
qps1
最後1分鐘的平均QPS。
qps5
最後5分鐘的平均QPS。
qps15
最後15分鐘的平均QPS。
latencyMean
平均延遲。
INSERT、GET模式收集。
latencyP99
P99延遲。
INSERT、GET模式收集。
latencyP999
P999延遲。
INSERT、GET模式收集。
version
執行個體版本。
測試結果
本文對多個情境進行了測試:資料寫入、更新情境均測試行存、列存、行列共存三種儲存類型;由於列存表不適合進行點查,因此資料點查情境僅測試行存、行列共存兩種儲存類型。
測試效能資料結果如下,其中表的列數選擇20、50、100三種規格,列大小均為20。本文使用的Hologres執行個體版本為V3.0.22(JDK版本為JDK 11),規格為64核,該規格執行個體推薦的資料總規模在4000萬行到4億行之間,因此本文各情境選取的測試資料量均為2億行。
-
執行個體規格、表結構、資料量、並發數等參數均會對效能產生較大影響。在實際測試中,您需要先確定Hologres執行個體規格、表結構、資料量等參數,而後調整並發數進行多次測試。
-
如果您的目標是測試Hologres最優效能,您需要在每次測試完成後監測執行個體的CPU資源使用率,如果CPU資源未被全部使用,您需要適當增加並發數繼續測試,以擷取最優、最準確的效能結果。
-
20列
測試結果QPS和latency(點查)具體數值如下所示。其中QPS選用測試結果檔案中的
qps1指標,latency選用測試結果檔案中的latencyMean指標。儲存格式
測試情境
並發配置
QPS/萬
latency/ms
行存
寫入(Fixed copy)
threadSize=8
88.3
不涉及
全域更新(Fixed copy)
threadSize=8
91.1
不涉及
局部更新(Fixed copy)
threadSize=8
136.7
不涉及
點查(非同步)
threadSize=8
readThreadSize=32
43.6
8.60
點查(同步)
threadSize=100
readThreadSize=100
26.1
7.88
列存
寫入(Fixed copy)
threadSize=8
29.9
不涉及
全域更新(Fixed copy)
threadSize=8
18.5
不涉及
局部更新(Fixed copy)
threadSize=8
12.8
不涉及
行列共存
寫入(Fixed copy)
threadSize=8
25.0
不涉及
全域更新(Fixed copy)
threadSize=8
17.3
不涉及
局部更新(Fixed copy)
threadSize=8
17.5
不涉及
點查(非同步)
threadSize=8
readThreadSize=32
40.4
8.75
點查(同步)
threadSize=100
readThreadSize=100
27.0
8.12
-
50列
測試結果QPS和latency(點查)具體數值及對比圖如下所示。其中QPS選用測試結果檔案中的
qps1指標,latency選用測試結果檔案中的latencyMean指標。儲存格式
測試情境
並發配置
QPS/萬
latency/ms
行存
寫入(Fixed copy)
threadSize=8
41.9
不涉及
全域更新(Fixed copy)
threadSize=8
38.2
不涉及
局部更新(Fixed copy)
threadSize=8
69.8
不涉及
點查(非同步)
threadSize=8
readThreadSize=32
35.7
10.20
點查(同步)
threadSize=100
readThreadSize=100
24.0
9.28
列存
寫入(Fixed copy)
threadSize=8
15.5
不涉及
全域更新(Fixed copy)
threadSize=8
11.7
不涉及
局部更新(Fixed copy)
threadSize=8
6.4
不涉及
行列共存
寫入(Fixed copy)
threadSize=8
13.7
不涉及
全域更新(Fixed copy)
threadSize=8
10.5
不涉及
局部更新(Fixed copy)
threadSize=8
11.6
不涉及
點查(非同步)
threadSize=8
readThreadSize=32
31.5
12.29
點查(同步)
threadSize=100
readThreadSize=100
24.2
10.00
-
100列
測試結果QPS和latency(點查)具體數值及對比圖如下所示。其中QPS選用測試結果檔案中的
qps1指標,latency選用測試結果檔案中的latencyMean指標。儲存格式
測試情境
並發配置
QPS/萬
latency/ms
行存
寫入(Fixed copy)
threadSize=8
24.4
不涉及
全域更新(Fixed copy)
threadSize=8
22.5
不涉及
局部更新(Fixed copy)
threadSize=8
38.1
不涉及
點查(非同步)
threadSize=8
readThreadSize=32
26.6
14.34
點查(同步)
threadSize=100
readThreadSize=100
21.4
12.12
列存
寫入(Fixed copy)
threadSize=8
8.4
不涉及
全域更新(Fixed copy)
threadSize=8
6.9
不涉及
局部更新(Fixed copy)
threadSize=8
3.1
不涉及
行列共存
寫入(Fixed copy)
threadSize=8
7.6
不涉及
全域更新(Fixed copy)
threadSize=8
5.3
不涉及
局部更新(Fixed copy)
threadSize=8
6.8
不涉及
點查(非同步)
threadSize=8
readThreadSize=32
25.0
15.66
點查(同步)
threadSize=100
readThreadSize=100
21.4
13.79