Skip to content
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

Allow to bypass the dynamic bandwidth estimation in NetworkCost #1839

Conversation

garyparrot
Copy link
Collaborator

@garyparrot garyparrot commented Aug 11, 2023

有一種比較 Balancer 實作的方法是給定好一個叢集的 topic/partition/replica 配置,還有預先指定好每個 topic/partition 的各項開銷,然後營造出 Balancer 上述對應的輸入下去測演算法出來的結果,這種實驗手法很重要,他能夠讓我們比較不同品牌的 Balancer 實作,如 Cruise Control。目前的 NetworkCost 實作很難簡單地做到粗體那段,這個 PR 在讓粗體那段簡單一點,進而更好做上述的實驗。

目前 NetworkCost#clusterCost 函數會接受兩個參數:ClusterInfoClusterBean,從兩個資訊去判斷叢集的網路負載平衡狀況,這個過程中函數會從 ClusterBean 中的 JMX MBeans 去推斷每個 Partition 對應的讀取/寫入流量,這個過程在原始碼中是稱作 bandwidth estimation。bandwidth estimation 是一個很複雜的過程,他通常會需要從很大大量的 metrics 去判斷/過濾/檢查輸入的 metrics 是否正確 or 對應的 topic/partition 開銷是多少,這個過程在生產環境的真實實驗中是非常必須且重要的,如 #1641 所述,metrics 的內容可能會不穩定或蒐集不完全,因此實務上有必要做這一段事情。

但由於 bandwidth estimation 的流程,導致第一段的實驗步驟很難在目前的 NetworkCost 實作下很難做到,實驗實作必須要把 topic-1 = 1000, topic-2 = 1024, ... 這個單純的訊息壓成一個 ClusterBean,然後由於 bandwidth estimation 本身的複雜度,這個 ClusterBean 可能會包含五花八門的 metrics,比如目前 NetworkCost 會蒐集下面這些 metrics

https://github.com/skiptests/astraea/blob/084c9d643471d18750759ca241c5c38c269b0f67/common/src/main/java/org/astraea/common/cost/NetworkCost.java#L193-L206

  • JVM memory
  • BrokerTopic BytesIn
  • BrokerTopic BytesOut
  • Log Size
  • Cluster ID
  • Replica Count

上述六個 metrics 中只有兩個和流量有關,剩下四個都在除錯或嘗試逆推叢集的狀態。

下面這兩段程式碼示範從流量 Map 到 ClusterBean 的實作複雜程度。

https://github.com/skiptests/astraea/blob/084c9d643471d18750759ca241c5c38c269b0f67/common/src/test/java/org/astraea/common/cost/NetworkCostTest.java#L643-L648

https://github.com/skiptests/astraea/blob/084c9d643471d18750759ca241c5c38c269b0f67/common/src/test/java/org/astraea/common/cost/NetworkCostTest.java#L655-L743

PR 的修正

新增 NetworkCost#setCalculation 函數,這個函數允許我們直接指定 ClusterBean 對應的 Partition 負載,進而繞過上述的 bandwidth estimation 過程,直接插入一個我們確定沒有問題的值。

我覺得更好的修正是把 Bandwidth Estimation 這段做成一個 interface (sealed maybe),然後第一段的實驗程式碼可以直接插入一個 estimation implementation 是總是回傳給定的 topic/partition 負載量,不過這樣做會需要做比較大幅度的更改

* @param partitionNetIn the network ingress usage of each partition.
* @param partitionNetOut the network egress usage of each partition.
*/
public void setCalculation(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

這個方法放在這裡覺有點粗暴,似乎會變成這個 cost 獨自使用的功能?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

這個方法放在這裡覺有點粗暴

我也覺得這個方法太暴露,我有想到其他做法是,讓 cachedCalculation 變成 protected,這樣實驗的程式碼可以自己去繼承新的 class 做這些控制。更正確的做法是把計算的這個過程抽象成一個介面,然後讓目前的 estimation 和這個 PR 的直接指定都成為該介面的實作。

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

更正確的做法是把計算的這個過程抽象成一個介面,然後讓目前的 estimation 和這個 PR 的直接指定都成為該介面的實作。

這個手法很優雅,有機會在這支Pr完成嗎?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

我這邊工作已經告一段落了,所以我想這個需求已經沒有存在的必要,不過我可以幫忙開 Issue 描述一下,如果你覺得有必要保留這個改變

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok 那再麻煩一下

@garyparrot
Copy link
Collaborator Author

後續工作會在 #1841 完成

@garyparrot garyparrot closed this Aug 27, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants