我对智能网卡offload的认识

传统的互联网服务处理模型是这样的:
我对智能网卡offload的认识
这是一个必须拆东墙补西墙的模型,整天不是这里CPU高了就是那里CPU爆表了,完全就是一脬屎。

协议栈处理在软中断中进行,它可能是附着在任意进程上下文的,取决于中断发生时的current,如果这部分处理路径过长,留给业务处理的CPU时间便不多了,此外,CPU cache亲和力也是必须要考虑的。

反之,如果业务逻辑处理很繁重,那就势必会造成网卡和软中断处理的积压。总之,这是一个跷跷板游戏。我们期待的结果是,在CPU的总利用率尽可能高的前提下,CPU时间合理均匀分配给各个不同的上下文,使任务总体高速无积压被处理。

CPU很难合理均匀分配给这么多的上下文,这是上述模型的根本缺陷。


UNIX文化中强调不要把所有的事情都揉在一起,UNIX文化强调每次只把一件小事做好,然后通过协作来完成更大的事。

然而,在内核层面,不管是老牌UNIX,还是Linux,均是反其道而行之,所有的逻辑都被塞在了一个大内核中。这似乎是个笑话。著名的C10K问题中首先提出了一种担忧:
http://www.kegel.com/c10k.html
这种担忧在如今变成了现实。

把协议栈剥离出去形成一个独立的数据平面似乎更加迎合UNIX文化。

目标确定了,方法似乎不止一个,只要把 CPU的互斥模式改成协作模式即可。 其实还是一种Active-Backup模式到Active-Active的转变,很简单,把纵向模型改成横向模型即可:
我对智能网卡offload的认识
具体到实现上,也就分成了两类:

  1. 网卡和协议栈处理的独立CPU结合在一起,这便是智能网卡SmartNIC。
  2. 网卡和协议栈处理的独立CPU分离,这便是Intel DPDK/netmap/PF_RING。

对于Intel而言,似乎它的欲望更加接近于将DPDK标准化,而不是去做SmartNIC,毕竟,如果Intel实现完备的智能网卡,那么它的卖点只是一块携带高性能芯片的网卡而已,如果它宣传DPDK,顺便可以再卖一块CPU。换句话说,Intel就是卖CPU起家了,它当然希望把网卡的流量导入自家的CPU。

Intel只是将智能网卡的片上CPU剥离到了主板的标准CPU基座上了,然后网卡和这块标准CPU之间的接口便是DPDK。


关于这种网卡offload模式的实验,没钱是万万玩不起的,我一直在找一种软件仿真器,可以模拟智能网卡offload,然而没有找到。opennfp的netronome网卡也是价格不菲,反正就是买不起。

DPDK不喜欢,也没兴趣,所以自然pass。

所以DIY一个网卡卸载模型似乎有点意思。我准备把两个树莓派用串口或者USB(USB gadget机制)连接起来,这样其中一个树莓派就可以作为一块网卡存在了,而另一个则是主机,和标准智能网卡用PCIe连接主机不同的是,我只能用廉价的串口或者USB连接。如果一来,两个树莓派一个是纯数据面,一个是纯控制/管理面。

然而,这依然没有意义,这在虚拟机上就能搞,没有什么亮眼的东西。再说,两个树莓派也是买不起。最终还是要买智能网卡。欣赏的是智能网卡的分离式架构,而不是它的技术实现细节。

不过不管怎么说,没钱是悲哀的,非常令人遗憾,什么也干不成,这对于一个手艺人而言,只能泪目!我只能买得起这个:
我对智能网卡offload的认识
【图是网上找的,我在2004年为了应付Intel P4 2.4GHZ CPU电压太敏感买了这个】

当然,经理是必然没有这个困扰的,经理也不会买这种看得见摸得着的东西。


浙江温州皮鞋湿,下雨进水不会胖。