-
Notifications
You must be signed in to change notification settings - Fork 61
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
查核點 - consumer 吞吐量討論 #1475
Comments
@harryteng9527 感謝測試,這次實驗做得完整很多,讚讚
可否描述一下 partitions 在這三台設備的分佈? |
另外可否針對這個不穩的狀況再做一個實驗,在既有叢集下,把 producers 關掉,然後只開 consumers 拉資料(用一樣的partitions分佈)看看是否一樣有資料流不穩的狀態,這個實驗不需要 assignor,全部都手動指定 partitions |
partition 分佈如下表:
創建 partition 的指令如下:
會想這樣分佈是因為想要讓每個 broker 都承受相同負載,像上面提到的 partition 流量分佈 |
目前發現了 Consumer 讀取每個節點的吞吐量會受到各節點 partition 剩餘資料量的多寡影響,並且有去閱讀相關 source code
這次實驗最後得出了一個結論, assignor 必須感知在分配相同 broker 的 partitions 時,要避免分配流量差異過大的 partition 給 consumer,否則會造成情境一實驗的問題 - 吞吐量低落 以下利用實驗驗證當 Consumer 被分配到不同資料規模的 partition 時吞吐量的變化 情境一、 Partitions 配置在同一台 broker 上Topic 與 Partition 數量創建 1 個 topic:
叢集拓樸
資料量分配測試方式
實驗數據以下是根據閱讀 source code 後,先自己用紙筆計算在實驗環境執行後會有什麼樣的結果,再根據實驗來驗證是否思考的正確 Fetch RequestConsumer 使用的參數都是預設,所以 fetch.max.wait.ms 為 500ms。 這實驗讓 broker 接收到的 fetch request 大都在 4 req/s 附近,是因為目前 consumer fetch 的邏輯所導致,以下簡單自己計算 fetch request 應該為多少,再以實驗佐證 自己紙筆計算
所以在此實驗中, broker 每秒會收到的 fetch request 數量會是 4
實驗佐證如自己思考相同,Broker 每秒接收到的 fetch request 為 4 Delay expire: 這個 metric 是 Kafka broker 紀錄 如上面紙筆計算時會有 2 次 fetch request 會等待直到 expire,因為 test-0 沒有資料。實驗後也發現確實如此 Throughput因為上面分析出來發送 fetch request 的數量很低,所以吞吐量自然也會受到影響 為什麼是 2MiB 這個是其他參數可以設置的,本次實驗不討論
情境二、 Partitions 配置在不同台 broker 上Topic 與 Partition 數量創建 1 個 topic:
叢集拓樸
資料量分配測試方式
實驗數據也是先以紙筆的方式先計算實驗預期會如何 情境二的實驗,因為有資料與沒資料的 partition 放在不同 broker 上,所以 consumer 的吞吐量不會被沒有資料的 partition 影響,吞吐量會比情境一的 2MiB 還要高得多 Throughput |
麻煩也把 workaround 寫上去,並且說明原因 |
Workaround
原因
TODO
|
可否也說明一下如果使用者不是用我們的assignor,但也遇到這個問題的話,他們可以調整哪個參數來處理這個議題?然後為何那個參數可以修復該問題 |
若這個問題是指:consumer 遇到同個節點 partition 剩餘讀取資料量差異過大的情境,那麼使用者可以將 Why會發生這個問題主要是因為 broker 第一次讀取 partition 資料時讀不到資料,而這會牽扯到
下面舉個例子說明:
ExampleKafka consumer 中 如下圖,紅色線表示的是 若 broker 沒有讀取到任何資料,broker 會等待一段時間(fetch.max.wait.ms) 後再讀取一次 所以把 |
@harryteng9527 解釋得很好,麻煩之後用同樣的水平把這個問題和解法放到 QA 文件裡面 |
related #1437 (comment)
此 issue 的目的是想討論: partition 的分配與 consumer 吞吐量的關係
實驗目的
希望能藉由此次實驗,測試依據 partition 流入資料量當作負載的 assignor 所分配出來的 assignment 會讓 consumers 的吞吐量與延遲能優化到什麼程度
而查核點要使用 Kafka 的預設 assignor - Range assignor 與 NetworkIngress assignor 來比較,下面為這兩個 assignor 的吞吐量表現以及實驗環境
實驗環境
此次實驗使用的 performance tool 有開啟 throttle 功能,而會使用 throttle 功能是希望營造出流入每個 partition 的流量不同的情境,營造部份 partition 的資料量 skew 的情境,並且使用 Range assignor 與 NetworkIngress assignor 來比較 consumer group 整體的吞吐量
每個 partition 所承受的流量如下:
Range assignor
使用 Range assignor 的 assignment 如下:
Range 的分配讓每個 consumer 需要處理的資料量不同,這樣的 assignment 使得每個 consumer 需處理的資料量如下:
實際的吞吐量
與上面表格所想相同,實驗出來的吞吐量跟需處理的流量相近
Grafana snapshot
NetworkIngress assignor
此 assignor 是利用 NetworkIngress CostFunction 來取得每個 partition 的流入流量,使用的 metrics 是 ServerMetrics 的 BYTES_IN_PER_SEC 並且蒐集 15 分鐘的流入量(fifteenMinuteRate) 當作負載進行分配
此次實驗的 assignment 如下:
根據此 assignment,每個 consumer 需要處理的資料量如下:
實際的吞吐量
Grafana snapshot
實驗討論
為了找出 consumer 吞吐量起起伏伏的原因,目前還在看 source code 且了解 consumer 參數的意義,並做一些小實驗驗證有無正確理解參數的意義,藉此找吞吐量起起伏伏的原因
不過目前可以先排除 producer 打資料不夠快,導致 consumers 需要等待資料的原因
為何可以排除 producer 資料打不夠快
我覺得可以排除的原因有下列兩點:
Grafana 監控的數據
Range assignor 的數據如下:
此圖所表示的是 Consumer 所消費的吞吐量(圖表的 Legend 為 Consumer#)與 partition 內資料的增長速率(可看作 producer 送資料的速率,圖表的 Legend 為 log size#)
上圖給我的感覺為幾乎 send 多少資料就消費多少資料,除了太多資料量而消費不來的 Consumer#175 會有一點 Lag 外
這邊與 rate 的差別是直接看 consumer 消費的總 bytes 數、partitions 資料量的增長
從這張圖來看也是沒有 producer 影響到 consumer 的情形。因為 Consumer 消費的資料量都會 ≤ partition 內儲存的資料量
NetworkIngress assignor 的數據如下:
分別以各個 consumer 來觀察
以上圖來看,Consumer#174 表示一個 consumer 所消費的 total bytes 再換算成 rate 去看消費的速率,而 assigned by 174 表達的是 Consumer#174 所被分配到的 partitions 資料的增長速率,PQL 如下
大概介紹完此圖表使用的 query 、物理意義後,下面再貼上其他的 consumer 圖表
這幾張圖帶給我的感覺是 consumer 沒辦法好好的消化送進 partition 的資料。如 174 與 176, consumer 的消費速率與 partition 的資料差了一半
所以不會是 producer 資料打不夠快造成 consumer 需要等待資料,進而影響到吞吐量
從這張圖,也能得知 producer 沒有影響到 consumer。因為 Consumer 總共消費的資料量是低於總資料量的,圖中的 Consumer# 為消費的 total bytes、log size# 為 consumer# 被分配到的 partitions 的資料量
The text was updated successfully, but these errors were encountered: