Kafka 的高性能
家用電腦的性能與配置的關(guān)系——價(jià)格更昂貴的服務(wù)器會(huì)有更好的性能
Kafka 使用普通服務(wù)器就能實(shí)現(xiàn) TB 級(jí)別的傳輸性能
Kafka 被廣泛運(yùn)用于大數(shù)據(jù)處理,流式計(jì)算,各類日志監(jiān)控等需要處理海量數(shù)據(jù)的場(chǎng)景
從以下三方面進(jìn)行分析

分析Kafka 的高性能會(huì)涉及操作系統(tǒng)的一些知識(shí),如果文件系統(tǒng),PageCache 等
磁盤順序讀寫
Kafka 文件在磁盤上如何實(shí)現(xiàn)高性能的讀寫呢?
Kafka 對(duì)磁盤的應(yīng)用,得益于消息隊(duì)列的存儲(chǔ)特性
消息隊(duì)列對(duì)外提供的主要方法是生產(chǎn)和消費(fèi),不涉及到 CRUD
寫入磁盤時(shí),使用順序追加的方式來(lái)避免低效的磁盤尋址
磁盤有機(jī)械硬盤和固態(tài)硬盤
- 機(jī)械硬盤——成本低,容量大,但每次讀寫都會(huì)尋址,在寫入數(shù)據(jù)
- SSD 固態(tài)硬盤—— 性能很高,有著非常低的尋道時(shí)間和存取時(shí)間,但成本的特別高
Kafka 采用 append 的方式進(jìn)行順序?qū)懭?br> 提高在機(jī)械硬盤上讀寫的速度
在 Linux 系統(tǒng)中,把數(shù)據(jù)寫入文件系統(tǒng)后,數(shù)據(jù)存放在操作系統(tǒng)的 page cache 里
寫到磁盤的過程 叫做 Flush
刷盤的方式:
- 依靠操作系統(tǒng)進(jìn)行管理,定時(shí)刷盤
- 同步刷盤,比如調(diào)用 fsync 等系統(tǒng)函數(shù)
Kafka 可以配置一步刷盤,不開啟同步刷盤
異步刷盤不需要等寫入磁盤后返回消息投遞的 ACK
提高了消息發(fā)送的吞吐量,降低了請(qǐng)求的延時(shí)
批量操作優(yōu)化
Redis —— 實(shí)現(xiàn)了 pipeline 管道批量操作
Kafka 的批量包括批量寫入,批量發(fā)布等
在消息投遞時(shí)會(huì)將消息緩存起來(lái),然后批量發(fā)送
消息端在消息消息時(shí),批量進(jìn)行拉取,提高了消息的處理速度
Kafka 的數(shù)據(jù)傳輸可以配置壓縮協(xié)議,比如 Gzip 和 Snappy 壓縮協(xié)議
進(jìn)行數(shù)據(jù)壓縮時(shí),可以減少網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)大小,優(yōu)化網(wǎng)絡(luò)IO,提升傳輸速率等
Sendfile 零拷貝
零拷貝是什么?
用戶進(jìn)程進(jìn)行系統(tǒng)調(diào)用——由用戶態(tài)切換到內(nèi)核態(tài),待內(nèi)核處理完之后,再返回用戶態(tài)
傳統(tǒng)的IO流程?:
1、把數(shù)據(jù)拷貝到內(nèi)核緩沖區(qū)
2、從內(nèi)核緩沖拷貝到用戶空間
3、應(yīng)用程序處理完成以后,再拷貝回內(nèi)核緩沖區(qū)
Kafka 依賴 Linux 內(nèi)核提供的 Sendfile 系統(tǒng)調(diào)用
數(shù)據(jù)在內(nèi)核緩存區(qū)完成輸入和輸出,不需要拷貝到用戶空間處理
Kafka 把所有的消息存放在單獨(dú)的文件里,在消息投遞時(shí)直接通過 Sendfile 方法發(fā)送文件
MMAP技術(shù)(也是零拷貝技術(shù))
Kafka 節(jié)點(diǎn)運(yùn)行需要 JVM 的支持,但是 Kafka 并不直接依賴 JVM 堆內(nèi)存
Kafka 使用 Memory Mapped Files 完成內(nèi)存映射
Memory Mappend Files 直接對(duì)內(nèi)存地址的操作
調(diào)用文件的 read 操作——把數(shù)據(jù)先讀取到內(nèi)核空間中,然后再?gòu)?fù)制到用戶空間
MMAP將文件直接映射到用戶態(tài)的內(nèi)存空間,省去用戶空間到內(nèi)核空間復(fù)制的開銷