Kafka 零拷貝(Zero-Copy)技術詳解

文章目錄

    • 1. 什么是零拷貝
    • 2. Kafka 如何實現零拷貝
      • 2.1 sendfile 系統調用
      • 2.2 mmap 內存映射
    • 3. 傳統拷貝 vs 零拷貝
      • 3.1 傳統文件傳輸流程
      • 3.2 零拷貝文件傳輸流程
    • 4. Kafka 零拷貝的具體實現
      • 4.1 消息消費時的零拷貝
      • 4.2 日志段文件的零拷貝
    • 5. 零拷貝帶來的性能優勢
    • 6. 零拷貝的適用場景
    • 7. Kafka 零拷貝的局限性
    • 8. 性能對比數據
    • kafka 的零拷貝原理

1. 什么是零拷貝

零拷貝(Zero-Copy)是一種高效的數據傳輸技術,它允許數據在不需要CPU參與拷貝的情況下,直接從存儲設備傳輸到網絡接口卡(NIC)。在傳統的數據傳輸過程中,數據需要在用戶空間和內核空間之間多次拷貝,而零拷貝技術可以顯著減少這些不必要的拷貝操作。

2. Kafka 如何實現零拷貝

Kafka 主要通過以下兩種機制實現零拷貝:

2.1 sendfile 系統調用

Kafka 使用 Linux 的 sendfile() 系統調用實現零拷貝:

#include <sys/sendfile.h>ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

工作流程:

  1. 磁盤文件通過 DMA 拷貝到內核緩沖區(Page Cache)
  2. 內核緩沖區直接通過 DMA 拷貝到網卡緩沖區
  3. 整個過程完全在內核空間完成,避免了用戶空間和內核空間之間的數據拷貝

2.2 mmap 內存映射

Kafka 日志文件的索引(.index 和 .timeindex 文件)使用內存映射(mmap)技術:

// Kafka 中 mmap 的實現
this.index = new MappedByteBuffer(indexFile.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, indexFile.length())
);

3. 傳統拷貝 vs 零拷貝

3.1 傳統文件傳輸流程

1. 磁盤 -> 內核緩沖區 (DMA 拷貝)
2. 內核緩沖區 -> 用戶緩沖區 (CPU 拷貝)
3. 用戶緩沖區 -> socket 緩沖區 (CPU 拷貝)
4. socket 緩沖區 -> 網卡 (DMA 拷貝)

共涉及:4 次上下文切換 + 2 次 CPU 拷貝 + 2 次 DMA 拷貝

3.2 零拷貝文件傳輸流程

1. 磁盤 -> 內核緩沖區 (DMA 拷貝)
2. 內核緩沖區 -> 網卡 (DMA 拷貝)

共涉及:2 次上下文切換 + 0 次 CPU 拷貝 + 2 次 DMA 拷貝

4. Kafka 零拷貝的具體實現

4.1 消息消費時的零拷貝

Kafka 消費者獲取消息時,Broker 使用 FileChannel.transferTo() 方法(底層調用 sendfile):

// Kafka 中的實現
public long transferFrom(FileChannel fileChannel, long position, long count) throws IOException {return fileChannel.transferTo(position, count, socketChannel);
}

4.2 日志段文件的零拷貝

Kafka 的日志段(LogSegment)使用 FileChannelMappedByteBuffer

// Kafka LogSegment 部分源碼
val logFile = new File(dir, filename + LogFileSuffix)
val channel = new RandomAccessFile(logFile, "rw").getChannel()
val mappedByteBuffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, maxSegmentSize)

5. 零拷貝帶來的性能優勢

  1. 減少 CPU 使用率:避免了不必要的 CPU 拷貝操作
  2. 減少內存帶寬占用:數據不需要在用戶空間和內核空間之間來回拷貝
  3. 提高吞吐量:減少了數據傳輸路徑上的延遲
  4. 降低上下文切換:減少了用戶態和內核態之間的切換次數

6. 零拷貝的適用場景

  1. 大文件傳輸
  2. 高吞吐量的消息系統(如 Kafka)
  3. 靜態內容服務器(如 Nginx)
  4. 視頻流媒體服務

7. Kafka 零拷貝的局限性

  1. 不適合小文件:零拷貝的優勢在大文件傳輸時更明顯
  2. 需要操作系統支持:依賴于 Linux 的 sendfile 和 mmap
  3. 內存映射的缺陷:mmap 可能導致內存占用過高
  4. 不能修改數據:零拷貝通常是只讀操作

8. 性能對比數據

指標傳統拷貝零拷貝提升幅度
CPU 使用率50-70%
吞吐量2-3 倍
內存占用30-50%
延遲30-40%

Kafka 通過零拷貝技術實現了極高的吞吐量(可達百萬級 QPS),這也是 Kafka 能夠成為高性能消息系統的關鍵設計之一。

kafka 的零拷貝原理

零拷貝是一種減少數據拷貝的機制,能夠有效提升數據的效率
它的原理是:將磁盤文件映射到內存,用戶通過修改內存就能修改磁盤文件。使用這種方式可以獲取很大的 I/O 提升,省去了用戶空間到內核空間復制的開銷。

零拷貝指計算機執行 IO 操作時,CPU 不需要將數據從一個存儲區域復制到另一個存儲區域,從而可以減少上下文切換以及 CPU 拷貝時間。一種I/O 操作優化技術。
傳統的IO編寫的,它的執行過程大致是這樣的:
1、從磁盤中讀取目標文件內容拷貝到內核緩沖區
2、CPU控制器再把內核緩沖區的數據賦值到用戶空間的緩沖區中
3、接著在應用程序中,調用write()方法,把用戶空間緩沖區中的數據拷貝到內核下的Socket Buffer中。
4、最后,把在內核模式下的SocketBuffer中的數據賦值到網卡緩沖區(NIC Buffer)
5、網卡緩沖區再把數據傳輸到目標服務器上。
在這個過程中我們可以發現,數據從磁盤到最終發送出去,要經歷4次拷貝,而在這四次拷貝過
程中,有兩次拷貝是浪費的,分別是:
1、從內核空間賦值到用戶空間
2、從用戶空間再次復制到內核空間
除此之外,由于用戶空間和內核空間的切換會帶來CPU的上線文切換,對于CPU性能也會造成性能影響。
而零拷貝,就是把這兩次多于的拷貝省略掉,應用程序可以直接把磁盤中的數據從內核中直接傳輸給Socket,而不需要再經過應用程序所在的用戶空間

零拷貝通過DMA(Direct Memory Access)技術把文件內容復制到內核空間中的Read Buffer,
接著把包含數據位置和長度信息的文件描述符加載到Socket Buffer中,DMA引擎直接可以把
數據從內核空間中傳遞給網卡設備。在這個流程中,數據只經歷了兩次拷貝就發送到了網卡中,并且減少了2次cpu的上下文切換,對于效率有非常大的提高。
在程序中實現零拷貝的方式有三種:
1、在Linux中,零拷貝技術依賴于底層的sendfile()方法實現
2、在Java中,FileChannal.transferTo() 方法的底層調用的就是 sendfile() 方法。
3、MMAP 文件映射機制。它的原理是,將磁盤文件映射到內存, 用戶通過修改內存就能修改磁盤文件。使
用這種方式可以獲取很大的I/O提升,省去了用戶空間到內核空間復制的開銷。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93580.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93580.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93580.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue 中 v-for 的使用及 Vue2 與 Vue3 的區別

v-for 基本用法v-for 是 Vue 中用于循環渲染列表的指令&#xff0c;基本語法如下&#xff1a;運行<!-- Vue2 和 Vue3 通用基本語法 --> <div v-for"(item, index) in items" :key"item.id">{{ index }} - {{ item.name }} </div>Vue2 和…

本地搭建dify+deepseek智能體

今天開始搭建智能體&#xff0c;學習一下&#xff0c;也是公司轉型所需。(Windows下的docker安裝給我差點干破防了&#xff0c;安裝了一周docker才成功。我真就要放棄的時候&#xff0c;又意外成功了/(ㄒoㄒ)/~~)0、準備階段 配置Windows10的基本配置。 按下鍵盤Windows鍵&…

網絡常識-SSE對比Websocket

SSE&#xff08;Server-Sent Events&#xff09;和Websocket都是用于實現服務器與客戶端實時通信的技術&#xff0c;但它們的設計理念、通信模式和適用場景有顯著區別。以下從核心差異和適用場景兩方面具體說明&#xff1a; 一、核心區別維度SSE&#xff08;Server-Sent Events…

lamp架構部署wordpress

CentOS 7主機&#xff1a;lamp.example.comIP&#xff1a;192.168.100.101、關閉防火墻與selinux# 關閉防火墻systemctl stop firewalldsystemctl disable firewalld# 關閉selinuxvim /etc/selinux/config # 或vim /etc/sysconfig/selinuxSELINUXdisabled:wq# 重啟reboot 2、開…

DC6v-36V轉3.2V1A恒流驅動芯片WT7017

DC6v-36V轉3.2V1A恒流驅動芯片WT7017WT7017是一款于連續工作模式下的降壓LED恒流轉換器&#xff0c;可驅動單只或多只LED,內置高精度電流檢測器&#xff0c;能通過外置電阻設定輸出電流,開關式1A恒流芯片。軟啟動、高達1MHZ開關頻率,開路保護,輸入范圍在6V-40VDC內都能穩定可靠…

js如何循環HTMLCollection

場景 當使用document.getElementsByClassName方法獲取一個包含DOM節點的集合arr時&#xff0c;正常的forEach和map操作都會報一個arr.map is not a function的錯誤因為這里的arr并不是標準的 數組 (Array)&#xff0c;而是一個 HTMLCollection 解決 使用document.querySelector…

Dart 逆襲之路:Flutter 4.0 如何推動移動端開發變革?

本文深入探討 Dart 語言在 Flutter 4.0 框架下如何推動移動端開發變革。開篇回顧 Dart 誕生背景與初期困境&#xff0c;闡述其在與 Flutter 結合后嶄露頭角。進而詳細剖析 Flutter 4.0&#xff0c;從全新渲染引擎帶來的性能飛躍、豐富實用新組件簡化開發&#xff0c;到手勢系統…

