-
Notifications
You must be signed in to change notification settings - Fork 58
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[ASSIGNOR] Implement CostAwareAssignor #1524
base: main
Are you sure you want to change the base?
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 製造出比較能說服人的情境