(1)順序讀寫:基於磁碟的隨機讀寫確實很慢,但磁碟的順序讀寫效能卻很高,一些情況下磁碟順序讀寫效能甚至要高於記憶體隨機讀寫。(kafka的message是不斷追加到本地磁碟檔案末尾的,而不是隨機的寫入,這使得kafka寫入吞吐量得到了顯著提公升 。)
(2)page cache:為了優化讀寫效能,kafka利用了作業系統本身的page cache,就是利用作業系統自身的記憶體而不是jvm空間記憶體,這樣做的好處是:
2:避免gc問題:隨著jvm中資料不斷增多,垃圾**將會變得複雜與緩慢,使用系統快取就不會存在gc問題。
通過作業系統的page cache,kafka的讀寫操作基本上是基於記憶體的,讀寫速度得到了極大的提公升。
(3)零拷貝:(不使用的時候,資料在核心空間和使用者空間之間穿梭了兩次),使用零拷貝技術後避免了這種拷貝。通過這種 「零拷貝」 的機制,page cache 結合 sendfile 方法,kafka消費端的效能也大幅提公升。這也是為什麼有時候消費端在不斷消費資料時,我們並沒有看到磁碟io比較高,此刻正是作業系統快取在提供資料。
(4)分割槽分段+索引:topic 中的資料是按照乙個乙個的partition即分割槽儲存到不同broker節點的,每個partition對應了作業系統上的乙個資料夾,partition實際上又是按照segment分段儲存的,這也非常符合分布式系統分區分桶的設計思想。kafka的message訊息實際上是分布式儲存在乙個乙個segment中的,每次檔案操作也是直接操作的segment。為了進一步的查詢優化,kafka又預設為分段後的資料檔案建立了索引檔案,就是檔案系統上的.index檔案.這種分割槽分段+索引的設計,不僅提公升了資料讀取的效率,同時也提高了資料處理的並行度。
(5)批量讀寫:kafka資料讀寫也是批量的而不是單條的。在向kafka寫入資料時,可以啟用批次寫入,這樣可以避免在網路上頻繁傳輸單個訊息帶來的延遲和頻寬開銷。假設網路頻寬為10mb/s,一次性傳輸10mb的訊息比傳輸1kb的訊息10000萬次顯然要快得多。
(6)批量壓縮:
在很多情況下,系統的瓶頸不是cpu或磁碟,而是網路io,對於需要在廣域網上的資料中心之間傳送訊息的資料流水線尤其如此。進行資料壓縮會消耗少量的cpu資源,不過對於kafka而言,網路io更應該需要考慮。
kafka速度的秘訣在於,它把所有的訊息都變成乙個批量的檔案,並且進行合理的批量壓縮,減少網路io損耗,通過mmap提高i/o速度,寫入資料的時候由於單個partion是末尾新增所以速度最優;讀取資料的時候配合sendfile直接暴力輸出。
kafka高吞吐量的原因
kafka的訊息是不斷追加到檔案中的,這個特性使kafka可以充分利用磁碟的順序讀寫效能 順序讀寫不需要硬碟磁頭的尋道時間,只需很少的扇區旋轉時間,所以速度遠快於隨機讀寫 生產者負責寫入資料,kafka會將訊息持久化到磁碟,保證不會丟失資料,kafka採用了倆個技術提高寫入的速度。1.順序寫入 在大...
Kafka (十)Kafka 如何實現高吞吐量
kafka的訊息是不斷追加到檔案中的,這個特性使kafka可以充分利用磁碟的順序讀寫效能 順序讀寫不需要硬碟磁頭的尋道時間,只需很少的扇區旋轉時間,所以速度遠快於隨機讀寫 生產者負責寫入資料,kafka會將訊息持久化到磁碟,保證不會丟失資料,kafka採用了倆個技術提高寫入的速度。1.順序寫入 在大...
kafka高吞吐量,為什麼這麼快!
kafka有個很重要的特性,高速的傳送和接收訊息,超高的吞吐量。這裡來討論一下kafka超高的吞吐量原理 1.寫 頁面快取,順序寫入磁碟。producer 生產訊息 broker 會先將資料先寫入到頁面快取 page cache 基於mmap 刷盤 順序寫入到磁碟 順序寫入比隨機的ssd更快 bro...