当前 TLS 已经成为了互联网安全的速技术主要传输协议
,TLS带来更高的加解决安全性的同时,也带来了更多的速技术性能开销。特别是加解决在建连握手阶段,TLS的速技术CPU开销,相对于TCP要大很多。加解决 业界在优化TLS性能上已经做了很多软件和协议层面的速技术优化
,包括 :Session 复用、加解决OCSP Stapling 、源码下载速技术TLS1.3等。加解决然而在摩尔定律"失效"的速技术今日 ,软件层面的加解决优化很难满足日益增长的流量,使用专用的速技术硬件技术卸载CPU计算成为目前通用的解决方案。本文将介绍Intel在TLS加速领域提供的加解决QAT技术方案。 Intel 提供了TLS异步加速的完整解决方案: Intel QuickAssist Technology(QAT)
,简称Intel QAT技术
。 如下图所示,免费模板QAT 支持加速的密码算法覆盖了TLS的整个流程 ,包括
:握手阶段的签名
、秘钥交换算法 ,数据传输的AES加解密算法等 。 图1. QAT 对TLS流程的密码算法的支持(图片来源) QAT提供了对称与非对称两类密码算法的支持,主要包括
: 注 :QAT加速的优势主要体现在非对称加密上,从官方的整体性能数据看
,高防服务器非对称算法性能提升1.6~2倍,对称算法性能提升10%~15% QAT Engine 是QAT技术方案的核心模块 ,主要的作用是作为应用程序和硬件之间的中间层 ,负责 “加解密操作的输入输出数据” 在用户应用程序与硬件卡之间进行传递
,主要操作就是IO的读写。 QAT Engine 是以 OpenSSL 第三方插件的方式提供给用户
,源码库这个意味用户可以使用 OpenSSL 标准的API ,就可以实现对TLS的加速,只需要对原有代码做OpenSSL异步改造,就可以享受QAT技术带来的TLS性能加速,业务侵入性较小。 图2. Intel QAT Engine 软件栈(图片来源) 如上图所示
,QAT Engine 支持两种加速方式 下面将介绍软件和硬件两种加速路径的实现方式 。 Intel 从 whitely 平台开始加入了新的指令集,香港云服务器结合intel Multi-Buffer技术,实现对密码算法的SIMD优化方案
。 Intel Multi-buffer 基本原理就是使用CPU的SIMD机制
,通过 AVX-512 指令集并行处理数据,来提升RSA/ECDSA算法性能。 Intel 的 Multi-Buffer 方案 ,实际上是对应Intel两个开源工程(Multi Buffer技术实现的通用密码算法底层lib库) ,集成在 QAT Engine 里
,从而实现软件加速。 图3. Intel Engine集成了基于Multi-Buffer技术的密码算法lib 1、IP SEC lib 2、IPP CRYPTO lib 提供了multi-buffer 技术优化的RSA/EDCSA/EDCHE算法接口,基于 Intel® Advanced Vector Extensions 512 (Intel® AVX-512) integer fused multiply-add (IFMA) 指令实现SIMD优化开源项目: 简而言之,QAT的软件加速的本质就是通过 AVX-512 指令集进行并行处理优化 ,针对并发场景性能有显著提升(下文有针对Mult-Buffer优化场景的性能测试) 。 除了通过Multi-Buffer技术进行软件加速外
,QAT Engine 还支持QAT硬件加速卡,通过将密码算法的计算卸载(OffLoad)到硬件加速卡,实现性能加速。 硬件加速核心是将TLS中的非对称加解密操作剥离出来
,放到硬件加速卡里计算
,即解放了CPU ,同时专用的硬件加速卡也提供了更高的加解密性能 ,这是典型的硬件OffLoad技术方案。 下图为典型的 Nginx+ Intel QAT Software Stack + QAT硬件加速卡的典型应用场景 : 图4. nginx+ Intel QAT Software Stack + QAT硬件加速卡的典型应用场景(图片来源) 这个典型应用场景包括四个部分: : Intel 基于官方nginx(version 1.18)提供了patch ,支持nginx工作在openssl的异步模式。 Patch开源在 : : OpenSSL Engine 插件。向下和QAT API交互,将处理请求提交给硬件
。 详见项目开源地址: Intel QAT 依赖了OpenSSL的两个特性 OpenSSL Async Mode 和 OpenSSL Engine 基于两个特性,应用程序的加解密操作只需要保持使用原来相同openssl api,只需要做异步模式的兼容。另外,可以在调用OpenSSL的API时 ,指定到engine QAT上就行
,不需要做任何额外的修改,就可以使用QAT卡进行加解密加速
。 通过上面的介绍,我们可以看到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的利用率,可以显著提升加解密性能 。 接下来还有一个问题,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的基本流程为 : 通过上面的介绍
,我们了解了QAT技术方案的基本原理
,下面我们看下QAT的实际加速效果 。 QAT Multi-Buffer 加速方案,依赖的 OpenSSL
、QAT Engine、ipp-crypto、 Intel-ipsec-mb 软件栈都是开源项目,我们可以方便的使用 openssl speed 原生加解密算法对Multi-Buffer方案进行性能评估 。 硬件环境 软件环境 测试数据 TLS 握手阶段的签名和秘钥交换算法 对称加解密算法 根据性能测试结果,QAT的加速优势在于TLS握手阶段的签名和秘钥交换算法 ,适合频繁进行TLS建连的应用场景,比如 :nginx网关 、长连接网关等。 本文介绍了 Intel QAT 技术方案
,并讨论了方案提供的Multi-Buffer软件加速以及QAT硬件加速两种方式。同时,通过性能评估测试
,我们可以看到QAT技术对TLS握手阶段的加解密算法有显著的性能提升。 最后,我们讨论一下 Intel QAT 技术的优缺点和应用场景
: 主要的优点 主要的缺点 除了加解密算法之外
,Intel QAT还支持压缩和解压缩、随机数生成 、数字签名、视频编解码等算法。Intel QAT主要可以用于以下场景:
一、加解决背景
二、Intel QuickAssist Technology(QAT)技术方案


三 、软件加速:采用 Intel Multi-Buffer 技术

四、 硬件加速:采用QAT硬件加速卡卸载




五、QAT 性能评测



六、总结