云防火(huo)墻采用(yong)(yong)了DPDK提(ti)供(gong)的用(yong)(yong)戶(hu)態(tai)數據面進行(xing)收發包處(chu)理,繞過了Linux內核態(tai)協(xie)議棧,以(yi)提(ti)升報(bao)文處(chu)理效(xiao)率。利(li)用(yong)(yong)DPDK提(ti)供(gong)的一(yi)組lib庫和(he)工具包集合,云防火(huo)墻從以(yi)下六方面來優(you)化轉發性能:
1、用戶(hu)態RCU鎖。
2、用戶(hu)態(tai)驅動(dong)。這(zhe)種方式既規避了不(bu)必要的內存(cun)拷貝又避免了系(xi)統調用。用戶(hu)態(tai)驅動(dong)不(bu)受(shou)限(xian)于內核現有的數據格(ge)式和行(xing)為定義。對mbuf頭格(ge)式的重定義、對網(wang)卡DMA操作的重新優化可以(yi)獲得更好的性能。而(er)用戶(hu)態(tai)驅動(dong)也(ye)便于快速地迭代優化,甚至(zhi)對不(bu)同場景進行(xing)不(bu)同的優化組合。
3、親和性與獨占(zhan)(zhan),DPDK工作(zuo)在(zai)用(yong)(yong)戶態(tai),線(xian)程的調度仍然(ran)依(yi)賴內核。利(li)用(yong)(yong)線(xian)程的CPU親和綁(bang)定(ding)(ding)的方式,特定(ding)(ding)任(ren)務可(ke)(ke)以被(bei)指定(ding)(ding)只在(zai)某個核上(shang)工作(zuo)。好(hao)處是(shi)可(ke)(ke)避(bi)免線(xian)程在(zai)不同(tong)核間頻繁(fan)切換,核間線(xian)程切換容易導致(zhi)因cache miss和cache write back造成的大量(liang)性能損失。如果更(geng)(geng)進一(yi)步地限定(ding)(ding)某些核不參(can)與Linux系統(tong)調度,就可(ke)(ke)能使線(xian)程獨占(zhan)(zhan)該核,保證更(geng)(geng)多(duo)cache hit的同(tong)時(shi),也避(bi)免了同(tong)一(yi)個核內的多(duo)任(ren)務切換開銷。
4、降(jiang)(jiang)低(di)訪(fang)存(cun)(cun)(cun)開銷,防火墻是(shi)一種典(dian)型的(de)I/O密集型(I/O bound)工作負載。無論是(shi)CPU指令還是(shi)DMA,對(dui)于(yu)(yu)內存(cun)(cun)(cun)子系統(Cache+DRAM)都(dou)會訪(fang)問(wen)頻繁。利(li)用內存(cun)(cun)(cun)大頁(ye)能有效(xiao)(xiao)降(jiang)(jiang)低(di)TLB miss,比(bi)如利(li)用內存(cun)(cun)(cun)多通道的(de)交錯(cuo)訪(fang)問(wen)能有效(xiao)(xiao)提高內存(cun)(cun)(cun)訪(fang)問(wen)的(de)有效(xiao)(xiao)帶(dai)寬,再比(bi)如利(li)用對(dui)于(yu)(yu)內存(cun)(cun)(cun)非對(dui)稱(cheng)性(NUMA)的(de)感知可(ke)以避免(mian)額外的(de)訪(fang)存(cun)(cun)(cun)延遲(chi)。
5、軟件調優(you)。這(zhe)里包括一系列調優(you)實踐(jian),比(bi)如結構的cache line對(dui)齊,比(bi)如數據(ju)在多核間訪(fang)問(wen)避免(mian)跨cache line共享(xiang),比(bi)如適時地預取數據(ju),再(zai)如多元(yuan)數據(ju)批量操(cao)作。
6、充分挖掘網卡的(de)潛(qian)能,目(mu)前主流(liu)網卡往往都支持SR-IOV(Single Root Input/Output Virtualization, 單(dan)根I/O虛擬化)、RSS(Receive-Side Scaling, 接收方擴(kuo)展)和硬件卸(xie)載(zai)(如Chksum,TSO等(deng))功能。
1)SR-IOV
對于虛(xu)擬(ni)(ni)機方(fang)式部署(shu)的云防火(huo)墻,利用SR-IOV將(jiang)一(yi)(yi)塊物(wu)理網卡呈(cheng)現(xian)為一(yi)(yi)個(ge)(ge)(ge)PF(Physical Function,物(wu)理功能(neng))和多個(ge)(ge)(ge)VF(Virtual Function,虛(xu)擬(ni)(ni)功能(neng)),每個(ge)(ge)(ge)VF都(dou)有它們自己(ji)的獨立PCI配置(zhi)空(kong)間、收發隊列、中斷等(deng)資(zi)源。宿主機將(jiang)一(yi)(yi)個(ge)(ge)(ge)或者(zhe)多個(ge)(ge)(ge)VF透傳給(gei)虛(xu)擬(ni)(ni)機獨占(zhan)使用,繞過(guo)Hypervisor模擬(ni)(ni)層以提高I/O性能(neng)。
2)RSS
簡單說(shuo),RSS就(jiu)是讓(rang)多(duo)隊列網卡將數據包收發處理均勻地hash到多(duo)個(ge)核上。
其中(zhong)哈希(xi)值的(de)(de)計算(suan)(suan)公(gong)式在(zai)硬件中(zhong)完成的(de)(de),網卡會根(gen)據不同(tong)(tong)的(de)(de)數(shu)(shu)據包(bao)(bao)類型選(xuan)取出不同(tong)(tong)的(de)(de)關鍵字(zi),比如IPV4 UDP包(bao)(bao)的(de)(de)關鍵字(zi)就由四(si)元組組成(源(yuan)IP地(di)址、目(mu)的(de)(de)IP地(di)址、源(yuan)端口號(hao)、目(mu)的(de)(de)端口號(hao))。另(ling)外,在(zai)云防火墻中(zhong),一個(ge)(ge)連(lian)接的(de)(de)雙向流有(you)著相似的(de)(de)處理,自然就希(xi)望有(you)著對(dui)稱信息的(de)(de)數(shu)(shu)據包(bao)(bao)都能(neng)進入(ru)同(tong)(tong)一個(ge)(ge)核上處理,選(xuan)用對(dui)稱哈希(xi)(Symmetric Hash)算(suan)(suan)法可(ke)以(yi)保證Hash(src,dst)= Hash(dst,src),避免不同(tong)(tong)核之間的(de)(de)數(shu)(shu)據同(tong)(tong)步消耗性能(neng)。RSS使得網卡更好地(di)與多核處理器、多任務系統配合,從而達到更高效IO處理的(de)(de)目(mu)的(de)(de)。