-
Notifications
You must be signed in to change notification settings - Fork 60
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
[COST] Inaccurate NetworkCost
partition bandwidth estimation with early broker metrics
#1641
Comments
我會開一個 PR 讓 順便加上一些 Javadoc 提示, |
NetworkCost
partition bandwidth estimationNetworkCost
partition bandwidth estimation with early broker metrics
@qoo332001 有機會看一下嗎?你之前有用 ewma 做我們自己的統計工具,可否看看這個現象是否「合理」? |
@garyparrot 是否方便把 five minute 也畫上去?看看是不是介於 一分鐘和十五分鐘之間 |
感謝確認,那計算方式應該是沒錯( 等 @qoo332001 double check),不過不管怎樣,你說加入參數調整參考 one/five/fifteen 是一個可行的方式,所以 +1 |
剛剛試了一下jmx的統計metrics,確實會有這個現象,可以發現剛開始有流量時,所有統計值都會在一個很高的點,之後再慢慢往下跑 |
@qoo332001 感謝回覆 可否試試看直接使用 yammer 來做統計看看,我們需要釐清問題是出在 yammer 用的演算法,或者是 kafka bug |
yammer指的是它預設提供的統計值嗎? 如果是的話第一張圖用的是yammer提供的三種統計值(1min,5min,15min),第二張圖則是我自己紀錄metrics裡面的count,最後在統計出他的成長速度 |
@qoo332001 感謝回覆,所以這是yammer演算法導致的結果嗎?如果是的話這是符合預期的嗎? |
看起來是的,上圖是紀錄叢集從沒流量到有流量,要是正常計算平均值的話(也將前面的0算進去),不應該是從一個奇怪的高點開始往下跑,而第二張圖自己做統計就沒有這樣的情況發生 |
請問可否試著去看一下 yammer 的實作(原始碼)來確定這個問題? |
可是這張圖的趨勢和yammer還是不太一樣,是吧?yammer是從高點趨近於穩定,你貼的這張圖是從低點趨近於穩定 |
重新看了一下yammer的實做,可以發現它有特別處理第一個進來的資料,簡單來說,yammer的實做在沒有資料可以參考時,會把第一筆資料當成過去 1/5/15 min的平均值,但我自己實做的EWMA工具在沒有資料參考時,還是會用0來做統計,所以才會有這樣的差異出現,改一下自己的EWMA工具,改成與yammer一樣,沒資料時就不去做統計,可以發現出來的曲線與yammer算出來的很相似 |
Performance Tool 剛跑起來的時候會吐入大量的資料。 像是上圖所示,一開始的時候會吐入比較大量的資料 回顧這個 Issue 一開始的測量圖,也可以看到剛開始時該 Partition 的瞬時流量有比較高 (spike) 這可能是 JVM 的 Hotspot 天性所致,一開始的時候會跑比較慢,所以資料會稍微堆積,等後面程式碼暖了傳輸順了,這個現象就沒有了。 然後猜測是 Kafka 使用的 Yammer 看到 Partition 一開始的高流量,然後就拿這個流量當做 @qoo332001 提到的起始值。但實際上這個高流量只是暫時的現象,很快等一下就會掉下來,然後 5/15 minute rate 的 EWMA 對新的 measure value 的權重沒有那麼高,這會需要比較長來把這個高流量的初始值蓋掉 ,所以這個短暫的高流量才會造成那麼長遠的影響。 |
@garyparrot @qoo332001 感謝你們的分析和回覆,我覺得講得很好。延伸下去:你們覺得這是一個 bug 嗎? |
EWMA 沒有指定初始值要設多少,這邊的做法是拿第一個看到的數字當做初始值。其實這樣做也不能說不對,單純做法差異,所以這不是 bug,只是他們的實作細節導致這樣的行為,然後這個行為在我們的情境中很難用。 我看了一下裡面的實作附上的文獻資料,看起來他們的 fifteen minute rate 數字有這種含義,現在的值 我最後的想法是這個數字其實非常的 summary,他只反映過去大量數據的一個趨勢,他在這些情況的時候會便得沒有參考價值:
目前應該是沒有需要分析瞬時流量的需求,所以我想沒有程式碼變動的必要,不過上面有一個結論應該可以加到 |
這個結論有辦法「放到程式碼」裡面嗎? 例如我們要有一個方式「捕捉」到這個現象,並且給予「特定的錯誤資訊」讓使用者可以意識到這個「限制」 |
@qoo332001 我們自己的metrics 也有這個現象嗎? |
我有一個想法,可以避免掉這個限制,或是說讓這個限制變成一個 feature。 現在是從 其實這個方法很早以前就有想過了,不過那時候礙於一些障礙所以沒辦法實踐,但現在那些障礙我都有想到解決辦法。 |
@garyparrot 這個方法聽起來可行,不過就變成我們要捨棄 kafka 已經做好的統計,改成我們自己去統計這些資訊
可否先分享一下「可能的障礙」是什麼? |
障礙有兩個:
|
@garyparrot @qoo332001 不好意思,我想回頭討論一下這個議題的「成因」 這個故事是來自於 yammer 的實作會導致「初期」的統計值「震盪」劇烈,這樣講對嗎? 如果上述是對的話,那麼我們可否「偵測」到該現象,並且透過拋出例外來避免我們在這個尷尬的狀態下做balance? |
大致上正確,更精確的說法是起始的統計值選得不好
我想到的方法是看 |
副作用目前我想到是「必須等到metrics穩定」後才可以跑 balance,你還有想到其他副作用嗎? |
如果使用者不希望每次 Balance 前要等 metrics 穩定,那他基本上會需要使用遠端版本的 MetricStore。 原本想到另外一個問題是 |
不好意思,這句話我比較看不懂,為何要有“連續”“五分鐘“這兩個條件?我能理解的部分是需要等待一段時間讓 metrics 的“統計”值夠客觀 |
具體你覺得要等多久 |
數學演算的結果是5分鐘後,初始值的影響會降到 0.67%,然後因為怕這段時間有節點下線上線指標重新統計,要等連續一段時間 |
我沒特別去想這個,是看到你提到五分鐘所以想先知道你的看法
這樣聽起來蠻合理的。不過大部分的叢集要先跑個五分鐘應該不是啥大問題,所以如果採取“先等個x分鐘“這個方案的話應該是可行的?或者說現在討論的”問題“其實是比較容易發生在我們做實驗的時候,因為我們都是開新叢集灌新資料然後馬上跑測試? |
詳細的等待時間
要這樣做也行,只是這樣會讓 Local Metric Store 越來越難用,走上這條路之後基本上等同於在鼓勵使用長期撈取的 Metric Store,不過這個可能也是無法避免的,因為分析網路流量會需要比較多的資訊,如果大家都同意的話那就這樣執行。 off topic: 我記得好幾個月或一年前的一次和 Metric 有關的討論結果是,我們要儘量避免這種長期儲存效能資訊的行為。不過現在看起來我們要走上這條路。我現在聯想到的其他問題是我們打算讓 |
這句話更完整應該是說“我們的設計必須有一定量的功能是在低複雜度(也就是local metric store) 下就能使用“,並不是說”全部”的功能都只要遵守。如果今天這個 cost 在物理意義上無法配合 local metrics,那就是走我們另一個使用情境,這是沒問題的
這裡我有另一個疑問,等多久 和 我們要存多久 這應該是兩件事情吧? |
我想到得知節點已經連續啟動 75 分種的方法是,看 我看你的敘述好像是打算在 |
不是的,我的意思能「辨識」這個指標是否已經沒有被影響,也就是已經過了起始那段時間,所以: 滿足上述network cost就可以開始計算 |
噢噢,我懂你的億思了,聽起來沒問題,最後就看要怎麼判斷他進入穩定的狀態 |
沒錯,你講到重點!我的直覺是類似你之前做的debunce 的邏輯,確認一小段時間的數值變化:
@garyparrot 你覺得呢 |
如果是我之前自己寫的統計邏輯,可以在統計區間不夠大的時候拋Exception,也就是在metrics不足的時候就不去做統計,避免發生這樣的狀況 |
稍微離題,我剛剛發現目前的統計計算方法,在現在的討論討論範圍之外存在一些嚴重的問題 目前的統計方法是去看 BrokerTopic 的流量,這個是 topic 一部分的 partitions 的流量合,因為目前假設每個 partition 流入的流量都是常數,所以每個 partition 的流量會以某個比例反映在 log size 之上,之後我們再用 log size 從 BrokerTopic 的流量去反推每個 partition 的比例。但如果有使用 retention.bytes 的話,這個 log size 的大小可能不太會去和 partition 的流入速度產生關係,進而造成預估上的不準確。 這個是我在使用 retention.bytes 做實驗時發現的問題,計劃產生出一個很接近 0 的計劃,預計可以把流量弄很平,但實際上搬移完後沒有那麼平,這個是很典型的 NetworkCost 預估錯誤現象,我從數據上有觀察到大約 50 MB/s 的預估不準確。
|
感謝回報,這的確是一個需要討論的議題。不過依照 kafka 背景清理資料的邏輯來看,我們在計算“平均流量”時當好撞到 retention 的機率很高嗎 (預設檢查 retention 的週期是五分鐘一次) ? 另外從 partition size 去推估 partition-level 的流量的確會遇到各種“資料量並非穩定成長”的議題,因此我想像中是在取樣的時候要盡可能“跳過“資料變動的時段,你覺得這樣有可能嗎? |
我目前觀察到的不準確的時機並非 retention 發生的那個時刻,而是第一次 retention 後的所有時刻。
如果在大家一起 retention 的前一刻做預估,預估結果是
目前是直接用純一個時段的 Size 去當權重,我在想你是不是覺得目前是用 (這個時刻的Size - 上個時刻的Size) / (經過時間) 當做權重,這個是用瞬時流量當權重,可能不會有上面的 x 很大時造成權重偏移的問題,不過用瞬時流量的問題是可能不穩定,但目前的取樣都是好幾秒的間隔,所以其實也不會瞬時到哪裡,或許影響還好。
這樣做的話可能要比較 t0, t1, t2, t3 的 size 來確定有沒有觸發 retention,如果有變小的跡象,那就是有觸發了 那感覺可以這樣做:
|
現在的計算方式是用 log size 來當做權重,如果每個 Producer 寫入資料的速度不變,則每個 log size 會是各自 現在提出改進做法是透過 log size 的變化量 其計算等同於 這個數字也是會和我們想要知道的比例呈現直接關係,所以適合拿來當做權重。不過他一樣會遇到 retention 的問題,如果 retention 觸發於 t1 和 t0 之間,則他的 另外一個問題是 partition 可以有副本,因此整個叢集內會有多個 partition 的 logs,在這個情況下會衍生一個議題是我們要用哪個 log 當做計算的依據,這個部分必須要採用是 leader 身份的那個 log,follower 的 log 不適合的原因是因為 follower 可能處於 insync 狀態,這個時候的流量將會是節點複製資料的流量,而非應用端寫入流量的速度,另外一個 follower log 可能是 reassignment 進行中 log,這個時候的流量也不會是來自應用端的寫入流量速度。因為只有 leader 身份的 log 可以被 client 寫入,因此可以很合理的認為他的 log 大小增加都是源自於 Producer 的寫入。 (@chia7712 這段線下討論的時候我沒有想到) 所以整體來說可以這樣對
|
這個推斷合理 +1
這個結論合理 +1 這個議題討論到的改善可以在七月的時候看要如何實作,希望能放到 0.3.0 裡面 |
進行 Balancer 實驗時發現 Cost 計算出來的預期叢集狀態和實際搬移下去的結果不一樣,本來 Ingress 的部分應該全部都是一樣的流量,但最終搬移出來的結果是有 5 個節點流量差不多,但 1 個節點和其他節點有 100 MB/s 的流量差異。
經過一些追蹤後發現
NetworkCost
給每個 partition 預估的流量和 Perf 那邊應該要打出去的流量不一致基本上每個 partition 都有這樣的現象(而且都是 Network Cost 預估的流量高過 Perf 的流量,而非更低),而 partition 數量有 10000 個,因此整個誤差堆積下來會造成很顯著的影響。
經過一些追蹤後目前懷疑是 Kafka Metrics 的問題:
這個測試是使用 #1476 的 Backbone Imbalance Scenario,在差不多 Performance Tool 啟動的時候開始追蹤 Kafka Broker 的幾個 MBean 值。
從上圖可以看到,當 Performance Tool 開始動起來的時候,他們的 Rate 是從一個很詭異的高處當做起始值。這感覺和我一開始預期的 Window 取法不太一樣。另外一個問題時他們的 FifteenMinuteRate 花了 15 分鐘以上的時間來收斂到應該的瞬時流量值。本來從名稱來猜測的話他會保留 15 minute 內的流量來做 average,但觀察下來的結果是,這個 window 可能有 50 分鐘的長度(或是他們的 window rate 定義和我想的不太一樣)。
這個行為代表如果
NetworkCost
想要準確的預估每個 partition 的流量,不能夠使用叢集一開始的 metrics,可能需要等一段時間才能採用。The text was updated successfully, but these errors were encountered: