色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

深入理解Linux系統零拷貝技術

Linux愛好者 ? 來源:博客 ? 作者:Spongecaptain ? 2021-09-01 15:12 ? 次閱讀

內存拷貝是比較耗時操作,零拷貝是常用優化手段,今天分享的文章就是Linux系統零拷貝技術,Kafka和MySQL開源組件都用到這個核心技術,希望大家可以掌握。

DMA 與零拷貝技術

注意事項:除了 Direct I/O,與磁盤相關的文件讀寫操作都有使用到 page cache 技術。

1. 數據的四次拷貝與四次上下文切換

很多應用程序在面臨客戶端請求時,可以等價為進行如下的系統調用:

File.read(file, buf, len);

Socket.send(socket, buf, len);

例如消息中間件 Kafka 就是這個應用場景,從磁盤中讀取一批消息后原封不動地寫入網卡(NIC,Network interface controller)進行發送。

在沒有任何優化技術使用的背景下,操作系統為此會進行 4 次數據拷貝,以及 4 次上下文切換,如下圖所示:

如果沒有優化,讀取磁盤數據,再通過網卡傳輸的場景性能比較差:

4 次 copy:

CPU 負責將數據從磁盤搬運到內核空間的 Page Cache 中;

CPU 負責將數據從內核空間的 Socket 緩沖區搬運到的網絡中;

CPU 負責將數據從內核空間的 Page Cache 搬運到用戶空間的緩沖區;

CPU 負責將數據從用戶空間的緩沖區搬運到內核空間的 Socket 緩沖區中;

4 次上下文切換:

read 系統調用時:用戶態切換到內核態;

read 系統調用完畢:內核態切換回用戶態;

write 系統調用時:用戶態切換到內核態;

write 系統調用完畢:內核態切換回用戶態;

我們不免發出抱怨:

CPU 全程負責內存內的數據拷貝還可以接受,因為效率還算可以接受,但是如果要全程負責內存與磁盤、網絡的數據拷貝,這將難以接受,因為磁盤、網卡的速度遠小于內存,內存又遠遠小于 CPU;

4 次 copy 太多了,4 次上下文切換也太頻繁了;

2. DMA 參與下的數據四次拷貝

DMA 技術很容易理解,本質上,DMA 技術就是我們在主板上放一塊獨立的芯片。在進行內存和 I/O 設備的數據傳輸的時候,我們不再通過 CPU 來控制數據傳輸,而直接通過 DMA 控制器(DMA Controller,簡稱 DMAC)。這塊芯片,我們可以認為它其實就是一個協處理器(Co-Processor)。

DMAC 最有價值的地方體現在,當我們要傳輸的數據特別大、速度特別快,或者傳輸的數據特別小、速度特別慢的時候。

比如說,我們用千兆網卡或者硬盤傳輸大量數據的時候,如果都用 CPU 來搬運的話,肯定忙不過來,所以可以選擇 DMAC。而當數據傳輸很慢的時候,DMAC 可以等數據到齊了,再發送信號,給到 CPU 去處理,而不是讓 CPU 在那里忙等待。

注意,這里面的“協”字。DMAC 是在“協助”CPU,完成對應的數據傳輸工作。在 DMAC 控制數據傳輸的過程中,我們還是需要 CPU 的進行控制,但是具體數據的拷貝不再由 CPU 來完成。

原本,計算機所有組件之間的數據拷貝(流動)必須經過 CPU,如下圖所示:

現在,DMA 代替了 CPU 負責內存與磁盤以及內存與網卡之間的數據搬運,CPU 作為 DMA 的控制者,如下圖所示:

但是 DMA 有其局限性,DMA 僅僅能用于設備之間交換數據時進行數據拷貝,但是設備內部的數據拷貝還需要 CPU 進行,例如 CPU 需要負責內核空間數據與用戶空間數據之間的拷貝(內存內部的拷貝),如下圖所示:

read buffer 也就是 page cache,socket buffer 也就是 Socket 緩沖區。

3. 零拷貝技術

