作者简介

Zhang, Roy Fan Intel软件工程师

主要从事DPDK开发与虚拟化方面的工作。

为什么要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技术并非没有缺点

  • 首先,VM需要安装对应的VF驱动,与硬件有强耦合性。

  • 同时,一个PF的VF的数量并非无限,其最大数量限制了能共享该PF的VM/容器 的数量。

  • 再次,一个PF的最大吞吐量即为一个VF的最大吞吐量,用户无法获得更高的性能。

  • 最后,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设备实现。

但是,这套方案也有有缺点

  • 前端LKCF拖慢性能。因为前端的Virtio-Crypto驱动在内核的Linux Kernel Crypto Framework (LKCF)中,每次加密需要将数据进行2次拷贝,需要若干Callback调用,且不支持Burst操作。这些问题都严重拖慢了前端性能。

  • 后端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()函数中,我们需要做一下几件事。

static int

new_device(int vid) {

...

/*    首先,我们需要调用rte_vhost_crypto_create()函数,该函数用来初始化Vhost Crypto实例。其中vid为Virtio Device设备号,cryptodev_id为初始化好的DPDKCryptodev设备号,crypto_sess_pool和crypto_sess_priv_pool为用来创建和初始化处理VM加解密任务的session。

在Virtio Crypto标准中,session的信息交换为session_id。而在DPDK Cryptodev中session则为一段具体的数据。因此Vhost Crypto的每一个实例都将维护一个用来映射virtio crypto session_id和DPDK Cryptodev session数据的关系的表,并自动处理VM发送的创建及删除session的请求。用户无需进行任何干预,只需在创建实例时提供Cryptodev ID和sessionmempool即可。

*/

rte_vhost_crypto_create(vid,

cryptodev_id,

crypto_sess_pool,

crypto_sess_priv_pool,

rte_lcore_to_socket_id(lcore_id);

...

/*    然后,我们需要告诉Vhost Crypto是否开启zero copy。开启zero copy可让函数避免在处理virtio cryptodata request时对数据进行拷贝和写回,而仅将request的物理地址进行VM->Host的转换。开启zero copy能大幅提升处理效率。

但该方法有一定的局限:要求HOST系统开启IOMMU,VIOMMU也要开启等,同时不支持Host端使用AESNI-MB PMD,以及不支持该数据内存在物理上不连续。在VM中LKCF对每个设备初始化后会进行可行性检测,其中就包括SCATTER-GATHER LIST的正确性检测。开启zero copy会使VM上的设备驱动无法通过这项检测而导致初始化失败,因此需要HOST端在等待LKCF检测完成之后再开启zero copy.*/

rte_vhost_crypto_set_zero_copy(vid,zero_copy);

...

}

Vhost Crypto用户应用的数据面处理也非常简单。以下代码为worker lcore执行的代码片段。

static int

vhost_crypto_worker(void *arg) {

uint16_tinflight = 0;

intcallfds[MAX_NB_VIRTIO_CRYPTO_DEVICES];

structrte_crypto_op *ops[burst_size];

...

/*  首先分配一个burst的DPDK Crypto Operation */

rte_crypto_op_bulk_alloc(cop_pool,RTE_CRYPTO_OP_TYPE_SYMMETRIC, ops,

burst_size);

/*  实际处理VM Crypto Data Request的无限循环 */

for(;;) {

uint16_tfetched;

//    获得能完整enqueue到Cryptodev中operation数的大小,详见下文 nb_ops =RTE_MIN(burst_size, NB_DESCRIPTORS – inflight */

/*    从virtio queue中获取最大nb_ops个virtio crypto request并转换成DPDK Crypto Operation,并写入ops中,最后返回处理完成的ops数量。*/

fetched = rte_vhost_crypto_fetch_requests(vid,virtio_queue_id,

ops,nb_ops);

/*    将转换好的ops enqueue到Cryptodev的queue中。*/

inflight+= rte_cryptodev_enqueue_burst(cryptodev_id, queue_id,

ops,fetched);

/*    一个小贴士:DPDK Cryptodev的queue并非无限大,倘若该qeueue已经饱和,以上操作将不能成功enqueue到fetched个operation。而未能成功enqueue的operation必须妥善保存,以避免VM的crypto request丢失。因此,建议用户记录下初始Cryptodev Queue时指定NB_DESCRIPTORS(即为Queue的大小)。在调用rte_vhost_crypto_fetch_requests()时用其与inflight比较来获得合适的nb_ops大小,以避免fetched太多而不能enqueue的情况发生。记录inflight也可以用来进行更复杂的SLA相关操作,如QoS等 */

/*    将DPDK Cryptodev处理完的Crypto Operation Dequeue出来 */

fetched= rte_cryptodev_dequeue_burst(cryptodev_id, queue_id,

ops_dequeue, RTE_MIN(burst_size, inflight));

/*    更新inflight */

inflight-= fetched;

/*    因为Cryptodev操作的异步性,dequeue的operation未必为刚刚enqueue的,而且也不一定属于同一个Virtio Device。因此要调用以下函数将处理好的buffer写回(zero copy未开启),并在callfds中记录该burst中所有request的所有Virtio Device ID */

rte_vhost_crypto_finalize_requests(ops_dequeue,

fetched,callfds, &nb_callfds);

/*  最后,通知每一个Virtio Device,加解密工作完成 */

for(i = 0; i < nb_callfds; i++)

eventfd_write(callfds[i],(eventfd_t)1);

}

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命令范例如下。

qemu-system-x86_64 \

[...] \

-chardevsocket,id=charcrypto0,path=/path/to/your/socket \

-objectcryptodev-vhost-user,id=cryptodev0,chardev=charcrypto0 \

-devicevirtio-crypto-pci,id=crypto0,cryptodev=cryptodev0

[...]

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

modprobe uio_pci_genericecho -n 0000:00:04.0 > /sys/bus/pci/drivers/virtio-pci/unbindecho "1af4 1054" > /sys/bus/pci/drivers/uio_pci_generic/new_id

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

【相关参考资料】

DPDK Vhost 库下关于Crypto的API介绍https://doc.dpdk.org/guides/prog_guide/vhost_lib.html

DPDK Vhost-Crypto 范例http://doc.dpdk.org/guides/sample_app_ug/vhost_crypto.html

DPDK Virtio-Crypto PMD介绍https://doc.dpdk.org/guides/cryptodevs/virtio.html

推荐阅读 

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

  1. 直播 | DSTC 8“基于Schema的对话状态追踪”竞赛冠军方案解读

    「PW Live」是 PaperWeekly 的学术直播间,旨在帮助更多的青年学者宣传其最新科研成果.我们一直认为,单向地输出知识并不是一个最好的方式,而有效地反馈和交流可能会让知识的传播更加有意义, ...

  2. DockOne微信分享( 九十):猎豹移动基于CoreOS在AWS上的项目实践

    本文讲的是DockOne微信分享( 九十):猎豹移动基于CoreOS在AWS上的项目实践[编者的话]本次分享介绍基于AWS的EC2服务如何设计和搭建适合自己业务的架构方案实现全球多region部署,介 ...

  3. 20个基于DPDK开源项目,建议收藏

    一.ANS – DPDK 原生加速网络堆栈 ANS(加速网络堆栈)是DPDK本地TCP/IP堆栈,也参考FreeBSD实现.ANS提供了一个与Intel DPDK一起使用的用户空间TCP/IP堆栈. ...

  4. 《深入浅出DPDK》读书笔记(十六):DPDK应用篇(基于DPDK的存储软件优化:SPDK)

    Table of Contents 基于DPDK的存储软件优化 180.基于以太网的存储系统 181.以太网存储系统的优化 SPDK介绍 182.SPDK介绍 (1)兼容性 (2)性能 183.用户态 ...

  5. 一个高速lvs-dr替代系统设计 -- 基于dpdk的高性能负载均衡器

    # LVS DR 原理 LVS-DR不同于普通的haproxy代理机制,它在网络中的作用层级更加底层.haproxy一般代理应用层的应用数据,所有的数据都会通过haproxy收发,导致了haproxy ...

  6. 云计算机是一种基于资源,一种基于云平台和云计算的资源管理系统和方法

    一种基于云平台和云计算的资源管理系统和方法 [技术领域] [0001]本发明涉及云计算系统,尤其涉及一种基于云平台和云计算的资源管理系统和方法. [背景技术] [0002]云计算(Cloud Comp ...

  7. Hystrix面试 - 基于 Hystrix 线程池技术实现资源隔离

    Hystrix面试 - 基于 Hystrix 线程池技术实现资源隔离 上一讲提到,如果从 Nginx 开始,缓存都失效了,Nginx 会直接通过缓存服务调用商品服务获取最新商品数据(我们基于电商项目做 ...

  8. 基于DPDK+VPP实现高性能防火墙

    0. 数据平面和用户态协议栈 传统基于linux netfilter实现防火墙,虽然方便,但是性能很差.于是pfring/netmap/dpdk等机制,都要bypass掉内核协议栈. 多年来,各大操作 ...

  9. 基于ssm的课程思政资源众包系统的设计与实现毕业设计源码020838

    ssm课程思政资源众包系统 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用.信息时代的到来已成为不可阻挡的时尚潮流,人类 ...

最新文章

  1. Node.js:路由
  2. windows10中git 远程仓库使用
  3. 乐高ev3搭建图_乐高EV3作品|机械夹子(二)
  4. EOS账户系统(5)action分级
  5. 二叉树的最长的路径长度最大路径和
  6. How to be a great Project Director
  7. 第一台计算机豹电器元件,电气基础和安全知识.ppt
  8. iBeacon的第一篇(基于Swift实现)
  9. 记录——《C Primer Plus (第五版)》第十章编程练习第五题
  10. 开源的物联网技术平台thingsboard安装测试及使用步骤
  11. python xml etree_Python 标准库之 xml.etree.ElementTree
  12. MySQL安装包下载地址(含所有版本)
  13. c语言程序基础设计题,《C语言程序设计基础》习题集(含答案)
  14. 一年工作经验的大专生程序员(java后台)
  15. 我研究了3年,终于找出2021年完美的听歌方案!
  16. git远程上传gitbub的相关问题
  17. 30行python代码实现豆瓣电影排行爬取
  18. 用c/c++和Java语言实现庞加莱回归
  19. 如何使用excel画甘特图
  20. intel至强服务器芯片制程,64核自研芯片性能提升7倍,追平英特尔至强

热门文章

  1. iphone解锁_如何将iPhone或iPad置于“监督模式”以解锁强大的管理功能
  2. 2021-2025年中国农用拖拉机行业市场供需与战略研究报告
  3. 批量删除Mac中的短信及iMessages信息
  4. jq 个性的隔行变色
  5. 啡鸟集:掌握这个几个小技能,轻松做一杯咖啡
  6. html表格自动分列,[css]display: table-cell,用div做分列布局
  7. 关于DataGrid的一点基础东西
  8. 《部落冲突》的分析与探讨
  9. Win10自带截图工具SnippingTool.exe截图锁屏异常一例
  10. es父子结构查询_elasticsearch 学习之父子关联查询 parent/child