此次實驗目的是量測 StrictCostDispatcher
"有使用 interdependent message" 和 "沒有使用 interdependent message" 對效能的影響。對使用 Astraea Partitioner 的使用者來說,也許有些 record 需要被送到同一個 partition ,因此 Astraea Partitioner 提供了 interdependent 的機制。
實驗使用6台實體機器,以下皆以代號表示,分別是 B1, B2, B3, B4, B5, C1 ,六台實體機器規格均相同
硬體 | 品名 |
---|---|
CPU | Intel i9-12900K 3.2G(5.2G)/30M/UHD770/125W |
主機板 | 微星 Z690 CARBON WIFI(ATX/1H1P/Intel 2.5G+Wi-Fi 6E) |
記憶體 | 十銓 T-Force Vulcan 32G(16G*2) DDR5-5200 (CL40) |
硬碟 | 威剛XPG SX8200Pro 2TB/M.2 2280/讀:3500M/寫:3000M/TLC/SMI控 * 2 |
散熱器 | NZXT Kraken Z53 24cm水冷排/2.4吋液晶冷頭/6年/厚:5.6cm |
電源供應器 | 海韻 FOCUS GX-850(850W) 雙8/金牌/全模組 |
網卡 | Marvell AQtion 10Gbit Network Adapter |
switch(10G)
┌─────┬─────┬─────┬─────┬─────┐
B1 B2 B3 B4 B5 C1
軟體 | 版本(/image ID) |
---|---|
作業系統 | ubuntu-20.04.3-live-server-amd64 |
Astraea revision | 08b4e32f31091a3de69775db5442eb631deca550 |
Zookeeper version | 3.7.1 |
Apache Kafka version | 3.2.1 |
Java version | OpenJDK 11 |
Docker version | 20.10.17, build 100c701 |
grafana image ID | b6ea013786be |
prometheus version | v2.32.1 |
node-exporter image ID | 1dbe0e931976 |
作業系統硬碟切割
硬碟 | partition1 | partition2 |
---|---|---|
硬碟一 | 50G / | (rest) (Kafka log directory) |
硬碟二 | 50G /home | (rest) (Kakfa log directory) |
實驗執行軟體
執行軟體 | B1 | B2 | B3 | B4 | B5 | C1 |
---|---|---|---|---|---|---|
Zookeeper | V | |||||
Kakfa Broker | V | V | V | V | V | |
Node Exporter | V | V | V | V | V | |
Prometheus | V | |||||
Grafana | V | |||||
Astraea Performance tool | V |
在 server 端資源充足的情況下,使用 performance tool 來測量 producer 的發送吞吐與延遲,比較不同 interdependent size 的影響。
測試方式是:實驗進行 3 次,開 60 partitions 的 topic 。在 C1 上,使用 Astraea performance tool 發送資料,設計上是每 n 筆 record 會發送到同一個 partition 上,n 是使用者指定的數,這裡分別使 n = 1, 10, 100,觀察 Astraea performance tool 輸出的吞吐量與平均發送延遲。
--interdependent.size 1
--interdependent.size 10
--interdependent.size 100
# Run StrictCostDispatcher with no interdependent
REVISION=08b4e32f31091a3de69775db5442eb631deca550 docker/start_app.sh performance \
--bootstrap.servers 192.168.103.185:9092,192.168.103.186:9092,192.168.103.187:9092,192.168.103.188:9092 \
--value.size 10KiB \
--producers 4 \
--consumers 0 \
--run.until 30m \
--topics testing \
--report.path /home/kafka/hong/report \
--interdependent.size 1 \
--partitioner org.astraea.common.partitioner.StrictCostDispatcher
# Run StrictCostDispatcher with interdependent 10 records
REVISION=08b4e32f31091a3de69775db5442eb631deca550 docker/start_app.sh performance \
--bootstrap.servers 192.168.103.185:9092,192.168.103.186:9092,192.168.103.187:9092,192.168.103.188:9092 \
--value.size 10KiB \
--producers 4 \
--consumers 0 \
--run.until 30m \
--topics testing \
--report.path /home/kafka/hong/report \
--interdependent.size 10 \
--partitioner org.astraea.common.partitioner.StrictCostDispatcher
# Run StrictCostDispatcher with interdependent 100 records
REVISION=08b4e32f31091a3de69775db5442eb631deca550 docker/start_app.sh performance \
--bootstrap.servers 192.168.103.185:9092,192.168.103.186:9092,192.168.103.187:9092,192.168.103.188:9092 \
--value.size 10KiB \
--producers 4 \
--consumers 0 \
--run.until 30m \
--topics testing \
--report.path /home/kafka/hong/report \
--interdependent.size 100 \
--partitioner org.astraea.common.partitioner.StrictCostDispatcher
從平均吞吐的折線圖來觀察,吞吐量平均都超過 1000 (MiB/sec) 。雖然差距不大 (約4%),但觀察到有使用 interdependent
的實驗表現較好。
從平均延遲來看,使用 interdependent
的延遲會上升,預設的 StrictCostDispatcher
是使用延遲判斷,interdependent
的限制也讓平均延遲有所增加。(這裡紀錄的延遲是 "moving average" 的一種,每秒取的 "moving average" 彼此都有相依性。每一秒取的 "moving average" 都是有個別意義的。所以這裡沒有寫出一個具體的數字,直接看圖表的意義會比較準確。)
另外,比較先前的實驗結果,會發現延遲的數據有極大的差異,先前的實驗 延遲落在 ~200 ms ,但這次的實驗延遲落在 ~1 ms,主要原因是 PR 711 修改了數據的紀錄方式,原先量測的延遲是 user -> producer -> request -> server -> response -> producer -> user,現在抓取的latency則是只有統計 request -> server -> response 這一段,兩者量測的路徑有明顯的不同,所以這次實驗的延遲才會和先前實驗的延遲有很大的差距。
在資源充足的環境下,使用 Strict Cost Dispatcher 時,使用 interdependent message
- 吞吐增加 (約4%)
- 平均延遲上升。(moving average 難以量化比較,故只以圖表呈現)