Linux平台使用网络加速卡提高转发性能

一直以来,Linux给人的印象都是服务器级别的,虽然有人拿它当桌面,也有手机使用它,但这都是少数,几乎从来都没有人拿它放在骨干网上当路由器,哪怕是接入层都少到几乎没有人使用Linux。Netfilter机制可以改变这个事实,因为Netfilter机制太强悍了,它几乎可以让你完全重新定制协议栈的行为。
不要以为只有iptables之类的防火墙/NAT软件才使用Netfilter,其实Netfilter是一个统一的过滤框架,它的本质在于可以在协议栈的某些地方截获数据包,然后你怎么去处理截获的数据包,那就是你自己的事了,对于iptables而言,它只是执行一系列的match,然后执行一个target,然而Netfilter还可以做得更多。
很早就听过网络加速器,但是一直觉得光靠软件,优化一些算法,是绝对不可能造成性能统计数据的数量级的提升的,肯定需要某种硬件的帮助,即便Cisco这样的专业级别的设备,也是使用了大量的ASIC芯片来转发报文的,实际上就是使用了某种硬件的cache机制。如果这些硬件也能插入运行Linux的网关内,那么Linux的网络转发性能势必也会大幅提高。然而硬件插上去很简单,如何让软件配合硬件工作呢?我们知道硬件没有软件的配合就是一堆废品,因此必须要让插入的加速卡在软件的指导下工作起来,这又谈何容易啊,我们不得不修改协议栈的代码。
幸运的是,Linux上有Netfilter,这样事情就简单多了。如何操作加速卡硬件,那是硬件厂商的事情,买来的硬件如果没有开发手册,那其实也是一堆废品。因此买来的硬件一定要有一个开发手册,起码要提供在各个平台上都能使用的API,适当得可以再给一些Demo,这样我们就可以根据API和Demo比葫芦画瓢的完成新硬件的接入了。对于某些平台,你可能需要为新硬件新开发一个协议栈,这纯粹是为了对接硬件的,然而对于Linux平台,内置的Netfilter框架可以帮你轻松完成和加速卡的对接。大体的架构如下图所示:

很多硬件网络加速卡内置了千兆乃至万兆以太网卡,这意味着加速卡驱动本身就包含以太网卡驱动。这样事情就更简单了,一般而言,硬件驱动都是厂商提供的,你要做的就是根据厂商的API来操作硬件就行了,这些代码不用单独置于一个程序中,而是接在Netfilter的函数里面就可以了,我们可以单独开发一个nf_hook_ops,也可以修改现有的,比如说按照上图,厂商提供了线速转发ASIC芯片,那么如何实现一个基于流的快速转发呢?实际上我们可以修改ip_conntrack_in以及confirm函数,使它将初始化好的nf_conn信息不再存于内核内存,而是通过API存于硬件,实际上大多数情况只有一个流的头包会到达内核,其它的后续包直接由ASIC转发出去,对于头包则继续向上,如果到达filter表则将filter结果也存入硬件,这样就真的俨然一个硬件Firewall了,随后将路由信息(主要是出口设备信息)也存入硬件,这样硬件加速卡就完全具备了转发一个数据包所需要的所有信息了,接下来的包进而被直接硬件转发,无需再进入内核。
本质上,所谓的硬件加速卡就是一系列的Cache Line,这些都是硬件实现的,它们容量巨大,不是软件所能比的。它们将软件上的比如路由表,arp表,策略表等一系列的静态表格映射成了一系列的Cache Line,加上复杂的逻辑开关进而实现快速转发。此为硬件加速卡的特性之一,之二就是提供丰富且易用的API来减轻研发人员的开发工作量,接下来就是开发人员的平台选择了,选择Linux可以使得工作量减少到最低限。有了网络加速器以及Linux,任何人都有能力自己DIY一台性能超猛的网关,目前正想淘一块最便宜的加速卡,然后使用最便宜的已经被淘汰的PC机,加上免费的Linux,如此一来,...即便如此,我也没有什么办法搞压力测试...
如今的硬件越来越可定制策略了,很多本来应该由软件完成的复杂的策略都可以由硬件来完成了,这正得益于集成电路工艺水平的提高,面对硬件越来越强悍,似乎复杂的软件越来越跟不上步伐了,近期在做OpenVPN的压力测试,我心中十分忐忑,我不想用太高端的硬件,因为它几乎不能给OpenVPN的性能带来大幅的提升,反而更是让人觉得是OpenVPN拖了后腿...置于百兆环境,使用OpenVPN传输加密数据和不使用OpenVPN传输数据的差异仅仅是加密和不加密的差别,性能几乎仅仅受影响于CPU的加密带宽(没必要使用加密卡),然而置于千兆环境,两者的性能差别则是数量级的差别,除了CPU的加密还有什么拖垮了OpenVPN,是其本身的软件架构。因此软件远远跟不上硬件的发展了。到底为什么造成了如此尴尬的局面,在应用如此丰富的今天,是否应该仔细思考一下了。

你可能感兴趣的:(Linux平台使用网络加速卡提高转发性能)