算法優化改版有大需求要上線,在線特徵dump數據逐步放量,最終達到現有Kafka集羣5倍的流量,預計峯值達到萬兆網卡80%左右(集羣有幾十個物理節點,有幾PB的容量,網卡峯值流出流量會達到800MB左右/sec、寫入消息QPS爲100w+ msgs/sec)。上下游服務須要作擴容評估,提早作好容量規劃,保障服務持續穩定運行html
通過對Kafka集羣軟硬件資源及利用率綜合分析與評估,決定不擴容機器,徹底能夠應對流量擴大5倍的性能挑戰算法
流量灰度時間表shell
預先優化在topics建立的狀況下,沒有流量時作的優化工做
本次在線特徵dump放量topics列表以下:centos
onlinefeedback indata_str_onlinefeedback_mixxxbrowser indata_str_onlinefeedback_oppoxxxbrowser indata_str_onlinefeedback_3rd
......
violet集羣的topics爲indata_str_click_s3rd 和 indata_str_video_3rd_cjv 完成擴容並rebalance找出其餘流量大的topics列表
以上topic都已經建立,可是隻覆蓋了少數磁盤掛載點,violet集羣有21個節點252磁盤掛載點,但有些topics的partitions數量不到30,形成磁盤利用率不高,IO不均衡。
優化點:擴容partitions數量,覆蓋更多磁盤掛載點緩存
2020-02-21日 開始放量 topics均值流量小於20%,如下是放量後22~23日監控數據(讀寫IOPS、IOutil)性能優化
從以上數據分析,讀寫IOPS和ioutil極其不均衡,並且其中寫IOPS走向極端上下兩條線,後來查明緣由是zk事務日誌是實時單條commit,大量flink使用0.8.x版本,消費狀態用zk存儲形成的。另外還發現violet出口流量不均衡,高的70%、低的10%左右,當時flink消費出現阻塞現象,緣由爲上線前Flink未及時調大fetch.message.max.bytes的大小,引起violet集羣部分broker網絡出口流量飆升。bash
2020-02-26日 在線特徵dump數據的topics均值放量到50%左右
優化zk集羣寫入性能從1.5k降到100之內,單事務寫強制刷盤改成事務批量按期刷盤,在線Dump特徵流量放量,排查violet集羣線上隱患,因爲消費端flink仍是依賴的較低kafka-0.8.x版本,消費狀態存儲zk,致使寫入頻繁。此外zk的日誌數據和事務數據目錄從數據盤調整到系統盤,數據盤統一Kafka使用網絡
serving使用kafka按key進行hash分配出現生產傾斜致使消費出現lag,和業務方商定修改消費邏輯解決此問題
2020-03-02日 在線特徵dump放量75%,優化violet集羣IO完成了80%以上,支撐在線特徵100%放量應該沒有問題,主要對10.120.14.十一、10.103.35.七、10.103.35.二、10.120.10.8等4個節點IO削峯均衡化,熱點掛載點IO峯值降低30~60%不等,操做策略以下:session
優化前監控(3.02~3.03區間數據)異步
ioutil被打滿,磁盤很是繁忙,響應變慢等待時間變長
優化後效果以下(3.06日區間數據)
紅框部分IO持續高位爲當時部分partition遷移致使的,能夠忽略不計,因爲2020-03-0二、2020-03-0三、2020-03-05持續放量直到100%,優化效果不明顯
2020-03-04日 客戶端參數優化
jstorm
flink
03-06日 優化violet集羣IO完成了95%以上,主要對10.120.14.十一、10.103.35.七、10.103.35.二、10.103.35.三、10.103.35.十、10.120.10.二、10.120.10.三、10.120.10.五、10.120.10.六、10.120.10.七、10.120.10.八、10.120.10.九、10.120.10.11等13個節點IO削峯均衡化和磁盤使用率均衡化
下面是3.07~3.08日區間監控數據
3.08日 內時間點監控數據
3.08日 是週日 經過監控獲知indata_str_onlinefeedback_mibrowser和indata_str_onlinefeedback_3rd-small消費流量比較大,須要作IO均衡化
indata_str_onlinefeedback_mibrowser每秒消費流量
indata_str_onlinefeedback_3rd-small每秒消費流量2.5GB
03.09日 截止下午17:00最近6小時數據(3.08日晚優化後效果)
內核參數優化
sudo blockdev --setra 16384 /dev/sdx sudo sh -c 'echo "4096" > /sys/block/sdx/queue/nr_requests' sudo sh -c 'echo "500" > /proc/sys/vm/dirty_writeback_centisecs' sudo sh -c 'echo "35" > /proc/sys/vm/dirty_ratio' sudo sh -c 'echo "5" > /proc/sys/vm/dirty_background_ratio'
sudo sh -c 'echo "2000" > /proc/sys/vm/dirty_expire_centisecs'
2020-03-11日 截止下午17:00最近6小時數據
可否徹底磁盤IO均衡,比較困難,但還能夠下降,由於這跟客戶端生產/消費策略及消費歷史數據有關,有些不可控因素。
2020-03-11日 kafka jvm heap優化 經過Kafka集羣業務監控發現利用率低
減小jvm heap大小,讓渡給pagecache作系統級數據緩存
另外Apache Kafka PMC大神王國璋回覆:Kafka對內存要求不大,可是若是客戶端版本較低會須要down convert version,這個過程是很是消耗CPU和內存的。緣由是Producer向Kafka寫入數據時,佔用的堆外內存NIO Buffer,當消費讀數據時,Kafka並不維護內存數據,由於使用系統函數sendfile將數據直接從磁盤文件複製到網卡設備中,而不須要經由應用程序之手。採集監控數據以下:
NIO Buffer
non-heap memory
早期jvm heap配置爲32GB,後來優化爲16GB,如今降到10GB,既保證了kafka進程穩定,又不浪費內存
性能優化可否預先或提早一次性所有搞定?
通常性topics的partitions擴容能夠提早作,jvm heap也能夠提早修改,可是有些參數就無法肯定了,由於集羣流量不大,負載不高,沒有性能瓶頸,找不到更看不出瓶頸在哪裏,優化了也看不出效果。之內核參數優化爲例
Centos Performance Tuning
另外IO均衡化也是,集羣流量壓力不大,找不到須要IO均衡化的目標topics。只有流量逐步放大,才容易發現並識別問題topics
因此優化須要分類、分批、分場景、根據瓶頸、風險、效果、難易程度逐步推動。
在線特徵dump上線持續放量直至100%過程,咱們作了大量調整和優化,它是一個按部就班和不斷完善的過程,不可能一蹴而就,回顧優化列表以下:
要作到全面性、多維度、立體化的綜合性能優化並達到預期理想效果,須要對相關Kafka、jvm、netty技術原理及OS等等(不限於)有至關理解。例如持續IO均衡化,就是須要運用綜合手段來解決,利用管理平臺、各種監控數據和shell命令找出觸發瓶頸的topics及對應partitions,而後用工具遷移實現IO再平衡。
以上操做是反覆循環進行的動做,觀察-》分析-》操做-》查看效果-》再觀察... 反覆進行直至達到最佳狀態
如下爲partitions目錄遷移bugs,通過分析,重啓後解決,錯誤緣由是broker應用內存中保留了partition目錄遷移狀態信息,重啓後還原,但繼續執行遷移須要從新操做