3.1 什么是零拷貝技術?

零拷貝技術是一個思想[3],指的是指計算機執行操作時,CPU 不需要先將數據從某處內存復制到另一個特定區域。

可見,零拷貝的特點是 CPU 不全程負責內存中的數據寫入其他組件,CPU 僅僅起到管理的作用。但注意,零拷貝不是不進行拷貝,而是 CPU 不再全程負責數據拷貝時的搬運工作。如果數據本身不在內存中,那么必須先通過某種方式拷貝到內存中(這個過程 CPU 可以不參與),因為數據只有在內存中,才能被轉移,才能被 CPU 直接讀取計算。

零拷貝技術的具體實現方式有很多,例如:

sendfile

mmap

splice

直接 Direct I/O

不同的零拷貝技術適用于不同的應用場景,下面依次進行 sendfile、mmap、Direct I/O 的分析。

不過出于總結性的目的,我們在這里先對下面的技術做一個前瞻性的總結。

DMA 技術回顧:DMA 負責內存與其他組件之間的數據拷貝,CPU 僅需負責管理,而無需負責全程的數據拷貝;

使用 page cache 的 zero copy:

sendfile:一次代替 read/write 系統調用,通過使用 DMA 技術以及傳遞文件描述符,實現了 zero copy

mmap:僅代替 read 系統調用,將內核空間地址映射為用戶空間地址,write 操作直接作用于內核空間。通過 DMA 技術以及地址映射技術,用戶空間與內核空間無須數據拷貝,實現了 zero copy

不使用 page cache 的 Direct I/O:讀寫操作直接在磁盤上進行,不使用 page cache 機制,通常結合用戶空間的用戶緩存使用。通過 DMA 技術直接與磁盤/網卡進行數據交互,實現了 zero copy

3.2 sendfile

snedfile 的應用場景是:用戶從磁盤讀取一些文件數據后不需要經過任何計算與處理就通過網絡傳輸出去。此場景的典型應用是消息隊列。

在傳統 I/O 下,正如第一節所示,上述應用場景的一次數據傳輸需要四次 CPU 全權負責的拷貝與四次上下文切換,正如本文第一節所述。

sendfile 主要使用到了兩個技術:

DMA 技術;

傳遞文件描述符代替數據拷貝;

下面依次講解這兩個技術的作用。

1.利用 DMA 技術

sendfile 依賴于 DMA 技術,將四次 CPU 全程負責的拷貝與四次上下文切換減少到兩次,如下圖所示:

DMA 負責磁盤到內核空間中的 Page cache(read buffer)的數據拷貝以及從內核空間中的 socket buffer 到網卡的數據拷貝。

2.傳遞文件描述符代替數據拷貝

傳遞文件描述可以代替數據拷貝,這是由于兩個原因:

page cache 以及 socket buffer 都在內核空間中;

數據傳輸過程前后沒有任何寫操作;

注意事項:只有網卡支持 SG-DMA(The Scatter-Gather Direct Memory Access)技術才可以通過傳遞文件描述符的方式避免內核空間內的一次 CPU 拷貝。這意味著此優化取決于 Linux 系統的物理網卡是否支持(Linux 在內核 2.4 版本里引入了 DMA 的 scatter/gather – 分散/收集功能,只要確保 Linux 版本高于 2.4 即可)。

3.一次系統調用代替兩次系統調用

由于 sendfile 僅僅對應一次系統調用,而傳統文件操作則需要使用 read 以及 write 兩個系統調用。

正因為如此,sendfile 能夠將用戶態與內核態之間的上下文切換從 4 次講到 2 次。

另一方面,我們需要注意 sendfile 系統調用的局限性。如果應用程序需要對從磁盤讀取的數據進行寫操作,例如解密或加密,那么 sendfile 系統調用就完全沒法用。這是因為用戶線程根本就不能夠通過 sendfile 系統調用得到傳輸的數據。

3.3 mmap

mmap 技術在[4] 中單獨展開,請移步閱讀。

3.4 Direct I/O

