[ASSIGNOR] Implement CostAwareAssignor#1524
[ASSIGNOR] Implement CostAwareAssignor#1524harryteng9527 wants to merge 67 commits intoopensource4you:mainfrom
Conversation
請問可否提供明確的數字?例如大概提升了幾趴 |
common/src/main/java/org/astraea/common/assignor/NetworkIngressAssignor.java
Outdated
Show resolved
Hide resolved
吞吐量
NetworkIngress 的分配讓 consumers 的吞吐量大約提昇 8.5% latencyconsumer 處理每個 fetch request 的 latency 如下:
NetworkIngress 的延遲相較 Range assignor 降低了 30 %
|
common/src/main/java/org/astraea/common/assignor/NetworkIngressAssignor.java
Outdated
Show resolved
Hide resolved
common/src/main/java/org/astraea/common/assignor/CostAwareAssignor.java
Outdated
Show resolved
Hide resolved
|
麻煩rebase |
|
這次的 commit 為 Assignor 新增 Combinator利用 greedy 的策略將 partition 分配給 cost 最低的 consumer,這邊不會考慮 Shuffler主要的工作是將
洗牌組合流程流程大概如下:
計算隨機組合的標準差計算標準差是為了看組合中 consumer 之間分配的 cost 差異有沒有很大 |
|
@harryteng9527 感謝更新,可否先提供一下數字?例如這個方法的改善程度,以及計算出一個可用結果所需的時間(成本) |
實驗環境節點總共使用 15 台節點做實驗:
Topic / Partition 數量叢集內有 10 個 topics,每個 topic 有 16 個 partitions,共 Partition 依照 Kafka 預設的擺放 Producer 發送的 record size / 分佈
找解成本以上面提到的實驗環境來評估找解的成本,主要會有下列幾項: 等待 bean 的時間 + 找一大堆解的時間(使用者可自訂,預設為 5 秒) + 從一大堆解中找到最終解的時間 成本會跟使用者所設定的 整體差距以下實驗是使用 Performance tool,分別選擇 Range assignor 與 CostAware assignor 量測 consumers 吞吐量,執行時間為 3 分鐘 上圖為執行 Performance tool 測試時,全部 Topic 的 ByteIn 與 ByteOut 圖表,綠色為 ByteIn、黃色為 ByteOut 從這張圖可以看到使用 CostAware assignor 時, consumer 消費 topics 的速度跟得上 producer 送到 topics 的速度。而使用 Range assignor 會有大約 1GiB 的 Lag 平均值
CostAware assignor 的平均吞吐量提升了 18.79 % 最大值&最小值差異這邊比較使用 Range 與 CostAware assignor 時,Consumer group 吞吐量最大值與最小值的差異
|
請問一下綠色 (ByteIn) 的圖看不太出差異,可否提供一下數字?平均和最大最小的寫入吞吐量 |
|
common/src/main/java/org/astraea/common/assignor/Combinator.java
Outdated
Show resolved
Hide resolved
common/src/main/java/org/astraea/common/assignor/Combinator.java
Outdated
Show resolved
Hide resolved
|
命名的部分要稍微思考一下,如果程式碼的實作和命名差很多,通常代表寫的時候腦袋有點混亂 ... |
|
目前對 Cost-Aware assignor 做了多次實驗,都有通過查核點,使用的 Cost-Aware assignor 是使用這隻 PR 的程式碼來測試 以下是查核點實驗所執行的時間、查核項目:
實驗環境
Client 端皆開啟 Performance tool,Producer 發送的 records 大小固定 1KiB,Key 的分佈為 ZipFian 第一、三查核點此二查核點是比較 Cost-Aware assignor 與 Kafka default assignor 的吞吐量以及 consumer 最大、小吞吐量差異(吞吐量全距) 實驗時間為三分鐘,兩個實驗可以一起跑,以下是實驗數據 Consumer group 吞吐量在執行三分鐘的時間內,Producers 平均吞吐量如下表
Consumer group 的吞吐量折線圖如下,因為有將負載(流入 partition 的流量)較平均的分配給 consumers,所以使用 Cost-Aware assignor 的 consumer group 吞吐量較高 Consumer group 的平均吞吐量提昇約 30%,計算與圖表如下:
Consumer group 中最大與最小吞吐量差值下面是用 consumer group 中 consumer 吞吐量全距(吞吐量最大的 consumer 減去吞吐量最小的 consumer) 所製成的折線圖 全距平均值如下
第二查核點此查核點是與 Kafka default assignor 比較,可降低平均 e2e latency 15% 實驗的時間約為 15 mins,e2e latency 的實驗數據是用 Performance tool 紀錄的,下面是平均端對端延遲的實驗圖表 平均端對端延遲此圖表所紀錄的是 Consumer group 中 consumer 每秒的端對端延遲平均值,計算方式如下表格
表格中的 y 軸的點代表表格內的 平均端對端延遲的平均值
滿足查核點的 e2e latency 降低 15 % 測試 15 分鐘的吞吐量圖表因為在測試 e2e 情境時,也有觀察吞吐量,所以也放一下 15min 的實驗狀況。 Producer 每秒吞吐量如下表格
以下分別是吞吐量以及平均吞吐量的圖表,目前計算下來平均吞吐量能提昇 33 %
|












此 PR 實作 CostAwareAssignor,基於使用者選擇的 cost function 量化 partition 的負載,再依照量化的負載分配 partition 給 consumers,達到負載平衡的目的
分配方式
此 PR 實作較直覺的 greedy 分配,將
tp分配給負載最低的 consumer。在分配前,會先用tp篩選 consumer,以下為篩選流程:什麼是適合分配的 consumer
分配
tp當下,consumer 當時被分配到的 partitions 的 incompatibility 中不存在tp,即為適合的 consumer以 NetworkIngressCost 為例,因為流入速度較慢的 partition 會拖慢同節點內其他 partitions 的消費速度,所以同個節點中,流入速度差異過大的 partition 會被視為不適合放在同一個 consumer 上 (詳細可看 #1475 )
先前 PR 內容
這隻 PR 先做出分配節點內流量相近的 partitions 給同一個 consumer,並在這隻 PR 上討論上面幾點,或是這隻 PR 先把第1版 NetworkIngressAssignor 實作完,之後再開其他 PR 優化
目前有以現在推上來的第1版做實驗,實驗環境與流程 #1475 相同
Throughput
Latency
做完實驗後發現,NetworkIngress assignor 能夠將 consumer 處理不完的資料(partition)分配給其他 consumer,所以整體的吞吐量上升,也降低了延遲。
只不過目前的實驗情境(使用 throttle )是刻意製造的,希望之後改用 Key distribution 製造出比較能說服人的情境