- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
作者: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 提供了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% 。
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 从 whitely 平台开始加入了新的指令集,结合intel Multi-Buffer技术,实现对密码算法的SIMD优化方案.
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优化场景的性能测试).
除了通过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卡进行加解密加速.
通过上面的介绍,我们可以看到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的基本流程为:
主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 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 技术的优缺点和应用场景:
主要的优点 。
高性能 :可以显著提高计算密集型任务的性能,减少 CPU 的负载,提高系统吞吐量和响应速度.
低功耗 :可以将计算密集型任务卸载到专用硬件上,降低系统功耗,提高能效比.
主要的缺点 。
成本较高 :需要额外的硬件支持,增加了系统的成本.
应用范围受限 :主要适用于计算密集型任务,对于其他类型的任务可能没有显著的性能提升.
不支持所有处理器 :只支持Intel特定系列的处理器,需要特定的硬件和软件支持.
改造成本高 :需要对应用程序进行QAT异步化改造,需要一定的学习成本和技术支持.
除了加解密算法之外,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模块框架分析 。
最后此篇关于TLS加速技术:IntelQuickAssistTechnology(QAT)解决方案的文章就讲到这里了,如果你想了解更多关于TLS加速技术:IntelQuickAssistTechnology(QAT)解决方案的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
是否可以使用 OpenSSL 或其他工具通过 TLS 建立 TLS 连接? 如果可能,每个级别的证书是否需要不同? 最佳答案 这在理论上应该工作得很好,但我不能确定 OpenSSL 或其他东西是否会轻
在我的 java 代码中,我正在使用命令创建 SSL 上下文的一个实例 SSLContext ctx = SSLContext.getInstance("TLS"); 但是在我的 tomcat 服务器
在我的 java 代码中,我正在使用命令创建一个 SSL 上下文实例 SSLContext ctx = SSLContext.getInstance("TLS"); 但在我的 tomcat 服务器中,
范围:这是一个具有一个 channel 的网络,该 channel 由 3 个组织组成,每个组织 1 个 anchor 节点,每个组织 1 个 CA 和每个组织 1 个 MSP。 我在我的 Hyper
无法找到用于在 iis 上启用/禁用 tls 的特定设置。启用/禁用 ssl 是否与启用/禁用 tls 相同? 我浏览了一些博客,发现 SSL 是 TLS 的前身,旧版本的 SSL 已被弃用。但我无法
最近,我一直在为基于物联网的项目评估不同的 API 网关 (API GW) 选项。这样做的目的是找到一个足够好的解决方案来执行设备和 API GW 的相互 TLS (mTLS) 身份验证。 我尝试过的
几个月来,我的 Web 应用程序在不同版本的 IE/Firefox/Chrome 上运行良好。我的应用程序在 IIS 10.0 上运行。当我从 Windows 7 框 (IE 11.0.***) 中点
我有一个在 Java 7 上运行的 HTTPS 网络服务。我需要进行更改,以便此服务仅接受 TLS1.2 连接并拒绝 SSL3、TLS1.0 和 TLS1.1。 我添加了以下 Java 参数,使 TL
我在资源管理器不显示网站时遇到问题:“无法显示此页面。在高级设置中打开 TLS 1.0、TLS 1.1 和 TLS 1.2”。 我在 chrome 中调试了证书并说“连接是使用 aes_128_cbc
我正在与 5 个订购者、1 个组织和 2 个同行建立我的网络。还有 1 个 cli 和 1 个 ca。 我从 1 个排序者扩展到 5 个实现 Raft 的排序者。这就是为什么我想扩展我的网络并对多个对
当k8s集群开启了TLS认证后,每个节点的kubelet组件都要使用由kube-apiserver的CA签发的有效证书才能与kube-apiserver通信;当节点非常多的时候,为每个节点都单独签署证
我正在尝试使用 pjsip 安装中的 pjsua 程序在两个虚拟机之间进行安全调用。我通过以下方式在每个节点上启动程序: pjsua-x86_64-unknown-linux-gnu --use-tl
我开发的软件应用程序使用 gRPC 在客户端和服务器之间建立双向流。 我只在 java 中寻找类似于这张票的答案的东西:How to enable server side SSL for gRPC?
我正在尝试调试与 TLS 相关的问题。TLS 在两个应用程序客户端 A 和服务器 B 之间设置。A 和 B 都交换了证书,我已经验证证书具有正确的扩展名,并且还通过其根 CA 成功验证。叶证书的根 C
“Java 1.7 TLS 1.1 服务器”和“Java 1.8 客户端”之间的 SSL/TLS 握手在我的环境中失败,服务器端出现以下异常: java.security.NoSuchAlgorith
我正在尝试了解 Docker ,但我不断收到神秘的(对我而言)错误消息。 可能最简单的例子是尝试打印我安装的 Docker 版本: $ sudo docker version Client versi
这是我第一次使用 Amazon Lighsail、Wordpress Multisite、Bitnami甚至使用 Let's Encrypt;现在似乎一切正常,除了我的虚拟主机文件中的 SSL 指令。
我有一个 MariaDB "M"。在同一台机器上有一个应用程序“A”,它可以访问它。在不同的服务器上,另一个应用程序“B”也在访问它。 现在我想在 MariaDB 上启用 TLS 以保护连接 B ->
我正在寻找通过代理连接到一些 HTTPS/TLS 站点,其中到代理本身的连接也是通过 HTTPS/TLS 建立的,来自一个高度依赖请求的 python 应用程序。 urllib3(因此 request
现在我正在努力改变 EMQtt 和 Erlang MQTT 代理,以便我可以使用预共享 key 而不是非对称方法执行 TLS 握手。 到目前为止,我几乎遍历了源代码中的每个文件,但找不到任何加密函数。
我是一名优秀的程序员,十分优秀!