Direct I/O 即直接 I/O。其名字中的”直接”二字用于區分使用 page cache 機制的緩存 I/O。

緩存文件 I/O:用戶空間要讀寫一個文件并不直接與磁盤交互,而是中間夾了一層緩存,即 page cache;

直接文件 I/O:用戶空間讀取的文件直接與磁盤交互,沒有中間 page cache 層;

“直接”在這里還有另一層語義:其他所有技術中,數據至少需要在內核空間存儲一份,但是在 Direct I/O 技術中,數據直接存儲在用戶空間中,繞過了內核。

此時用戶空間直接通過 DMA 的方式與磁盤以及網卡進行數據拷貝。

Direct I/O 的讀寫非常有特點:

Write 操作:由于其不使用 page cache,所以其進行寫文件,如果返回成功,數據就真的落盤了(不考慮磁盤自帶的緩存);

Read 操作:由于其不使用 page cache,每次讀操作是真的從磁盤中讀取,不會從文件系統的緩存中讀取。

事實上,即使 Direct I/O 還是可能需要使用操作系統的 fsync 系統調用。為什么?

這是因為雖然文件的數據本身沒有使用任何緩存,但是文件的元數據仍然需要緩存,包括 VFS 中的 inode cache 和 dentry cache 等。

在部分操作系統中,在 Direct I/O 模式下進行 write 系統調用能夠確保文件數據落盤,但是文件元數據不一定落盤。如果在此類操作系統上,那么還需要執行一次 fsync 系統調用確保文件元數據也落盤。否則,可能會導致文件異常、元數據確實等情況。MySQL 的 O_DIRECT 與 O_DIRECT_NO_FSYNC 配置是一個具體案例[9]。

Direct I/O 的優缺點:

(1)優點

Linux 中的直接 I/O 技術省略掉緩存 I/O 技術中操作系統內核緩沖區的使用,數據直接在應用程序地址空間和磁盤之間進行傳輸,從而使得自緩存應用程序可以省略掉復雜的系統級別的緩存結構,而執行程序自己定義的數據讀寫管理,從而降低系統級別的管理對應用程序訪問數據的影響。

與其他零拷貝技術一樣,避免了內核空間到用戶空間的數據拷貝,如果要傳輸的數據量很大,使用直接 I/O 的方式進行數據傳輸,而不需要操作系統內核地址空間拷貝數據操作的參與,這將會大大提高性能。

(2)缺點

由于設備之間的數據傳輸是通過 DMA 完成的,因此用戶空間的數據緩沖區內存頁必須進行 page pinning(頁鎖定),這是為了防止其物理頁框地址被交換到磁盤或者被移動到新的地址而導致 DMA 去拷貝數據的時候在指定的地址找不到內存頁從而引發缺頁錯誤,而頁鎖定的開銷并不比 CPU 拷貝小,所以為了避免頻繁的頁鎖定系統調用,應用程序必須分配和注冊一個持久的內存池,用于數據緩沖。

如果訪問的數據不在應用程序緩存中,那么每次數據都會直接從磁盤進行加載,這種直接加載會非常緩慢。

在應用層引入直接 I/O 需要應用層自己管理,這帶來了額外的系統復雜性;

誰會使用 Direct I/O?

IBM[5]的一篇文章指出,自緩存應用程序( self-caching applications)可以選擇使用 Direct I/O。

自緩存應用程序

對于某些應用程序來說,它會有它自己的數據緩存機制,比如,它會將數據緩存在應用程序地址空間,這類應用程序完全不需要使用操作系統內核中的高速緩沖存儲器,這類應用程序就被稱作是自緩存應用程序( self-caching applications )。

例如,應用內部維護一個緩存空間,當有讀操作時,首先讀取應用層的緩存數據,如果沒有,那么就通過 Direct I/O 直接通過磁盤 I/O 來讀取數據。緩存仍然在應用,只不過應用覺得自己實現一個緩存比操作系統的緩存更高效。

