當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 后端技術(shù)指南針
[導(dǎo)讀]像大白這種調(diào)包俠,深知不懂底層技術(shù)點(diǎn)就如同空中樓閣,再這樣下去面阿里p10是沒(méi)希望了。想到這里,我開始慌了,所以今天和大家一起學(xué)習(xí)個(gè)底層技術(shù)點(diǎn)-零拷貝Zero-Copy。

1.前言

像大白這種調(diào)包俠,深知不懂底層技術(shù)點(diǎn)就如同空中樓閣,再這樣下去面阿里p10是沒(méi)希望了。

想到這里,我開始慌了,所以今天和大家一起學(xué)習(xí)個(gè)底層技術(shù)點(diǎn)-零拷貝Zero-Copy

Linux系統(tǒng)中一切皆文件,仔細(xì)想一下Linux系統(tǒng)的很多活動(dòng)無(wú)外乎讀操作寫操作,零拷貝就是為了提高讀寫性能而出現(xiàn)的。

廢話不多說(shuō),馬上開大車,走起!

2. 數(shù)據(jù)拷貝基礎(chǔ)過(guò)程

在Linux系統(tǒng)內(nèi)部緩存和內(nèi)存容量都是有限的,更多的數(shù)據(jù)都是存儲(chǔ)在磁盤中。對(duì)于Web服務(wù)器來(lái)說(shuō),經(jīng)常需要從磁盤中讀取數(shù)據(jù)到內(nèi)存,然后再通過(guò)網(wǎng)卡傳輸給用戶:

上述數(shù)據(jù)流轉(zhuǎn)只是大框,接下來(lái)看看幾種模式。

2.1 僅CPU方式

  • 當(dāng)應(yīng)用程序需要讀取磁盤數(shù)據(jù)時(shí),調(diào)用read()從用戶態(tài)陷入內(nèi)核態(tài),read()這個(gè)系統(tǒng)調(diào)用最終由CPU來(lái)完成;
  • CPU向磁盤發(fā)起I/O請(qǐng)求,磁盤收到之后開始準(zhǔn)備數(shù)據(jù);
  • 磁盤將數(shù)據(jù)放到磁盤緩沖區(qū)之后,向CPU發(fā)起I/O中斷,報(bào)告CPU數(shù)據(jù)已經(jīng)Ready了;
  • CPU收到磁盤控制器的I/O中斷之后,開始拷貝數(shù)據(jù),完成之后read()返回,再?gòu)膬?nèi)核態(tài)切換到用戶態(tài);

2.2 CPU&DMA方式

CPU的時(shí)間寶貴,讓它做雜活就是浪費(fèi)資源。

直接內(nèi)存訪問(wèn)(Direct Memory Access),是一種硬件設(shè)備繞開CPU獨(dú)立直接訪問(wèn)內(nèi)存的機(jī)制。所以DMA在一定程度上解放了CPU,把之前CPU的雜活讓硬件直接自己做了,提高了CPU效率。

目前支持DMA的硬件包括:網(wǎng)卡、聲卡、顯卡、磁盤控制器等。

有了DMA的參與之后的流程發(fā)生了一些變化:

最主要的變化是,CPU不再和磁盤直接交互,而是DMA和磁盤交互并且將數(shù)據(jù)從磁盤緩沖區(qū)拷貝到內(nèi)核緩沖區(qū),之后的過(guò)程類似。

敲黑板】無(wú)論從僅CPU方式和DMA&CPU方式,都存在多次冗余數(shù)據(jù)拷貝和內(nèi)核態(tài)&用戶態(tài)的切換。

我們繼續(xù)思考Web服務(wù)器讀取本地磁盤文件數(shù)據(jù)再通過(guò)網(wǎng)絡(luò)傳輸給用戶的詳細(xì)過(guò)程。

3.普通模式數(shù)據(jù)交互

一次完成的數(shù)據(jù)交互包括幾個(gè)部分:系統(tǒng)調(diào)用syscall、CPU、DMA、網(wǎng)卡、磁盤等。

系統(tǒng)調(diào)用syscall是應(yīng)用程序和內(nèi)核交互的橋梁,每次進(jìn)行調(diào)用/返回就會(huì)產(chǎn)生兩次切換:

  • 調(diào)用syscall 從用戶態(tài)切換到內(nèi)核態(tài)
  • syscall返回 從內(nèi)核態(tài)切換到用戶態(tài)

來(lái)看下完整的數(shù)據(jù)拷貝過(guò)程簡(jiǎn)圖:

讀數(shù)據(jù)過(guò)程:

  • 應(yīng)用程序要讀取磁盤數(shù)據(jù),調(diào)用read()函數(shù)從而實(shí)現(xiàn)用戶態(tài)切換內(nèi)核態(tài),這是第1次狀態(tài)切換;
  • DMA控制器將數(shù)據(jù)從磁盤拷貝到內(nèi)核緩沖區(qū),這是第1次DMA拷貝;
  • CPU將數(shù)據(jù)從內(nèi)核緩沖區(qū)復(fù)制到用戶緩沖區(qū),這是第1次CPU拷貝;
  • CPU完成拷貝之后,read()函數(shù)返回實(shí)現(xiàn)用戶態(tài)切換用戶態(tài),這是第2次狀態(tài)切換;

寫數(shù)據(jù)過(guò)程:

  • 應(yīng)用程序要向網(wǎng)卡寫數(shù)據(jù),調(diào)用write()函數(shù)實(shí)現(xiàn)用戶態(tài)切換內(nèi)核態(tài),這是第1次切換;
  • CPU將用戶緩沖區(qū)數(shù)據(jù)拷貝到內(nèi)核緩沖區(qū),這是第1次CPU拷貝;
  • DMA控制器將數(shù)據(jù)從內(nèi)核緩沖區(qū)復(fù)制到socket緩沖區(qū),這是第1次DMA拷貝;
  • 完成拷貝之后,write()函數(shù)返回實(shí)現(xiàn)內(nèi)核態(tài)切換用戶態(tài),這是第2次切換;

