這篇文章主要講解了“Kafka中所謂的零拷貝技術(shù)是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Kafka中所謂的零拷貝技術(shù)是什么”吧!
創(chuàng)新互聯(lián)公司基于成都重慶香港及美國(guó)等地區(qū)分布式IDC機(jī)房數(shù)據(jù)中心構(gòu)建的電信大帶寬,聯(lián)通大帶寬,移動(dòng)大帶寬,多線BGP大帶寬租用,是為眾多客戶提供專業(yè)成都二樞服務(wù)器租用托管報(bào)價(jià),主機(jī)托管價(jià)格性價(jià)比高,為金融證券行業(yè)服務(wù)器托管,ai人工智能服務(wù)器托管提供bgp線路100M獨(dú)享,G口帶寬及機(jī)柜租用的專業(yè)成都idc公司。
除了消息順序追加、頁(yè)緩存等技術(shù),Kafka 還使用零拷貝技術(shù)來(lái)進(jìn)一步提升性能。所謂的零拷貝是指將數(shù)據(jù)直接從磁盤文件復(fù)制到網(wǎng)卡設(shè)備中,而不需要經(jīng)由應(yīng)用程序之手。零拷貝大大提高了應(yīng)用程序的性能,減少了內(nèi)核和用戶模式之間的上下文切換。對(duì) Linux 操作系統(tǒng)而言,零拷貝技術(shù)依賴于底層的 sendfile() 方法實(shí)現(xiàn)。對(duì)應(yīng)于 Java 語(yǔ)言,F(xiàn)ileChannal.transferTo() 方法的底層實(shí)現(xiàn)就是 sendfile() 方法。
單純從概念上理解“零拷貝”比較抽象,這里簡(jiǎn)單地介紹一下它??紤]這樣一種常用的情形:你需要將靜態(tài)內(nèi)容(類似圖片、文件)展示給用戶。這個(gè)情形就意味著需要先將靜態(tài)內(nèi)容從磁盤中復(fù)制出來(lái)放到一個(gè)內(nèi)存 buf 中,然后將這個(gè) buf 通過(guò)套接字(Socket)傳輸給用戶,進(jìn)而用戶獲得靜態(tài)內(nèi)容。這看起來(lái)再正常不過(guò)了,但實(shí)際上這是很低效的流程,我們把上面的這種情形抽象成下面的過(guò)程:
read(file, tmp_buf, len); write(socket, tmp_buf, len);
首先調(diào)用 read() 將靜態(tài)內(nèi)容(這里假設(shè)為文件 A )讀取到 tmp_buf,然后調(diào)用 write() 將 tmp_buf 寫入 Socket,如下圖所示。?
在這個(gè)過(guò)程中,文件 A 經(jīng)歷了4次復(fù)制的過(guò)程:
調(diào)用 read() 時(shí),文件 A 中的內(nèi)容被復(fù)制到了內(nèi)核模式下的 Read Buffer 中。
CPU 控制將內(nèi)核模式數(shù)據(jù)復(fù)制到用戶模式下。
調(diào)用 write() 時(shí),將用戶模式下的內(nèi)容復(fù)制到內(nèi)核模式下的 Socket Buffer 中。
將內(nèi)核模式下的 Socket Buffer 的數(shù)據(jù)復(fù)制到網(wǎng)卡設(shè)備中傳送。
從上面的過(guò)程可以看出,數(shù)據(jù)平白無(wú)故地從內(nèi)核模式到用戶模式“走了一圈”,浪費(fèi)了2次復(fù)制過(guò)程:第一次是從內(nèi)核模式復(fù)制到用戶模式;第二次是從用戶模式再?gòu)?fù)制回內(nèi)核模式,即上面4次過(guò)程中的第2步和第3步。而且在上面的過(guò)程中,內(nèi)核和用戶模式的上下文的切換也是4次。
如果采用了零拷貝技術(shù),那么應(yīng)用程序可以直接請(qǐng)求內(nèi)核把磁盤中的數(shù)據(jù)傳輸給 Socket,如下圖所示。
零拷貝技術(shù)通過(guò) DMA(Direct Memory Access)技術(shù)將文件內(nèi)容復(fù)制到內(nèi)核模式下的 Read Buffer 中。不過(guò)沒(méi)有數(shù)據(jù)被復(fù)制到 Socket Buffer,相反只有包含數(shù)據(jù)的位置和長(zhǎng)度的信息的文件描述符被加到 Socket Buffer 中。DMA 引擎直接將數(shù)據(jù)從內(nèi)核模式中傳遞到網(wǎng)卡設(shè)備(協(xié)議引擎)。這里數(shù)據(jù)只經(jīng)歷了2次復(fù)制就從磁盤中傳送出去了,并且上下文切換也變成了2次。零拷貝是針對(duì)內(nèi)核模式而言的,數(shù)據(jù)在內(nèi)核模式下實(shí)現(xiàn)了零拷貝。
要掌握Kafka的核心實(shí)現(xiàn)原理,不僅僅只是Kafka的日志格式、日志索引、日志清理等方面的內(nèi)容,也包含底層物理存儲(chǔ)相關(guān)的知識(shí)點(diǎn)。
感謝各位的閱讀,以上就是“Kafka中所謂的零拷貝技術(shù)是什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Kafka中所謂的零拷貝技術(shù)是什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!