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

Kafka Producer metrics 有時會出現 NaN 的統計值 #598

Closed
chinghongfang opened this issue Aug 18, 2022 · 13 comments · Fixed by #1304
Closed

Kafka Producer metrics 有時會出現 NaN 的統計值 #598

chinghongfang opened this issue Aug 18, 2022 · 13 comments · Fixed by #1304
Labels
bug Something isn't working

Comments

@chinghongfang
Copy link
Collaborator

image

使用performance tool 打/消費 資料時,producer 紀錄的 producer.node.metrics 其中一個 node ,中的 request-avg-latency 是 NaN。

@chia7712 chia7712 added the bug Something isn't working label Aug 24, 2022
@chia7712
Copy link
Contributor

@chinghongfang 可否將你遇到的狀況再多描述一點?

@chia7712 chia7712 changed the title jmx 沒有出現資料 Kafka Producer metrics 有時會出現 NaN 的統計值 Nov 28, 2022
@chia7712 chia7712 mentioned this issue Nov 28, 2022
@chinghongfang
Copy link
Collaborator Author

現在的版本沒有觀察到 NaN 的 request-latency-avg 了。在 #599 之後,便不容易出現 request-latency-avg NaN 的情況了,當時沒有注意到,沒關掉這個議題,不好意思...

另外,現在的 StrictCostDispatcher 流量震盪不是因為 jmx metric 的數值會出現 NaN,(在跑實驗期間,觀察 jmc 上的 request-latency-avg 都沒有出現 NaN),以下環境以及附上流量結果

Topic partition allocation

Topic \ Broker ID 1001 1002 1003
test12 30 partitions 30 partitions 0 partitions
test23 20 partitions 20 partitions 20 partitions
test123 0 partitions 30 partitions 30 partitions

各 server 執行軟體

執行軟體 1001 1002 1003 C1 C2 C3
Zookeeper V
Kakfa Broker V V V
Node Exporter V V V
Prometheus V
Grafana V
Astraea Performance tool V V V

broker 1001 的網路流量
2022-11-29_16-20

broker 1002 的網路流量
2022-11-29_16-21

broker 1003 的網路流量
2022-11-29_16-21_1

broker 1001, 1002 都維持在較高的水平上,但是 broker 1003 卻有時衝高,變動極大。

@chia7712
Copy link
Contributor

但是 broker 1003 卻有時衝高,變動極大。

有機會先排除是不是 監控造成的嗎?例如把監控移到其他節點再跑跑看

@chinghongfang
Copy link
Collaborator Author

原因在於使用 StrictCostDispatcher 時,會把 record 都發送到同一台 broker 上。如果 record 都沒有發送到某一台 broker 上(約一分鐘),該 broker 的 request latency avg 就會顯示 NaN

record 都不發送到某一台 broker 的原因有點複雜,流程放在最下面。主要原因是

  1. StrictCostDispatcher#costToScore 會讓 cost 最高的節點 0 分(不選擇 cost 最高的 broker)
  2. NodeLatencyCost 會過濾 NaNHasBeanObject,若某 broker 所有的數值都是 NaN,該 broker 就不會出現在回傳的 BrokerCost
  3. 不發送 record 到某 broker 的話,該 broker 的 request latency avg 就不改變,約 1 分鐘都不發送,request latency avg 就會變 NaN。

流程

  1. 某一次紀錄到較高的 request latency avg (e.g. 15 ms) ->
  2. record 不發送到該 broker ->
  3. 該 broker 的 request latency avg 不變 (e.g. 同上 15ms) ->
  4. 2., 3. 持續 1 分鐘,便紀錄到 NaN ->
  5. NaN 會被捨棄所以 cost function 計算用的數據還是先前的紀錄 (e.g. 同上 15 ms) ->
  6. 2., 5. 持續 3 分鐘,metricCollector 自動清除過期數據 ->
  7. 該 broker 所有的 request latency avg 全部都是 NaN,全被過濾掉,BrokerCost內不存在該 broker ->
  8. BrokerCost 內沒有該 broker ,便不會選擇該 broker

