PF_RING ZC (Zero Copy)
PF_RING?ZC(零復(fù)制)是一種靈活的數(shù)據(jù)包處理框架,可讓您在任何數(shù)據(jù)包大小下實(shí)現(xiàn)1/10 Gbit的線速數(shù)據(jù)包處理(RX和TX)。它實(shí)現(xiàn)了零復(fù)制操作,包括用于進(jìn)程間和VM間(KVM)通信的模式。它可以被視為DNA / LibZero的后繼產(chǎn)品,該產(chǎn)品基于過去幾年的經(jīng)驗(yàn)教訓(xùn)提供了一個(gè)單獨(dú)且一致的API。
它具有干凈靈活的API,可實(shí)現(xiàn)可從線程、應(yīng)用程序和虛擬機(jī)使用的簡單構(gòu)建基塊(隊(duì)列、工作器和池)。這樣可以實(shí)現(xiàn)10 Gbit線速數(shù)據(jù)包處理。
簡單干凈的API
PF_RING?ZC帶有一個(gè)簡單的API,能夠用幾行代碼創(chuàng)建一個(gè)復(fù)雜的應(yīng)用程序。 以下示例顯示了如何用6行代碼創(chuàng)建一個(gè)聚合器+平衡器應(yīng)用程序。
使用PF_RING感知驅(qū)動(dòng)程序的按需內(nèi)核旁路
PF_RING?ZC附帶了新一代的PF_RING?感知驅(qū)動(dòng)程序,可以在內(nèi)核或旁路模式下使用。安裝后,這些驅(qū)動(dòng)程序?qū)⒆鳛闃?biāo)準(zhǔn)Linux驅(qū)動(dòng)程序運(yùn)行,您可以在其中進(jìn)行常規(guī)聯(lián)網(wǎng)(例如ping或SSH)。當(dāng)從PF_RING?使用時(shí),它們比普通驅(qū)動(dòng)程序更快,因?yàn)樗鼈冎苯优c之交互。如果您使用支持PF_RING的驅(qū)動(dòng)程序以零拷貝方式打開設(shè)備(例如pfcount -i zc:eth1),則該設(shè)備將無法通過標(biāo)準(zhǔn)網(wǎng)絡(luò)使用,因?yàn)橥ㄟ^內(nèi)核旁路以零拷貝方式對(duì)其進(jìn)行了訪問,就像以前的DNA一樣。 一旦訪問設(shè)備的應(yīng)用程序關(guān)閉,標(biāo)準(zhǔn)的網(wǎng)絡(luò)活動(dòng)就可以再次發(fā)生。
零復(fù)制操作到虛擬機(jī)(KVM)
PF_RING?ZC允許您為KVM虛擬機(jī)以零拷貝轉(zhuǎn)發(fā)(RX和TX)數(shù)據(jù)包,而無需使用PCIe直通等技術(shù)。由于在VM上動(dòng)態(tài)創(chuàng)建了ZC設(shè)備,因此您可以從VM中以零拷貝捕獲/發(fā)送流量,而無需修補(bǔ)KVM代碼,也可以在創(chuàng)建ZC設(shè)備后啟動(dòng)KVM。從本質(zhì)上講,現(xiàn)在您可以使用在物理主機(jī)上使用的相同命令,對(duì)KVM進(jìn)行10 Gbit的線速傳輸,而無需更改任何代碼行。
上圖顯示ZC可用于創(chuàng)建跨虛擬機(jī)以零副本進(jìn)行通話的應(yīng)用程序管道。從本質(zhì)上講,PF_RING?ZC從第一天起就可以使用云了。
零復(fù)制操作
與其前身LibZero相似,在PF_RING?ZC中,您可以在線程,應(yīng)用程序以及現(xiàn)在的VM之間執(zhí)行零復(fù)制操作。您可以平衡各個(gè)應(yīng)用程序的零拷貝數(shù)據(jù)包
或?qū)嵤?shù)據(jù)包扇出。
在PF_RING?ZC中,所有內(nèi)容均以線速以零復(fù)制進(jìn)行。
性能
與其前身LibZero / DNA相似,PF_RING?ZC允許您從物理主機(jī)或KVM獲得10 Gbit的線速,無論任何數(shù)據(jù)包大小。您可以使用我們?yōu)槟_發(fā)的演示應(yīng)用程序自己進(jìn)行測(cè)試。
將0復(fù)制與1復(fù)制設(shè)備集成
在PF_RING?ZC中,即使對(duì)非PF_RING敏感的驅(qū)動(dòng)程序,也可以使用零復(fù)制框架。這意味著您可以將數(shù)據(jù)包分發(fā)、處理、發(fā)起并將其注入零復(fù)制框架,即使它們并非源自ZC設(shè)備也是如此。
一旦將數(shù)據(jù)包復(fù)制(副本)到ZC世界中,從那時(shí)起,該數(shù)據(jù)包將在其整個(gè)生命周期中始終以零副本處理。例如,zbalance_ipc演示應(yīng)用程序可以從非PF_RING感知設(shè)備(例如WiFI設(shè)備或Broadcom NIC)以一復(fù)制模式讀取數(shù)據(jù)包,并將其發(fā)送到ZC內(nèi)部以對(duì)其執(zhí)行零復(fù)制操作。
內(nèi)核旁路和IP堆棧數(shù)據(jù)包注入
與其他內(nèi)核旁路的技術(shù)相反,使用PF_RING?ZC,您可以隨時(shí)決定要向標(biāo)準(zhǔn)Linux IP堆棧中注入哪些內(nèi)核旁路的數(shù)據(jù)包。PF_RING帶有一個(gè)稱為“stack” 的IP 堆棧數(shù)據(jù)包注入模塊,通過該模塊,您可以選擇將內(nèi)核旁路接收的數(shù)據(jù)包注入到標(biāo)準(zhǔn)IP堆棧中。您需要做的就是打開設(shè)備“ stack:ethX”,然后將數(shù)據(jù)包發(fā)送到IP堆棧,就像從ethX接收到的一樣。
Snort的DAQ
當(dāng)使用Snort(最受歡迎的IDS / IPS之一)時(shí),Snort用戶還可以從PF_RING?ZC速度中受益。本地PF_RING?ZC DAQ(Snort Data AcQuisition)庫比標(biāo)準(zhǔn)PF_RING?DAQ快20%至50%,還可以在IPS和IDS模式下運(yùn)行。
PF_RING?ZC DAQ是PF_RING?的一部分。