傳統(tǒng)的拷貝過程
流程步驟:
(1)操作系統(tǒng)將數(shù)據(jù)從磁盤文件中讀取到內(nèi)核空間的頁(yè)面緩存;
(2)應(yīng)用程序?qū)?shù)據(jù)從內(nèi)核空間讀入用戶空間緩沖區(qū);
(3)應(yīng)用程序?qū)⒆x到數(shù)據(jù)寫回內(nèi)核空間并放入socket緩沖區(qū);
(4)操作系統(tǒng)將數(shù)據(jù)從socket緩沖區(qū)復(fù)制到網(wǎng)卡接口,此時(shí)數(shù)據(jù)才能通過網(wǎng)絡(luò)發(fā)送。
read/write 屬于系統(tǒng)調(diào)用 syscall,每一次系統(tǒng)調(diào)用 ,發(fā)生兩次上下文切換
此過程涉及到4次上下文切換以及4次數(shù)據(jù)的復(fù)制,但是這些過程中cpu數(shù)據(jù)完全沒有進(jìn)行變化,僅僅是磁盤數(shù)據(jù)復(fù)制到了網(wǎng)卡的緩沖區(qū),在這種情況下,如果去掉流程2和3,減少用戶空間和內(nèi)核空間之間的切換,雖然減少了數(shù)據(jù)交換的次數(shù),但是仍然存在數(shù)據(jù)多次復(fù)制的情況。
注:步驟1和4的數(shù)據(jù)傳輸是通過DMA引擎進(jìn)行拷貝的
步驟2和3的數(shù)據(jù)傳輸是通過cpu進(jìn)行拷貝的**
零拷貝技術(shù)
在DMA技術(shù)的基礎(chǔ)上,可以實(shí)現(xiàn)絕對(duì)的零拷貝,DMA技術(shù)為(Direct Memory Access,直接存儲(chǔ)器訪問),不需要依賴cpu的大量中斷負(fù)載,數(shù)據(jù)文件可以直接繞過CPU在各個(gè)層之間傳輸,外圍設(shè)備可以直接通過DMA控制器訪問內(nèi)存。通過零拷貝技術(shù),可以減去沒有必要的數(shù)據(jù)復(fù)制操作,同時(shí)也減少了上下文切換的次數(shù)。
可以看出,零拷貝技術(shù)只需要將數(shù)據(jù)從硬盤中將磁盤文件數(shù)據(jù)復(fù)制到頁(yè)面緩存一次,然后直接將數(shù)據(jù)才從頁(yè)面緩存直接發(fā)送到網(wǎng)絡(luò)中,避免了重復(fù)復(fù)制的操作
頁(yè)面緩存:存儲(chǔ)磁盤數(shù)據(jù)的內(nèi)核緩存區(qū)域,是操作系統(tǒng)內(nèi)核中的一部分,用于緩存從磁盤讀取的數(shù)據(jù),以提高文件系統(tǒng)的性能;由物理內(nèi)存中的頁(yè)面構(gòu)成的,每個(gè)頁(yè)面的大小通常為4KB或更大。當(dāng)內(nèi)核從磁盤讀取數(shù)據(jù)時(shí),它將數(shù)據(jù)存儲(chǔ)在頁(yè)面緩存中。如果其他進(jìn)程需要訪問相同的數(shù)據(jù),內(nèi)核可以直接從頁(yè)面緩存中讀取,而無需再次從磁盤讀取數(shù)據(jù),從而提高了讀取性能。在零拷貝技術(shù)中,頁(yè)面緩存是實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)囊徊糠帧.?dāng)數(shù)據(jù)需要從磁盤傳輸?shù)骄W(wǎng)絡(luò)或其他設(shè)備時(shí),內(nèi)核可以直接將頁(yè)面緩存中的數(shù)據(jù)發(fā)送到目標(biāo)設(shè)備,而無需將數(shù)據(jù)復(fù)制到用戶空間或其他中間緩沖區(qū)。這樣可以減少數(shù)據(jù)復(fù)制的次數(shù)和數(shù)據(jù)傳輸?shù)难舆t,提高數(shù)據(jù)傳輸?shù)男省?/p>
Java采用的零拷貝技術(shù)TransferTo方法底層也是調(diào)用sendfile(),Kafka的零拷貝技術(shù)可以直接將直接從它被調(diào)用的通道上傳輸?shù)搅硪粋€(gè)可寫字節(jié)通道,數(shù)據(jù)無需流經(jīng)用戶空間的應(yīng)用程序;在Linux系統(tǒng)中零拷貝是基于sendfile()系統(tǒng)調(diào)用實(shí)現(xiàn)的,sendfile()實(shí)現(xiàn)的是讀到內(nèi)核空間的數(shù)據(jù)轉(zhuǎn)到socket buffer,最后復(fù)制到協(xié)議引擎。文章來源:http://www.zghlxwxcb.cn/news/detail-709787.html
點(diǎn)擊查看代碼
mmap和sendfile都是零拷貝的實(shí)現(xiàn)方案,只不過不同的場(chǎng)景使用不同的方案;
mmap其實(shí)本質(zhì)就是物理上磁盤文件的地址和頁(yè)面緩存的地址進(jìn)行映射,完成映射后對(duì)物理內(nèi)存的操作會(huì)同步到硬盤上,用戶通過修改內(nèi)存就可以修改磁盤文件。Kafka生產(chǎn)的數(shù)據(jù)持久化到Broker里采用的是**mmap**文件映射的方式,實(shí)現(xiàn)順序的快速寫入
sendfile就是將讀到內(nèi)核空間的數(shù)據(jù)轉(zhuǎn)到Socket Buffer,最后復(fù)制到協(xié)議引擎,相較于mmap又節(jié)省了一次cpu拷貝;
消費(fèi)者從 broker 讀取數(shù)據(jù),采用sendfile,將磁盤文件讀到內(nèi)核緩沖區(qū)后,直接轉(zhuǎn)到socket buffer進(jìn)行網(wǎng)絡(luò)發(fā)送
文章來源地址http://www.zghlxwxcb.cn/news/detail-709787.html
到了這里,關(guān)于Kafka的零拷貝技術(shù)Zero-Copy的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!