共计 6136 个字符,预计需要花费 16 分钟才能阅读完成。
作者:vivo 互联网服务器团队 - Ye Feng
本文介绍了 Intel QAT 技术计划,通过 Multi-Buffer 技术和 QAT 硬件加速卡的两种形式实现对 TLS 的减速
一、背景
以后 TLS 曾经成为了互联网安全的次要传输协定,TLS 带来更高的安全性的同时,也带来了更多的性能开销。特地是在建连握手阶段,TLS 的 CPU 开销,绝对于 TCP 要大很多。
业界在优化 TLS 性能上曾经做了很多软件和协定层面的优化,包含:Session 复用、OCSP Stapling、TLS1.3 等。然而在摩尔定律 ” 生效 ” 的今日,软件层面的优化很难满足日益增长的流量,应用专用的硬件技术卸载 CPU 计算成为目前通用的解决方案。本文将介绍 Intel 在 TLS 减速畛域提供的 QAT 技术计划。
二、Intel QuickAssist Technology(QAT)技术计划
Intel 提供了 TLS 异步减速的残缺解决方案: Intel QuickAssist Technology(QAT),简称 Intel QAT 技术。
如下图所示,QAT 反对减速的明码算法笼罩了 TLS 的整个流程,包含:握手阶段的签名、秘钥替换算法,数据传输的 AES 加解密算法等。
图 1. QAT 对 TLS 流程的明码算法的反对(图片起源)
QAT 提供了对称与非对称两类明码算法的反对,次要包含:
- 非对称加密算法:RSA, ECDSA, ECDHE
- 对称加密算法:AES-GCM(128,192,256)
注:QAT 减速的劣势次要体现在非对称加密上,从官网的整体性能数据看,非对称算法性能晋升 1.6~2 倍,对称算法性能晋升 10%~15%
2.1 QAT Engine 软件栈
QAT Engine 是 QAT 技术计划的外围模块,次要的作用是作为应用程序和硬件之间的中间层,负责“加解密操作的输入输出数据”在用户应用程序与硬件卡之间进行传递,次要操作就是 IO 的读写。
QAT Engine 是以 OpenSSL 第三方插件的形式提供给用户,这个象征用户能够应用 OpenSSL 规范的 API,就能够实现对 TLS 的减速,只须要对原有代码做 OpenSSL 异步革新,就能够享受 QAT 技术带来的 TLS 性能减速,业务侵入性较小。
图 2. Intel QAT Engine 软件栈(图片起源)
如上图所示,QAT Engine 反对两种减速形式:
- 软件减速(qat_sw):应用 Multi-Buffer(SIMD)技术,对明码算法进行并行处理优化。
- 硬件加速(qat_hw):应用 QAT 硬件加速卡,将明码算法计算从 CPU OffLoad 到硬件加速卡。
上面将介绍软件和硬件两种减速门路的实现形式。
三、软件减速:采纳 Intel Multi-Buffer 技术
Intel 从 whitely 平台开始退出了新的指令集,联合 intel Multi-Buffer 技术,实现对明码算法的 SIMD 优化计划。
3.1 Intel Multi-Buffer 技术
Intel Multi-buffer 基本原理就是应用 CPU 的 SIMD 机制,通过 AVX-512 指令集并行处理数据,来晋升 RSA/ECDSA 算法性能。
- SIMD (Single Instruction Multiple Data) 即单指令流多数据流,是一种采纳一个控制器来管制多个处理器,同时对一组数据(又称“数据向量”)中的每一个别离执行雷同的操作从而实现空间上的并行性的技术。简略来说就是一个指令可能同时解决多个数据。
- Multi-Buffer 技术 基于 SIMD AVX-512 指令集,通过队列和批量提交策略,联合 OpenSSL 的异步能力,每次能够最多并行处理 8 个明码算法操作。
Intel 的 Multi-Buffer 计划,实际上是对应 Intel 两个开源工程(Multi Buffer 技术实现的通用明码算法底层 lib 库),集成在 QAT Engine 里,从而实现软件减速。
图 3. Intel Engine 集成了基于 Multi-Buffer 技术的明码算法 lib
1、IP SEC lib
- 提供了 multi-buffer 技术优化的对称加解密算法,如:AES-GCM
- 开源我的项目:https://github.com/intel/intel-ipsec-mb
2、IPP CRYPTO lib
- 提供了 multi-buffer 技术优化的 RSA/EDCSA/EDCHE 算法接口,基于 Intel® Advanced Vector Extensions 512 (Intel® AVX-512) integer fused multiply-add (IFMA) 指令实现 SIMD 优化。
- 开源我的项目:https://github.com/intel/ippcrypto/tree/develop/sources/ippcp/crypto_mb
简而言之,QAT 的软件减速的实质就是通过 AVX-512 指令集进行并行处理优化,针对并发场景性能有显著晋升(下文有针对 Mult-Buffer 优化场景的性能测试)。
四、硬件加速:采纳 QAT 硬件加速卡卸载
除了通过 Multi-Buffer 技术进行软件减速外,QAT Engine 还反对 QAT 硬件加速卡,通过将明码算法的计算卸载(OffLoad)到硬件加速卡,实现性能减速。
硬件加速外围是将 TLS 中的非对称加解密操作剥离进去,放到硬件加速卡里计算,即解放了 CPU,同时专用的硬件加速卡也提供了更高的加解密性能,这是典型的硬件 OffLoad 技术计划。
下图为典型的 Nginx+ Intel QAT Software Stack + QAT 硬件加速卡的典型利用场景:
图 4. nginx+ Intel QAT Software Stack + QAT 硬件加速卡的典型利用场景(图片起源)
这个典型利用场景包含四个局部:
- Nginx(Async Mode): Intel 基于官网 nginx(version 1.18)提供了 patch,反对 nginx 工作在 openssl 的异步模式。Patch 开源在:https://github.com/intel/asynch_mode_nginx
- OpenSSL(反对 Async Mode): OpenSSL-1.1.1 新增了 async mode 个性,应用层软件能够通过规范的 openssl 接口,实现异步调用,晋升性能。
- QAT Engine: OpenSSL Engine 插件。向下和 QAT API 交互,将解决申请提交给硬件。详见我的项目开源地址:https://github.com/intel/QAT_Engine
- QAT Driver:QAT 加速卡的驱动程序。分为用户态和内核态两个局部。用户态的 lib 库提供 QAT API,内核态的 driver 则间接和 QAT 硬件加速卡打交道。
Intel QAT 依赖了 OpenSSL 的两个个性 OpenSSL Async Mode 和 OpenSSL Engine:
- OpenSSL Async Mode 可能在 async_job 执行过程中,在期待加速卡后果的时候,将 cpu 让进来;如果没有开启 async 模式,调用 openssl 函数会阻塞,cpu 会阻塞期待。
- OpenSSL Engine 则是提供了自定义注册加解密的办法,能够不应用 OpenSSL 自带的加解密库,指定调用第三方的加解密库。
基于两个个性,应用程序的加解密操作只须要放弃应用原来雷同 openssl api,只须要做异步模式的兼容。另外,能够在调用 OpenSSL 的 API 时,指定到 engine QAT 上就行,不须要做任何额定的批改,就能够应用 QAT 卡进行加解密减速。
4.1 OpenSSL 的 Async Mode 个性
通过下面的介绍,咱们能够看到 QAT 卡的实质是让一部分本来由 CPU 进行的计算转移到 QAT 卡上进行,因而进步 QAT 的利用率,升高 CPU 的切换开销和等待时间是性能最大化的外围工作。
OpenSSL 未启用异步 ASYNC 模式时,OpenSSL 调用是同步阻塞的,直到 QAT_Engine 返回后果。如下图的同步模式,在并发解决执行流的场景,大量 CPU 处于闲暇期待的状态(图中虚线示意 CPU 处于闲暇状态),无奈无效地利用 CPU。
图 5. QAT_Engine + OpenSSL 同步模式(图片起源)
OpenSSL 开启异步 ASYNC 模式后,OpenSSL 调用是非阻塞的。如下图的异步模式,openssl 的调用不须要期待 QAT_engine 的解决实现,能够无效地利用 CPU,进步 QAT 的利用率,晋升并发解决性能。
图 6. QAT_Engine + OpenSSL 异步模式(图片起源)
通过 OpenSSL 的同步和异步模式的比照,能够看到 OpenSSL-1.1.1 新增的异步 Async 个性,反对了异步非阻塞调用,进步了 QAT 的利用率,能够显著晋升加解密性能。
4.2 QAT Engine ASYNC 运行流程
接下来还有一个问题,CPU 如何晓得 QAT 卡实现了计算呢?
Async 模块为了达到并行的目标,在单线程中实现了协程(async job)。加解密操作形象为 job,多个 job 同时运行,应用协程进行调度。
在 async job 执行的过程中,当计算操作提交给 QAT 卡后,CPU 能够把当前任务暂停,切换上下文(保留 / 复原栈,寄存器等)返回给用户态。
用户态须要被动去 poll 这个 async job 的状态,是否是 ASYNC_FINISHED 状态。如果是,阐明之前的工作曾经实现,则能够持续前面的操作(取回加密 / 解密后果)。
注:QAT Engine 通过轮询来获取 QAT 卡的计算状态,基本原理是启动一个线程,不停的调用 qatdriver 的 polling api,轮训获取 qat 的计算状态,失去相应后果后,写入 eventfd,唤醒 async job。
图 7. QAT engine ASYNC 运行流程(图片起源)
如上图所示,QAT Engine Async 的根本流程为:
- 主 job 调用 SSL_accept,期待 TLS 客户端发动 TLS handshake。
- SSL 外部组织了一个状态机,将握手,读写等操作形象为两个 job,ssl_io_intern(读写), ssl_do_handshake_intern(握手), 对立通过 api ASYNC_start_job()进行 job 调度。这里启动了一个握手的 job 协程。
- 握手 job 执行 RSA_sign 签名操作时,将 sign 算法卸载到硬件上计算。调用 ASYNC_pause_job() 切回主 job, 并将 job 状态设置为 ASYNC_PAUSE, 这个时候 CPU 会交还给主 job 进行其它计算工作,同时 QAT 并行的进行本人的计算。
- 主 job 通过 SSL_waiting_for_async()接口取得的一个 eventfd,并 epoll 这个 eventfd。当 QAT 卡计算实现,会执行回调写入 eventfd,告诉主 job 计算已实现。
- 主 job 切换回握手 job,握手 job 的实现残余流程后,再调用 ASYNC_pause_job()切换主 job,并将 job 状态设置为 ASYNC_FINISH,完结协程实现握手动作。
五、QAT 性能评测
通过下面的介绍,咱们理解了 QAT 技术计划的基本原理,上面咱们看下 QAT 的理论减速成果。
QAT Multi-Buffer 减速计划,依赖的 OpenSSL、QAT Engine、ipp-crypto、Intel-ipsec-mb 软件栈都是开源我的项目,咱们能够不便的应用 openssl speed 原生加解密算法对 Multi-Buffer 计划进行性能评估。
硬件环境
- Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz
- CPU(s): 8
软件环境
- Linux Kernel: 4.19.91-24.1.al7.x86_64
- OpenSSL 1.1.1g
- gcc (GCC) 8.3.0
- cmake version 3.15.5
- NASM version 2.15.05
- GNU Binutils 2.32
- 装置 QAT Engine
- 装置 ipp-crypto、Intel-ipsec-mb 开源 lib 库
测试数据
- numactl -C 0 ./openssl speed rsa2048
- numactl -C 0 ./openssl speed -engine qatengine -async_jobs 8 rsa2048
- numactl -C 0 ./openssl speed ecdhp384
- numactl -C 0 ./openssl speed -engine qatengine -async_jobs 8 ecdhp384
- numactl -C 0 ./openssl speed aes-256-cbc
- numactl -C 0 ./openssl speed -engine qatengine -async_jobs 8 aes-256-cbc
TLS 握手阶段的签名和秘钥替换算法
- RSA 2048 sign/verify 晋升 4.9/2.9 倍
- ECDH key exchange 晋升 12 倍
对称加解密算法
- AES-256-CBC 性能持平
依据性能测试后果,QAT 的减速劣势在于 TLS 握手阶段的签名和秘钥替换算法,适宜频繁进行 TLS 建连的利用场景,比方:nginx 网关、长连贯网关等。
六、总结
本文介绍了 Intel QAT 技术计划,并探讨了计划提供的 Multi-Buffer 软件减速以及 QAT 硬件加速两种形式。同时,通过性能评估测试,咱们能够看到 QAT 技术对 TLS 握手阶段的加解密算法有显著的性能晋升。
最初,咱们讨论一下 Intel QAT 技术的优缺点和利用场景:
6.1 长处和毛病
次要的长处
- 高性能:能够显著进步计算密集型工作的性能,缩小 CPU 的负载,进步零碎吞吐量和响应速度。
- 低功耗:能够将计算密集型工作卸载到专用硬件上,升高零碎功耗,进步能效比。
次要的毛病
- 老本较高:须要额定的硬件反对,减少了零碎的老本。
- 利用范畴受限:次要实用于计算密集型工作,对于其余类型的工作可能没有显著的性能晋升。
- 不反对所有处理器:只反对 Intel 特定系列的处理器,须要特定的硬件和软件反对。
- 革新老本高:须要对应用程序进行 QAT 异步化革新,须要肯定的学习老本和技术支持。
6.2 利用场景
除了加解密算法之外,Intel QAT 还反对压缩和解压缩、随机数生成、数字签名、视频编解码等算法。Intel QAT 次要能够用于以下场景:
- 接入网关:比方 nginx 网关、长连贯网关。QAT 能够减速 TLS 协定解决,晋升网关的性能
- 虚构私人网络(VPN):QAT 能够减速 VPN 流量的加密和解密过程,进步吞吐量,缩小提早
- 存储减速:QAT 能够减速数据压缩和解压缩,缩小须要传输和存储的数据量
- 视频编解码:QAT 能够减速视频编解码算法,进步视频解决的效率和品质
总的来说,Intel QAT 能够将计算密集型工作从 CPU 中分离出来,显著进步零碎的性能和能效比,能够广泛应用于计算密集型工作的减速,包含网络安全、数据处理、云计算、存储减速、视频解决等多个畛域。
参考资料:
- Github:intel/QAT_Engine
- Intel® QuickAssist Technology (Intel® QAT)
- Intel® QuickAssist Technology & OpenSSL-1.1.0: Performance
- TLS
- Intel® Processor Architecture: SIMD InstructionsSIMD Instructions
- [openssl] openssl async 模块框架剖析