为什么kafka性能非常高
使用到零拷貝技術 屬于linux操作系統內核自帶;
順序讀寫
分區模型架構
生產者投遞消息 批量投遞模型
消息壓縮
詳細談到解讀:
生產者
生產者先將消息投遞給緩沖區 (Map集合 key=topic名稱 value list集合(
N條本地緩存消息))
(在投遞消息之前會將該消息實現壓縮,壓縮在發送給kafka服務器端)----目的是可以
減少服務器帶寬的資源
單獨寫一個send線程 定時或者實時批量形式獲取緩沖區消息發送給kafka服務器端。
批量的形式發送消息 好處:減少客戶端與服務器的通訊次數。
服務器:
Mq需要將該消息持久化到硬盤
kafka 屬于日志存儲系統實際將消息直接追加在segment 后面,將一個大的日志文件
拆分成n多個小不同segment 文件,在訪問的時候就可以提高效率
設計原理:segment 分段設計+稀疏索引算法(查找)
不會對每個msg建立索引。
-----1.mq kafka 需要訪問到硬盤 如何提高效率 順序寫
Mq kafka 存放消息 msg,直接追加在log
硬盤:順序寫和隨機寫
順序寫 300MB-600MB/s左右、6G mb/s 主要應用于在對大文件實現訪問、
隨機寫的 100kb/s 殺毒
-----2. kafka 需要將該消息發送給消費者 零拷貝 減少用戶態與內核態切換次數和需要cpu拷貝數據,直接零拷貝。
設計到零拷貝和順序寫原理
零拷貝 傳統io讀寫性能非常差
在linux內核中 開辟兩塊空間
用戶空間—用戶態
內核空間–內核態
用戶態到內核態切換
內核態到用戶態切換
Cpu拷貝 和dma拷貝
零拷貝:
技術方案能夠實現減少cpu拷貝次數或者不需要我們cpu拷貝
A. 使用dma技術拷貝硬盤數據到內核空間,可以減少一次cpu拷貝次數。
如何減少用戶態到內核態切換過程
1.消費者根據offset 獲取kafka中的消息
Kafka 服務器 根據offset值讀取本地文件消息
底層原理:
用戶態(kafka線程)需要切換到內核態,
使用dma技術將本地消息拷貝內核緩沖區中,
使用cpu將內核緩存區數據拷貝到用戶態(kafka線程)
2次上下文切換、1 cpu拷貝 1次dma拷貝
2.kafka就需要將該消息發送給網卡,網卡在將該數據發送消費者客戶端。
1.用戶空間需要切換到內核空間
2.使用cpu將用戶空間的消息拷貝到內核空間
3.在使用dma技術拷貝網卡
4.內核空間切換到用戶空間
上下文切換 4次。 cpu拷貝兩次,dma兩次。
1.使用到mmap內存映射 用戶與內核空間實現共享虛擬內存,不需要在使用cpu將
內核空間的數據拷貝到用戶空間。
2.使用sendfile 2.4 版本linux 內核 使用dma技術將硬盤的數據拷貝到內核態,在使用dma技術將內核態數據拷貝到網卡。
3. 最終只需要做兩次上下文切換 兩次dma數據拷貝(直接內存) 不需要cpu拷貝數據
從而減少上下文切換提高cpu的利用率。
Linux內核中已經實現好了。
mmap內存映射 +sendfile 實現
總結
以上是生活随笔為你收集整理的为什么kafka性能非常高的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kafka基本的概念
- 下一篇: Kafka使用场景