數據庫管理系統是這類應用程序的一個代表。自緩存應用程序傾向于使用數據的邏輯表達方式,而非物理表達方式;當系統內存較低的時候,自緩存應用程序會讓這種數據的邏輯緩存被換出,而并非是磁盤上實際的數據被換出。自緩存應用程序對要操作的數據的語義了如指掌,所以它可以采用更加高效的緩存替換算法。自緩存應用程序有可能會在多臺主機之間共享一塊內存,那么自緩存應用程序就需要提供一種能夠有效地將用戶地址空間的緩存數據置為無效的機制,從而確保應用程序地址空間緩存數據的一致性。

另一方面,目前 Linux 上的異步 IO 庫,其依賴于文件使用 O_DIRECT 模式打開,它們通常一起配合使用。

如何使用 Direct I/O?

用戶應用需要實現用戶空間內的緩存區,讀/寫操作應當盡量通過此緩存區提供。如果有性能上的考慮,那么盡量避免頻繁地基于 Direct I/O 進行讀/寫操作。

4. 典型案例

4.1 Kakfa

Kafka 作為一個消息隊列,涉及到磁盤 I/O 主要有兩個操作:

Provider 向 Kakfa 發送消息,Kakfa 負責將消息以日志的方式持久化落盤;

Consumer 向 Kakfa 進行拉取消息,Kafka 負責從磁盤中讀取一批日志消息,然后再通過網卡發送;

Kakfa 服務端接收 Provider 的消息并持久化的場景下使用 mmap 機制[6],能夠基于順序磁盤 I/O 提供高效的持久化能力,使用的 Java 類為 java.nio.MappedByteBuffer。

Kakfa 服務端向 Consumer 發送消息的場景下使用 sendfile 機制[7],這種機制主要兩個好處:

sendfile 避免了內核空間到用戶空間的 CPU 全程負責的數據移動;

sendfile 基于 Page Cache 實現,因此如果有多個 Consumer 在同時消費一個主題的消息,那么由于消息一直在 page cache 中進行了緩存,因此只需一次磁盤 I/O,就可以服務于多個 Consumer;

使用 mmap 來對接收到的數據進行持久化,使用 sendfile 從持久化介質中讀取數據然后對外發送是一對常用的組合。但是注意,你無法利用 sendfile 來持久化數據,利用 mmap 來實現 CPU 全程不參與數據搬運的數據拷貝。

4.2 MySQL

MySQL 的具體實現比 Kakfa 復雜很多,這是因為支持 SQL 查詢的數據庫本身比消息隊列對復雜很多。

MySQL 的零拷貝技術使用方式請移步我的另一篇文章[8]。

5. 總結

DMA 技術的推出使得內存與其他組件,例如磁盤、網卡進行數據拷貝時,CPU 僅僅需要發出控制信號,而拷貝數據的過程則由 DMA 負責完成。

Linux 的零拷貝技術有多種實現策略,但根據策略可以分為如下幾種類型:

減少甚至避免用戶空間和內核空間之間的數據拷貝:在一些場景下,用戶進程在數據傳輸過程中并不需要對數據進行訪問和處理,那么數據在 Linux 的 Page Cache 和用戶進程的緩沖區之間的傳輸就完全可以避免,讓數據拷貝完全在內核里進行,甚至可以通過更巧妙的方式避免在內核里的數據拷貝。這一類實現一般是是通過增加新的系統調用來完成的,比如 Linux 中的 mmap(),sendfile() 以及 splice() 等。

繞過內核的直接 I/O:允許在用戶態進程繞過內核直接和硬件進行數據傳輸,內核在傳輸過程中只負責一些管理和輔助的工作。這種方式其實和第一種有點類似,也是試圖避免用戶空間和內核空間之間的數據傳輸,只是第一種方式是把數據傳輸過程放在內核態完成,而這種方式則是直接繞過內核和硬件通信,效果類似但原理完全不同。

內核緩沖區和用戶緩沖區之間的傳輸優化:這種方式側重于在用戶進程的緩沖區和操作系統的頁緩存之間的 CPU 拷貝的優化。這種方法延續了以往那種傳統的通信方式,但更靈活。

