分享你的Crypto资源:基于DPDK的Virtio-Crypto运算资源虚拟化方案

作者简介:Zhang, Roy Fan Intel软件工程师,主要从事DPDK开发与虚拟化方面的工作。

本文转载自DPDK与SPSK开源社区

为什么要Virtio-Crypto?

随着近年来互联网,特别是移动互联网的高速发展,用户对数据安全的要求也越来越高。越来越多的网络信息流都被做了加密处理,来防止诸如泄密,仿冒,和重播等类型的网络攻击。Google目前已实现全站HTTPS加密,并在其安全性报告中指出截止2018年7月,超过70%的Chrome数据都已实现加密。

而密保工作如IPSec则需要大量的计算机资源来进行。一个最基本的AES块加密工作也需要数十个回合的查表,移位,线性变换等操作。当今的网络流吞吐量的急剧增加导致加密的工作密度呈几何数量级的增长,这个增长刺激了整个加密加速器技术的发展。Intel最新的采用 C620 系列芯片组 (Purley) 的至强处理器可使用其集成的Intel QuickAssit Technology (QAT)芯片实现超过130Gbps的IPSec数据面处理能力。

与此同时,云计算也有着飞速的增长。云用户对网络安全的需求也随之增加。为了让云用户能享受到加密加速技术,大部分市面上的加密加速器,包括QAT,都使用了Single-root Input/Output (SRIOV) Virtual Function (VF)技术,使得多台VM/容器能共享一个QAT资源,并几乎没有任何性能损失,如图1所示。

图1:QAT的SR-IOV在VM中的使用

但SR-IOV技术并非没有缺点

1.首先,VM需要安装对应的VF驱动,与硬件有强耦合性。
2.同时,一个PF的VF的数量并非无限,其最大数量限制了能共享该PF的VM/容器 的数量。
3.再次,一个PF的最大吞吐量即为一个VF的最大吞吐量,用户无法获得更高的性能。
4.最后,VF目前并不具备限流功能,更没有QoS加持,而PF的最大吞吐量有限,其中某个VF的吞吐量加大则会制约其他VF,这个限制使得加密加速器的VF技术无法普及在公有云中。

所以,云用户所需要的加密加速器的虚拟化技术需要有和实机硬件无关,可拓展等特点。同时后端(物理机端)能实现聚合多个加速器资源和完成限流,QoS等工作。而这一切的答案就是Virtio-Crypto。

什么是Virtio-Crypto?

Virtio-Crypto是Virtio标准所支持的虚拟设备之一,由前端驱动和后端设备组成。前端一般为虚拟机和容器可访问的Virtio-Crypto设备驱动,而后端则是由物理服务器上的程序如Qemu所模拟的Vhost-Crypto设备。若虚拟机或者容器应用通过访问虚拟Virtio-Crypto设备做加密或验证等操作时,前端的Virtio-Crypto驱动会将其传入到后端并交由物理服务器的Crypto资源来处理。前端的Virtio-Crypto驱动已被整合到Linux内核中,而在后端也已有Qemu的软件Virtio-Crypto设备实现。

但是,这套方案也有有缺点
1.前端LKCF拖慢性能。因为前端的Virtio-Crypto驱动在内核的Linux Kernel Crypto Framework (LKCF)中,每次加密需要将数据进行2次拷贝,需要若干Callback调用,且不支持Burst操作。这些问题都严重拖慢了前端性能。
2.后端Qemu的Virtio-Crypto设备不支持硬件加速。

因此,目前的这套Virito-Crypto方案的效率太低,为了解决这个问题,我们提出了基于DPDK的Virtio-Crypto前后端的完整解决方案。

基于DPDK的Vhost-User-Crypto后端解决方案

2018年初Qemu被加入了Vhost-User的Crypto Proxy支持,使得除了Qemu之外其他的用户端Vhost-User应用来加速Crypto运算成为了可能。同年5月基于DPDK的Vhost User Crypto面世,成为了第一个支持Crypto设备的Vhost User加速方案。

Vhost Crypto作为DPDK Vhost 库的扩充,提供了几个新的API,并尽力隐藏了许多Vhost及Cryptodev实现的细节。我们将通过一个实例来看看他们怎么工作的。

首先,我们需要初始化Host的Cryptodev资源,包括设备,队列,和创建session mempool等。因为Virtio的特殊性,Host应该使用加密性能更强的Lookaside设备,如QAT。使用软件Cryptodev如AESNI-MB或者OPENSSL的话,因为VIRTIO数据传输的开销其总体性能将弱于VM上直接用软件加密引擎。

对于如何初始化Host的Cryptodev资源请参见本公众号以前的文章,或者是Cryptodev Programmer’s Guide。( https://doc.dpdk.org/guides/prog_guide/cryptodev_lib.html )。

然后,和配置其他Vhost Application一样,我们需要创建一个vhost_device_ops实例,用来注册Socket连接在创建和销毁时的回调函数,分别为new_device和destroy_device。

在new_device()函数中,我们需要做一下几件事。

Vhost Crypto的API具有易用,前后端解耦,扩展性高等优点。使用ZERO COPY也能大幅提升性能。可以很容易地整合到复杂的虚拟Crypto资源服务的应用中。然而,由于Virtio Crypto的LINUX驱动及QEMU PROXY的局限性,目前仅支持AES-CBC和SHA1-MAC算法。随着未来支持算法的增加,Vhost-Crypto也会不断发展壮大。

基于DPDK的Virtio-User-Crypto前端轮询驱动(PMD)

为解决LKCF的性能拖慢问题,我们在DPDK的Cryptodev Framework中加入了基于Virtio User的Virtio-Crypto PMD。关于DPDK Cryptodev Framework的介绍已在曾经的公众号文章中详细介绍过,这里就不在赘述了。该PMD和其他的DPDK Crypto PMD共享相同的控制面和数据面API,区别是其工作在虚拟机或者容器中。

要使用它,我们首先需要将Vhost Crypto应用启动并使其创建UNIX socket file,并将其有Qemu传递给VM。QEMU命令范例如下。

在VM中,该设备将被Linux Kernel默认绑定为一个Virtio Crypto设备。我们需要将QEMU传递上来的virtio设备绑定为UIO-PCI-GENERIC驱动。假设该设备拥有0000:00:04.0的PCI地址,我们可通过如下命令来将其改绑定。

然后,我们就能将其像其他Cryptodev PMD一样在DPDK中使用,并能享受HOST端的加速了。


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/23140.html
分享到:
相关文章
条评论

登录后才可以评论

SDNLAB君 发表于19-04-17
0