@chia7712
Copy link
Contributor

某一次紀錄到較高的 request latency avg (e.g. 15 ms) ->
record 不發送到該 broker ->

感謝分析,這段看起來是重點,就算是評分很差的節點,理論上應該也要塞一些些資料給它?我印象中現在應該是用機率來處理?也就是評分差只是拿到資料的機率變很低,應該不至於都拿不到?

@chinghongfang
Copy link
Collaborator Author

現在是使用 Smooth Round Robin,這裏,用這個方法,且傳進去的分數是 0 的話,那就不會選到了。或許最低分不要是零,這樣就不會完全選不到。

@chia7712
Copy link
Contributor

用這個方法,且傳進去的分數是 0 的話,那就不會選到了

好發現,這是一個關鍵重點!你覺得可以怎麼修正?確保用來做 smooth 的分數不可以為 0 ? 或是從演算法著手避免這種奇怪的運算結果(0分也要有人權)

@chinghongfang
Copy link
Collaborator Author

我的想法是 smooth 的做法維持,不過我們傳進去的最低分不要是 0 。
我認為這個分數和隨機選取的機率很像,機率為零,也是完全不選。以後也可能會有 "完全不選" 的需求。
以這個 cost function 為例,也許可以把原先 costToScore 的做法 (max - e.getValue()),多平移一段最小值 (max + min - e.getValue())。

請問 @chia7712 覺得有需要修改 Smooth 的邏輯嗎?

@chia7712
Copy link
Contributor

也許可以把原先 costToScore 的做法 (max - e.getValue()),多平移一段最小值 (max + min - e.getValue())。

@wycccccc 我記得你也有提過這個現象?

覺得有需要修改 Smooth 的邏輯嗎?

我是在想這個演算法設計的時候有考慮過 <= 0 的值嗎?如果 <= 0 會造成該物件永遠不會被選上,就使用上來說“很奇怪“,因為這是一個很特殊的狀況,例如從一致性來看,就不會出現某個分數導致某個物件”永遠都被選上“,簡單來說,我覺得設計上應該要排除 <= 0 這種永遠都不會被選上的狀況,因為我們也不會預期某個物件永遠都被選上,設計上可以直接丟出例外來確保我們不會再遇到這種詭異的結果

@wycccccc
Copy link
Collaborator

wycccccc commented Dec 1, 2022

也許可以把原先 costToScore 的做法 (max - e.getValue()),多平移一段最小值 (max + min - e.getValue())。
@wycccccc 我記得你也有提過這個現象?

我對於smooth權重的計算是用 上一次的權重*這次的偏移量,所以永遠不會變爲0。不過我爲了讓偏移量不計算出0,所以用了類似於此的方法。
如果要直接對smooth權重加上min,在這一點上可能需要考慮min對於smooth的影響。因爲加上一個數會導致smooth在做選擇時變得不敏感。

如果 <= 0 會造成該物件永遠不會被選上,就使用上來說“很奇怪“

確實在實務上很奇怪,如果想表達0,應該選擇讓參數趨近於0而不是0。丟出例外加寫個註解告訴以後使用的人我認爲就可以了。

@chia7712
Copy link
Contributor

chia7712 commented Dec 1, 2022

確實在實務上很奇怪,如果想表達0,應該選擇讓參數趨近於0而不是0。丟出例外加寫個註解告訴以後使用的人我認爲就可以了。

+1

也許可以把原先 costToScore 的做法 (max - e.getValue()),多平移一段最小值 (max + min - e.getValue())。

先用平移的方式處理吧!然後在 smooth 上增加檢查不合法的初始值

@chia7712
Copy link
Contributor

chia7712 commented Dec 7, 2022

@chinghongfang 後來有更新嗎

@chinghongfang
Copy link
Collaborator Author

後來有更新嗎

那我之後再開一隻 PR 處理,並在 PR 內附上實驗數據。

@chinghongfang chinghongfang linked a pull request Dec 21, 2022 that will close this issue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants