前言
原本自以為閱讀了很久kafka的源碼,對于kafka的了解已經深入到一定程度了,后面在某大廠的面試中,面試官詢問我,如果需要提升kafka的性能,應該怎么做,我發現我能答上來的點非常的少,也暴露了我在學習時候缺少總結,導致要用的時候很難一次性快速表達出來,也讓我錯過了一個大廠的offer,盡管我在面試之后迅速做了相關問題總結,而且已經過去了半年,但是我還是會時不時想起這件事,所以想專門寫一篇kafka性能提升的總結文章來超度那件事,讓它不要再糾纏與我了,
一 生產者
1.1 配置優化
1 增加每個分區的消息批的大小( batch.size: 16k),適當增加批的最大緩存時間( linger.ms)讓生產者累積器中的每個Sender可以累積更多的消息再發送,減少網絡請求次數,同時也能增加broker硬盤IO的存儲效率(每次順序寫入的多)
2 增加生產者中累積器的內存緩沖區(buffer.memory: 32M)大小,當累積器的緩沖區用完時,也會吧消息發送給broker,通過增加增加生產者中累積器,也可以減少網絡請求次數
4 壓縮消息(compression.type:none-默認不壓縮),可以選擇 gzip、snappy、lz4、zstd 等。減少網絡傳輸的數據量,但是會增加cpu負擔,可以在網絡流量和cpu之間找到一個平衡點
5 在必要條件時,可以吧ack設置為0,但是會使得丟消息的概率提高
1.2 代碼優化
1 多線程生產,多個線程使用多個生產者并行生產消息
2 異步生產,生產者發送消息本身涉及網絡IO,而且除了異常處理外我們不太需要關注返回結果,所以可以通過線程池等異步生產消息,避免堵塞主線程,提升系統整體性能
3 批量生產和壓縮:盡管kafka生產者本身已經通過批量生產做了性能優化,但是這個并不妨礙我們在必要的時候自行積累數據批量發送(甚至手動壓縮)來減少網絡IO,提升整體吞吐量,畢竟kafka的批量生產和壓縮都是通用的算法,有時候我們可能根據業務數據的特點使用更加高效的批量生產和壓縮
二 消費者
2.1 配置優化
1 調整每次拉取消息的量(fetch.min.bytes和fetch.max.bytes)減少網絡IO
2.2 代碼優化
1 并行處理,消費者內部使用多線程處理消息。
2.3 部署優化
1 通過分區和消費者的關系,可以知道如果分區數和消費者數相同時候,可以充分利用并行處理能力
三 broker
3.1 配置優化
1 節點配置的優化,比如IO線程數(handler的數量:num.io.threads),網絡線程數(Processor的數量:num.network.threads),還有套接字緩沖區的大小(socket.send.buffer.bytes/socket.receive.buffer.bytes)
3 對kafka的jvm進行調優,比如內存和 GC方面優化
5 優化分區副本的放置,確保高可用的同時,避免跨數據中心的復制延遲
3.2 部署優化
1 適當增加topic的分區數,充分運用到多個broker資源和broker內部的并行處理能力,但需注意過多的分區可能導致的問題。
2 使用固態硬盤等增加硬盤性能,優化文件存儲目錄的布局以減少 I/O 競爭,如果有多個硬盤,盡量讓日志文件分布在多個硬盤上
3?采用 LogDir 多個目錄分散寫入負載。