作者:Spongecaptain

原文:https://spongecaptain.cool/SimpleClearFileIO/

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10878

    瀏覽量

    212167
  • Linux系統
    +關注

    關注

    4

    文章

    594

    瀏覽量

    27441
  • dma
    dma
    +關注

    關注

    3

    文章

    565

    瀏覽量

    100665
  • MySQL
    +關注

    關注

    1

    文章

    817

    瀏覽量

    26623
  • 零拷貝技
    +關注

    關注

    0

    文章

    2

    瀏覽量

    5991

原文標題:深入理解零拷貝技術

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    深入探討Linux系統中的動態鏈接庫機制

    異常或崩潰。為深入理解動態鏈接機制及其工作原理,我重溫了《程序員的自我修養》,并通過實踐演示與反匯編分析,了解了動態鏈接的過程。 本文將深入探討Linux系統中的動態鏈接庫機制,這其中
    的頭像 發表于 12-18 10:06 ?132次閱讀
    <b class='flag-5'>深入</b>探討<b class='flag-5'>Linux</b><b class='flag-5'>系統</b>中的動態鏈接庫機制

    深入理解C語言:循環語句的應用與優化技巧

    能讓你的代碼更加簡潔明了,還能顯著提升程序執行效率。本文將詳細介紹C語言中的三種常見循環結構——while循環、for循環和do...while循環,帶你深入理解
    的頭像 發表于 12-07 01:11 ?193次閱讀
    <b class='flag-5'>深入理解</b>C語言:循環語句的應用與優化技巧

    深入理解 Llama 3 的架構設計

    在人工智能領域,對話系統的發展一直是研究的熱點之一。隨著技術的進步,我們見證了從簡單的基于規則的系統到復雜的基于機器學習的模型的轉變。Llama 3,作為一個假設的先進對話系統,其架構
    的頭像 發表于 10-27 14:41 ?576次閱讀

    磁盤拷貝機會拷貝刪除的內容嗎

    磁盤拷貝機,也稱為硬盤克隆器或磁盤復制器,是一種用于復制硬盤驅動器內容的設備。它可以將一個硬盤上的所有數據,包括操作系統、程序、文件和設置,復制到另一個硬盤上。這種設備在數據備份、系統遷移、硬盤
    的頭像 發表于 10-14 15:38 ?504次閱讀

    深入理解FPD-link III ADAS解串器HUB產品

    電子發燒友網站提供《深入理解FPD-link III ADAS解串器HUB產品.pdf》資料免費下載
    發表于 09-06 09:58 ?1次下載
    <b class='flag-5'>深入理解</b>FPD-link III ADAS解串器HUB產品

    錫焊原理解析:深入理解電子產品制造的核心工藝

    探索焊接技術在精密電子工程中的重要性和創新,從基礎元件的連接到現代焊接技術的進展,深入了解焊接材料的選擇與焊接技術的分類。本文提供了對錫焊原理的深入
    的頭像 發表于 08-12 15:03 ?754次閱讀
    錫焊原<b class='flag-5'>理解</b>析:<b class='flag-5'>深入理解</b>電子產品制造的核心工藝

    技術干貨驛站 ▏深入理解C語言:基本數據類型和變量

    在C語言中,數據類型和變量是編程的基礎,也是理解更復雜概念的關鍵。數據類型決定了變量的內存分配、存儲范圍和操作方式,而變量則是存儲數據的容器。本篇文章將從基本數據類型和變量兩個方面,帶你深入了解C
    的頭像 發表于 07-26 17:53 ?2190次閱讀
    <b class='flag-5'>技術</b>干貨驛站 ▏<b class='flag-5'>深入理解</b>C語言:基本數據類型和變量

    深入理解Camera的整體五層架構

    Linux為視頻采集設備制定了標準的V4L2接口,并在內核中實現了其基礎框架V4L2 Core。用戶空間進程可以通過V4L2接口調用相關設備功能,而不用考慮其實現細節。
    的頭像 發表于 04-25 14:41 ?1637次閱讀
    <b class='flag-5'>深入理解</b>Camera的整體五層架構

    深入理解FFmpeg閱讀體驗》FFmpeg攝像頭測試

    、前期工作 上文FFmpeg移植完成后,需要將x264/lib文件夾下的庫文件拷貝到開發板的/lib/目錄下,將ffmpeg_install/lib文件夾下的庫文件全部拷貝到開發板的/lib/目錄
    發表于 04-17 19:06

    深入理解FFmpeg閱讀體驗》

    : ./configure --host=aarch64-linux --prefix=/home/x264 --enable-shared --disable-asm --enable-static
    發表于 04-16 22:54

    深入理解 Sora 的技術原理

    將去除噪音后的結果數據,利用視頻解碼器進行解碼,將低維潛在空間數據還原成原始視頻數據,這里可以實現不同分辨率的視頻解碼。
    的頭像 發表于 04-05 09:19 ?1974次閱讀
    <b class='flag-5'>深入理解</b> Sora 的<b class='flag-5'>技術</b>原理

    深入理解 FPGA 的基礎結構

    轉載地址:https://zhuanlan.zhihu.com/p/506828648 文章很詳細的介紹了FPGA的基礎結構,能更直觀的理解內部結構原理。對深入學習很有幫助。 以下是正文: 這一段
    發表于 04-03 17:39

    深入理解Linux網絡協議

    網絡分層解決了網絡復雜的問題,在網絡中傳輸數據中,我們對不同設備之間的傳輸數據的格式,需要定義一個數據標準,所以就有了網絡協議。
    發表于 04-01 14:20 ?378次閱讀
    <b class='flag-5'>深入理解</b><b class='flag-5'>Linux</b>網絡協議

    恒訊科技帶大家深入理解:WebSocket服務器的工作原理

    WebSocket是一種在單個TCP連接上進行全雙工通信的通信協議。它的設計目標是在Web瀏覽器和服務器之間提供低延遲、高效的雙向通信。下面是深入理解WebSocket服務器工作原理的一些關鍵概念
    的頭像 發表于 01-29 16:48 ?496次閱讀

    深入理解光耦模擬隔離放大電路的技術奧秘

    深入理解光耦模擬隔離放大電路的技術奧秘 ?編輯 ▲ 圖1 仿真原理圖二、原理分析 之所以這個電路圖看起來容易讓人感到困惑,實際上就是這個仿真電路中,錯誤的使用了這樣的光電三極管來表示HCNR201
    發表于 01-10 10:12
    主站蜘蛛池模板: 真人女人无遮挡内谢免费视频%| 九九在线中文字幕无码| 青娱国产区在线| 国产永不无码精品AV永久| 97免费视频在线| 亚洲福利视频导航| 秋霞电影网午夜一级鲁丝片| 久草国产在线播放| 国产精品久久久久成人免费| 99 久久99久久精品免观看| 亚洲欧美国产综合在线一区| 色迷迷电影| 欧美 国产 日产 韩国 在线| 精品国产成人AV在线看| 国产高清在线a视频大全| a级毛片黄免费a级毛片| 正在播放国产精品| 亚洲三级大片| 午夜精品久久久久久影视riav| 亲胸摸下面激烈免费网站| 麻豆久久国产亚洲精品超碰热| 国色天香社区视频免费高清3 | 成人AV精品视频| 69精品人人人人| 伊人国产在线观看| 亚洲国产第一| 午夜dj影院视频观看| 青青青草国产| 欧洲精品不卡1卡2卡三卡四卡| 两个客户一起吃我的奶| 久久精品久久久| 精品人妻伦九区久久AAA片69| 国产亚洲AV精品无码麻豆| 国产GV无码A片在线观看| 成人午夜精品无码区久久漫画日本| 99国产精品白浆在线观看免费| 老司机福利视频一区在线播放| 97午夜精品| 伊人激情综合网| 无限好资源免费观看| 青春草久久|