基于MATLAB的卷積神經網絡手寫數字識別

一、系統架構設計 #mermaid-svg-QQU8judlmQgHc2Lh {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QQU8judlmQgHc2Lh .error-icon{fill:#552222;}#mermaid-svg-QQU8judlmQgHc2Lh .error-text{fill:#552222;stroke:#5…

從廢棄到珍寶——舊物二手回收小程序系統的價值發現之旅

在我們的生活中&#xff0c;總有一些舊物因為各種原因而被遺棄在角落&#xff0c;它們或許不再新潮&#xff0c;或許不再實用&#xff0c;但它們卻承載著我們的記憶和情感。舊物二手回收小程序系統的出現&#xff0c;讓這些被遺忘的舊物重新煥發了生機&#xff0c;開啟了一段從…

從0開始學習Java+AI知識點總結-16.web基礎知識

一、SpringBoot Web 入門開發SpringBoot 簡化了傳統 Spring 應用的配置流程&#xff0c;通過 "約定大于配置" 的理念實現快速開發。以下是入門核心要點&#xff1a;1. 工程創建與依賴配置工程初始化&#xff1a;通過 Spring Initializr 創建工程&#xff0c;選擇Spri…

代碼隨想錄Day51:圖論(島嶼數量 深搜廣搜、島嶼的最大面積)

一、實戰 99島嶼數量 深搜 99. 島嶼數量 本題中每座島嶼只能由水平方向和/或豎直方向上相鄰的陸地連接形成&#xff0c;也就是說斜角度鏈接是不算的。思路是用遇到一個沒有遍歷過的節點陸地&#xff0c;計數器就加一&#xff0c;然后把該節點陸地所能遍歷到的陸地都標記上。在…

讀取數據excel

import pandas as pd from datetime import datetimedef generate_questions():excel_path df pd.read_excel(excel_path)theme []time_list []tag1 []tag2 []tag3 []word_count 800questions []for index, row in df.iterrows():if isinstance(row[時間], datetime):…

前端環境安裝

1.vsCode 下載鏈接&#xff1a;Visual Studio Code - Code Editing. Redefined 添加一個wiz code擴展&#xff08;提示你需要升級的依賴&#xff09; wiz code 使用方法 效果 2.git 下載鏈接&#xff1a;Git - Downloads 先下載 Homebrew&#xff08;https://brew.sh/ &a…

零基礎學Java第十八講---抽象類和接口(3)

續接上一講 目錄 一、內部類 1、內部類的分類 2、靜態內部類 3、實例內部類---未被static修飾的成員內部類 4、局部內部類 5、匿名內部類 二、Object類 1、獲取對象信息 2、equals方法 3、hashcode方法 一、內部類 當?個事物的內部&#xff0c;還有?個部分需要?個…

字節數據流

記錄 干貨&#xff5c;8000字長文&#xff0c;深度介紹Flink在字節跳動數據流的實踐 字節跳動基于Flink的MQ-Hive實時數據集成

Vision Master的C#腳本與opencv聯合編程

需要在VM的C#腳本設置string類型Out變量和float類型OutF變量&#xff0c;python的輸出信息會在Out變量顯示 using System; using System.IO; using Script.Methods; using System.Diagnostics; using System.Net.Sockets; using System.Text; using System.Threading;public pa…

運維工作架構流程搭建

前言 在解決了運維是干什么的&#xff0c;運維的工作的意義后&#xff0c;這一章我們系統性的講講運維工作流程搭建&#xff0c;希望大家能通過我的分享有所收獲&#xff0c;這一章干貨滿滿。 一、網絡服務器架構 按照一般的訪問方式&#xff0c;按照我自己的理解畫了一個網絡服…

安全存儲之 SAES+HUK 使用技巧和常見問題 LAT1543

關鍵字&#xff1a;AES&#xff0c;SAES, HUK, DHUK, 安全存儲 引言 近年來&#xff0c;嵌入式設備信息安全被越來越多地提及&#xff0c;從智能穿戴產品、智能工業設備到物聯網產品都對設備信息安全提出了要求&#xff0c;比如基礎的安全啟動&#xff0c;安全升級&#xff0…

ubuntu 20.04 搭建多用戶遠程桌面共享及同時在線使用

使用效果: 物理機: 遠程桌面用戶: 實現過程: 1.使用腳本安裝xrdp并修改配置及啟動服務 setup_xrdp.sh sudo apt update sudo apt install xrdp -ysudo systemctl enable xrdp sudo systemctl start xrdp#sudo vim /etc/xrdp/startwm.sh #unset DBUS_SESSION_BUS_ADDRES…

[激光原理與應用-287]:理論 - 波動光學 - 電磁波既能承載能量,又能承載信息?

電磁波既能承載能量&#xff0c;又能承載信息&#xff0c;這一特性源于其物理本質和調制技術的結合。以下從能量承載和信息承載兩方面進行詳細解析&#xff1a;一、電磁波如何承載能量&#xff1f;電磁波的能量承載源于其電場和磁場的周期性振蕩&#xff0c;具體機制如下&#…