Kafka的特性之一就是高吞吐率,但是Kafka的消息是保存或緩存在磁盤上的,一般認為在磁盤上讀寫數據是會降低性能的,但是Kafka即使是普通的服務器,
Kafka也可以輕松支持每秒百萬級的寫入請求,超過了大部分的消息中間件,這種特性也使得Kafka在日志處理等海量數據場景廣泛應用。
Kafka會把收到的消息都寫入到硬盤中,防止丟失數據。為了優化寫入速度Kafka采用了兩個技術順序寫入和MMFile 。 因為硬盤是機械結構,每次讀寫都會尋址->寫入,其中尋址是一個“機械動作”,它是最耗時的。所以硬盤最討厭隨機I/O,最喜歡順序I/O。
為了提高讀寫硬盤的速度,Kafka就是使用順序I/O。這樣省去了大量的內存開銷以及節省了IO尋址的時間。但是單純的使用順序寫入,Kafka的寫入性能也不可能和內存進行對比,
因此Kafka的數據並不是實時的寫入硬盤中 。 Kafka充分利用了現代操作系統分頁存儲來利用內存提高I/O效率。Memory Mapped Files(后面簡稱mmap)也稱為內存映射文件,
在64位操作系統中一般可以表示20G的數據文件,它的工作原理是直接利用操作系統的Page實現文件到物理內存的直接映射。完成MMP映射后,
用戶對內存的所有操作會被操作系統自動的刷新到磁盤上,極大地降低了IO使用率。

Kafka服務器在響應客戶端讀取的時候,底層使用ZeroCopy技術,直接將磁盤無需拷貝到用戶空間,而是直接將數據通過內核空間傳遞輸出,數據並沒有抵達用戶空間。 傳統IO操作 - 1.用戶進程調用read等系統調用向操作系統發出IO請求,請求讀取數據到自己的內存緩沖區中。自己進入阻塞狀態。 - 2.操作系統收到請求后,進一步將IO請求發送磁盤。 - 3.磁盤驅動器收到內核的IO請求,把數據從磁盤讀取到驅動器的緩沖中。此時不占用CPU。當驅動器的緩沖區被讀滿后,向內核發起中斷信號告知自己緩沖區已滿。 - 4.內核收到中斷,使用CPU時間將磁盤驅動器的緩存中的數據拷貝到內核緩沖區中。 - 5.如果內核緩沖區的數據少於用戶申請的讀的數據,重復步驟3跟步驟4,直到內核緩沖區的數據足夠多為止。 - 6.將數據從內核緩沖區拷貝到用戶緩沖區,同時從系統調用中返回。完成任務
DMA讀取 - 1.用戶進程調用read等系統調用向操作系統發出IO請求,請求讀取數據到自己的內存緩沖區中。自己進入阻塞狀態。 - 2.操作系統收到請求后,進一步將IO請求發送DMA。然后讓CPU干別的活去。 - 3.DMA進一步將IO請求發送給磁盤。 - 4.磁盤驅動器收到DMA的IO請求,把數據從磁盤讀取到驅動器的緩沖中。當驅動器的緩沖區被讀滿后,向DMA發起中斷信號告知自己緩沖區已滿。 - 4.DMA收到磁盤驅動器的信號,將磁盤驅動器的緩存中的數據拷貝到內核緩沖區中。此時不占用CPU。這個時候只要內核緩沖區的數據少於用戶申請的讀的數據,
內核就會一直重復步驟3跟步驟4,直到內核緩沖區的數據足夠多為止。 - 5.當DMA讀取了足夠多的數據,就會發送中斷信號給CPU。 - 6.CPU收到DMA的信號,知道數據已經准備好,於是將數據從內核拷貝到用戶空間,系統調用返回。 > 跟IO中斷模式相比,DMA模式下,DMA就是CPU的一個代理,它負責了一部分的拷貝工作,從而減輕了CPU的負擔。DMA的優點就是:中斷少,CPU負擔低。
一般方案 1、文件在磁盤中數據被copy到內核緩沖區 2、從內核緩沖區copy到用戶緩沖區 3、用戶緩沖區copy到內核與socket相關的緩沖區。 4、數據從socket緩沖區copy到相關協議引擎發送出去 Zero拷貝 1、文件在磁盤中數據被copy到內核緩沖區 2、從內核緩沖區copy到內核與socket相關的緩沖區。 3、數據從socket緩沖區copy到相關協議引擎發送出去
0拷貝