云防火墙采用了DPDK提供的用户态数据面进行收发包处理,绕过了Linux内核态协议栈,以提升报文处理效率。利用DPDK提供的一组lib库和工具包集合,云防火墙从以下六方面来优化转发性能:
1、用户态RCU锁。
2、用户态驱动。这种方式既规避了不必要的内存拷贝又避免了系统调用。用户态驱动不受限于内核现有的数据格式和行为定义。对mbuf头格式的重定义、对网卡DMA操作的重新优化可以获得更好的性能。而用户态驱动也便于快速地迭代优化,甚至对不同场景进行不同的优化组合。
3、亲和性与独占,DPDK工作在用户态,线程的调度仍然依赖内核。利用线程的CPU亲和绑定的方式,特定任务可以被指定只在某个核上工作。好处是可避免线程在不同核间频繁切换,核间线程切换容易导致因cache miss和cache write back造成的大量性能损失。如果更进一步地限定某些核不参与Linux系统调度,就可能使线程独占该核,保证更多cache hit的同时,也避免了同一个核内的多任务切换开销。
4、降低访存开销,防火墙是一种典型的I/O密集型(I/O bound)工作负载。无论是CPU指令还是DMA,对于内存子系统(Cache+DRAM)都会访问频繁。利用内存大页能有效降低TLB miss,比如利用内存多通道的交错访问能有效提高内存访问的有效带宽,再比如利用对于内存非对称性(NUMA)的感知可以避免额外的访存延迟。
5、软件调优。这里包括一系列调优实践,比如结构的cache line对齐,比如数据在多核间访问避免跨cache line共享,比如适时地预取数据,再如多元数据批量操作。
6、充分挖掘网卡的潜能,目前主流网卡往往都支持SR-IOV(Single Root Input/Output Virtualization, 单根I/O虚拟化)、RSS(Receive-Side Scaling, 接收方扩展)和硬件卸载(如Chksum,TSO等)功能。
1)SR-IOV
对于虚拟机方式部署的云防火墙,利用SR-IOV将一块物理网卡呈现为一个PF(Physical Function,物理功能)和多个VF(Virtual Function,虚拟功能),每个VF都有它们自己的独立PCI配置空间、收发队列、中断等资源。宿主机将一个或者多个VF透传给虚拟机独占使用,绕过Hypervisor模拟层以提高I/O性能。
2)RSS
简单说,RSS就是让多队列网卡将数据包收发处理均匀地hash到多个核上。
其中哈希值的计算公式在硬件中完成的,网卡会根据不同的数据包类型选取出不同的关键字,比如IPV4 UDP包的关键字就由四元组组成(源IP地址、目的IP地址、源端口号、目的端口号)。另外,在云防火墙中,一个连接的双向流有着相似的处理,自然就希望有着对称信息的数据包都能进入同一个核上处理,选用对称哈希(Symmetric Hash)算法可以保证Hash(src,dst)= Hash(dst,src),避免不同核之间的数据同步消耗性能。RSS使得网卡更好地与多核处理器、多任务系统配合,从而达到更高效IO处理的目的。