綜上所述:

  • 讀過(guò)程涉及2次空間切換、1次DMA拷貝、1次CPU拷貝;
  • 寫過(guò)程涉及2次空間切換、1次DMA拷貝、1次CPU拷貝;
可見(jiàn)傳統(tǒng)模式下,涉及多次空間切換和數(shù)據(jù)冗余拷貝,效率并不高,接下來(lái)就該零拷貝技術(shù)出場(chǎng)了。

4. 零拷貝技術(shù)

4.1 出現(xiàn)原因

我們可以看到,如果應(yīng)用程序不對(duì)數(shù)據(jù)做修改,從內(nèi)核緩沖區(qū)到用戶緩沖區(qū),再?gòu)挠脩艟彌_區(qū)到內(nèi)核緩沖區(qū)。兩次數(shù)據(jù)拷貝都需要CPU的參與,并且涉及用戶態(tài)與內(nèi)核態(tài)的多次切換,加重了CPU負(fù)擔(dān)。

我們需要降低冗余數(shù)據(jù)拷貝、解放CPU,這也就是零拷貝Zero-Copy技術(shù)。

4.2 解決思路

目前來(lái)看,零拷貝技術(shù)的幾個(gè)實(shí)現(xiàn)手段包括:mmap+write、sendfile、sendfile+DMA收集、splice等。

4.2.1 mmap方式

mmap是Linux提供的一種內(nèi)存映射文件的機(jī)制,它實(shí)現(xiàn)了將內(nèi)核中讀緩沖區(qū)地址與用戶空間緩沖區(qū)地址進(jìn)行映射,從而實(shí)現(xiàn)內(nèi)核緩沖區(qū)與用戶緩沖區(qū)的共享。

這樣就減少了一次用戶態(tài)和內(nèi)核態(tài)的CPU拷貝,但是在內(nèi)核空間內(nèi)仍然有一次CPU拷貝。

mmap對(duì)大文件傳輸有一定優(yōu)勢(shì),但是小文件可能出現(xiàn)碎片,并且在多個(gè)進(jìn)程同時(shí)操作文件時(shí)可能產(chǎn)生引發(fā)coredump的signal。

4.2.2 sendfile方式

mmap+write方式有一定改進(jìn),但是由系統(tǒng)調(diào)用引起的狀態(tài)切換并沒(méi)有減少。

sendfile系統(tǒng)調(diào)用是在 Linux 內(nèi)核2.1版本中被引入,它建立了兩個(gè)文件之間的傳輸通道。

sendfile方式只使用一個(gè)函數(shù)就可以完成之前的read+write 和 mmap+write的功能,這樣就少了2次狀態(tài)切換,由于數(shù)據(jù)不經(jīng)過(guò)用戶緩沖區(qū),因此該數(shù)據(jù)無(wú)法被修改。

從圖中可以看到,應(yīng)用程序只需要調(diào)用sendfile函數(shù)即可完成,只有2次狀態(tài)切換、1次CPU拷貝、2次DMA拷貝。

但是sendfile在內(nèi)核緩沖區(qū)和socket緩沖區(qū)仍然存在一次CPU拷貝,或許這個(gè)還可以優(yōu)化。

4.2.3 sendfile+DMA收集

Linux 2.4 內(nèi)核對(duì) sendfile 系統(tǒng)調(diào)用進(jìn)行優(yōu)化,但是需要硬件DMA控制器的配合。

升級(jí)后的sendfile將內(nèi)核空間緩沖區(qū)中對(duì)應(yīng)的數(shù)據(jù)描述信息(文件描述符、地址偏移量等信息)記錄到socket緩沖區(qū)中。

DMA控制器根據(jù)socket緩沖區(qū)中的地址和偏移量將數(shù)據(jù)從內(nèi)核緩沖區(qū)拷貝到網(wǎng)卡中,從而省去了內(nèi)核空間中僅剩1次CPU拷貝。

這種方式有2次狀態(tài)切換、0次CPU拷貝、2次DMA拷貝,但是仍然無(wú)法對(duì)數(shù)據(jù)進(jìn)行修改,并且需要硬件層面DMA的支持,并且sendfile只能將文件數(shù)據(jù)拷貝到socket描述符上,有一定的局限性。

4.2.4 splice方式

splice系統(tǒng)調(diào)用是Linux 在 2.6 版本引入的,其不需要硬件支持,并且不再限定于socket上,實(shí)現(xiàn)兩個(gè)普通文件之間的數(shù)據(jù)零拷貝。

splice 系統(tǒng)調(diào)用可以在內(nèi)核緩沖區(qū)和socket緩沖區(qū)之間建立管道來(lái)傳輸數(shù)據(jù),避免了兩者之間的 CPU 拷貝操作。

splice也有一些局限,它的兩個(gè)文件描述符參數(shù)中有一個(gè)必須是管道設(shè)備。


5.本文小結(jié)

本文通過(guò)介紹數(shù)據(jù)交互的基本過(guò)程、傳統(tǒng)模式的缺點(diǎn),進(jìn)而介紹了零拷貝的一些實(shí)現(xiàn)方法。

零拷貝技術(shù)是非常底層且重要的讀寫優(yōu)化,對(duì)于服務(wù)并發(fā)能力的提升有很大幫助,就這么多吧,下期再見(jiàn)!

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