kafka的訊息是不斷追加到檔案中的,這個特性使kafka可以充分利用磁碟的順序讀寫效能
順序讀寫不需要硬碟磁頭的尋道時間,只需很少的扇區旋轉時間,所以速度遠快於隨機讀寫
生產者負責寫入資料,kafka會將訊息持久化到磁碟,保證不會丟失資料,kafka採用了倆個技術提高寫入的速度。
1.順序寫入:在大學的計算機組成(劃重點)裡我們學過,硬碟是機械結構,需要指標定址找到儲存資料的位置,所以,如果是隨機io,磁碟會進行頻繁的定址,導致寫入速度下降。kafka使用了順序io提高了磁碟的寫入速度,kafka會將資料順序插入到檔案末尾,消費者端通過控制偏移量來讀取訊息,這樣做會導致資料無法刪除,時間一長,磁碟空間會滿,kafka提供了2種策略來刪除資料:基於時間刪除和基於partition檔案的大小刪除。
在這之前先來了解一下零拷貝:平時從伺服器讀取靜態檔案時,伺服器先將檔案從複製到核心空間,再複製到使用者空間,最後再複製到核心空間並通過網絡卡傳送出去,而零拷貝則是直接從核心到核心再到網絡卡,省去了使用者空間的複製。
kafka把所有的訊息存放到乙個檔案中,當消費者需要資料的時候直接將檔案傳送給消費者,比如10w的訊息共10m,全部傳送給消費者,10m的訊息在內網中傳輸是非常快的,假如需要1s,那麼kafka的tps就是10w。zero copy對應的是linux中sendfile函式,這個函式會接受乙個offsize來確定從**開始讀取。現實中,不可能將整個檔案全部發給消費者,他通過消費者傳遞過來的偏移量來使用零拷貝讀取指定內容的資料返回給消費者。
在linux kernel2.2 之後出現了一種叫做"零拷貝(zero-copy)"系統呼叫機制,就是跳過「使用者緩衝區」的拷貝,建立乙個磁碟空間和記憶體的直接對映,資料不再複製到「使用者態緩衝區」,系統上下文切換減少為2次,可以提公升一倍的效能。
kafka中的topic中的內容可以被分為多分partition存在,每個partition又分為多個段segment,所以每次操作都是針對一小部分做操作,很輕便,並且增加並行操作
的能力
kafka允許進行批量傳送訊息,producter傳送訊息的時候,可以將訊息快取在本地,等到了固定條件傳送到kafka
等訊息條數到固定條數
一段時間傳送一次
producer壓縮之後,在consumer需進行解壓,雖然增加了cpu的工作,但在對大資料處理上,瓶頸在網路上而不是cpu,所以這個成本很值得
kafka吞吐量高的原因
1 順序讀寫 基於磁碟的隨機讀寫確實很慢,但磁碟的順序讀寫效能卻很高,一些情況下磁碟順序讀寫效能甚至要高於記憶體隨機讀寫。kafka的message是不斷追加到本地磁碟檔案末尾的,而不是隨機的寫入,這使得kafka寫入吞吐量得到了顯著提公升 2 page cache 為了優化讀寫效能,kafka利用...
Kafka (十)Kafka 如何實現高吞吐量
kafka的訊息是不斷追加到檔案中的,這個特性使kafka可以充分利用磁碟的順序讀寫效能 順序讀寫不需要硬碟磁頭的尋道時間,只需很少的扇區旋轉時間,所以速度遠快於隨機讀寫 生產者負責寫入資料,kafka會將訊息持久化到磁碟,保證不會丟失資料,kafka採用了倆個技術提高寫入的速度。1.順序寫入 在大...
kafka高吞吐量,為什麼這麼快!
kafka有個很重要的特性,高速的傳送和接收訊息,超高的吞吐量。這裡來討論一下kafka超高的吞吐量原理 1.寫 頁面快取,順序寫入磁碟。producer 生產訊息 broker 會先將資料先寫入到頁面快取 page cache 基於mmap 刷盤 順序寫入到磁碟 順序寫入比隨機的ssd更快 bro...