1. 程式人生 > >kafka速度為什麽快

kafka速度為什麽快

byte dev evel kafka 獲取 為我 如果 kernel 內容

1. kafka 使用了 分區、分布式、leader/followere 的方式。
分布式讓 kafka 排除了單點故障,分區和分區復制讓數據不丟失
2. kafka 使用 zero copy 技術 (基於 linux 的 sendfile 函數),可以減少傳統數據傳遞時在 kernel 態和 user 態的 context 切換的空間和時間損耗。zero copy 技術使得將文件內容可以直接提交到 kenel 的 socket buffer. 避免了用戶態調用 kenel 獲取數據,然後用戶態再將數據提交到 kenel 態的時間和空間。
zero copy : https://www.ibm.com/developerworks/linux/library/j-zerocopy/
3.kafka 使用大的 SATA 盤存儲數據, 數據進入到分區的消息隊列尾部,這樣的磁盤順序寫比傳統的 BTREE 隨機寫性能高了很多。磁盤順序寫的速度甚至比內存隨機寫都快。
消費者與生產者互相不幹擾,消費者讀取消息隊列的頭部,生產者讀取消息隊列的尾部。 這樣沒寫鎖,讀鎖。性能非常高。

Memory Mapped Files

即便是順序寫入硬盤,硬盤的訪問速度還是不可能追上內存。所以Kafka的數據並不是實時的寫入硬盤,它充分利用了現代操作系統分頁存儲來利用內存提高I/O效率。
Memory Mapped Files(後面簡稱mmap)也被翻譯成內存映射文件,在64位操作系統中一般可以表示20G的數據文件,它的工作原理是直接利用操作系統的Page來實現文件到物理內存的直接映射。完成映射之後你對物理內存的操作會被同步到硬盤上(操作系統在適當的時候)

通過mmap,進程像讀寫硬盤一樣讀寫內存(當然是虛擬機內存),也不必關心內存的大小有虛擬內存為我們兜底。
使用這種方式可以獲取很大的I/O提升,省去了用戶空間到內核空間復制的開銷(調用文件的read會把數據先放到內核空間的內存中,然後再復制到用戶空間的內存中。)也有一個很明顯的缺陷——不可靠,寫到mmap中的數據並沒有被真正的寫到硬盤,操作系統會在程序主動調用flush的時候才把數據真正的寫到硬盤。Kafka提供了一個參數——producer.type來控制是不是主動flush,如果Kafka寫入到mmap之後就立即flush然後再返回Producer叫同步(sync);寫入mmap之後立即返回Producer不調用flush叫異步(async)。
mmap其實是Linux中的一個函數就是用來實現內存映射的,謝謝Java NIO,它給我提供了一個mappedbytebuffer類可以用來實現內存映射(所以是沾了Java的光才可以如此神速和Scala沒關系!!)

kafka速度為什麽快