您现在的位置是:IT资讯 >>正文
TLS 加速技术:Intel QuickAssist Technology(QAT)解决方案
IT资讯3人已围观
简介一、背景当前 TLS 已经成为了互联网安全的主要传输协议,TLS带来更高的安全性的同时,也带来了更多的性能开销。特别是在建连握手阶段,TLS的CPU开销,相对于TCP要大很多。业界在优化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-mb2 、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_nginxOpenSSL(支持Async Mode): OpenSSL-1.1.1 新增了async mode 特性,应用层软件可以通过标准的openssl接口 ,实现异步调用,提升性能。QAT Engine: OpenSSL Engine 插件。向下和QAT API交互 ,将处理请求提交给硬件。
详见项目开源地址:
https://github.com/intel/QAT_EngineQAT 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.70GHzCPU(s): 8软件环境
Linux Kernel: 4.19.91-24.1.al7.x86_64OpenSSL 1.1.1ggcc (GCC) 8.3.0cmake version 3.15.5NASM version 2.15.05GNU Binutils 2.32安装 QAT Engine安装ipp-crypto 、 Intel-ipsec-mb 开源lib库测试数据
numactl -C 0 ./openssl speed rsa2048numactl -C 0 ./openssl speed -engine qatengine -async_jobs 8 rsa2048


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主要可以用于以下场景:
接入网关