TLS 加速技术:Intel QuickAssist Technology(QAT)解决方案

科技资讯 投稿 10200 0 评论

TLS 加速技术:Intel QuickAssist Technology(QAT)解决方案

本文介绍了 Intel QAT 技术方案,通过Multi-Buffer技术和QAT硬件加速卡的两种方式实现对TLS的加速

一、背景

业界在优化TLS性能上已经做了很多软件和协议层面的优化,包括:Session 复用、OCSP Stapling、TLS1.3等。然而在摩尔定律"失效"的今日,软件层面的优化很难满足日益增长的流量,使用专用的硬件技术卸载CPU计算成为目前通用的解决方案。本文将介绍Intel在TLS加速领域提供的QAT技术方案。

二、Intel QuickAssist Technology(QAT)技术方案

如下图所示,QAT 支持加速的密码算法覆盖了TLS的整个流程,包括:握手阶段的签名、秘钥交换算法,数据传输的AES加解密算法等。

图1. QAT 对TLS流程的密码算法的支持(图片来源)

    非对称加密算法:RSA, ECDSA, ECDHE

  1. 对称加密算法:AES-GCM(128,192,256) 

2.1 QAT Engine 软件栈

QAT Engine 是QAT技术方案的核心模块,主要的作用是作为应用程序和硬件之间的中间层,负责 “加解密操作的输入输出数据” 在用户应用程序与硬件卡之间进行传递,主要操作就是IO的读写。

图2. Intel 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 技术

    SIMD (Single Instruction Multiple Data) 即单指令流多数据流,是一种采用一个控制器来控制多个处理器,同时对一组数据(又称“数据向量”)中的每一个分别执行相同的操作从而实现空间上的并行性的技术。简单来说就是一个指令能够同时处理多个数据。

  • Multi-Buffer 技术基于SIMD AVX-512指令集,通过队列和批量提交策略,结合OpenSSL的异步能力,每次可以最多并行处理8个密码算法操作。

图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硬件加速卡卸载

除了通过Multi-Buffer技术进行软件加速外,QAT Engine 还支持QAT硬件加速卡,通过将密码算法的计算卸载(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

  1. OpenSSL(支持Async Mode):  OpenSSL-1.1.1 新增了async mode 特性,应用层软件可以通过标准的openssl接口,实现异步调用,提升性能。

  2. QAT Engine:   OpenSSL Engine 插件。向下和QAT API交互,将处理请求提交给硬件。详见项目开源地址:https://github.com/intel/QAT_Engine

  3. QAT Driver:QAT加速卡的驱动程序。分为用户态和内核态两个部分。用户态的lib库提供QAT API,内核态的driver则直接和QAT硬件加速卡打交道。

    OpenSSL Async Mode 能够在 async_job 执行过程中,在等待加速卡结果的时候,将 cpu 让出去;如果没有开启 async 模式,调用 openssl 函数会阻塞,cpu会阻塞等待。

  • OpenSSL Engine 则是提供了自定义注册加解密的方法,可以不使用 OpenSSL 自带的加解密库,指定调用第三方的加解密库。

基于两个特性,应用程序的加解密操作只需要保持使用原来相同openssl api,只需要做异步模式的兼容。另外,可以在调用OpenSSL的API时,指定到engine QAT上就行,不需要做任何额外的修改,就可以使用QAT卡进行加解密加速。

4.1 OpenSSL 的Async Mode特性

OpenSSL 未启用异步ASYNC模式时,OpenSSL 调用是同步阻塞的,直到QAT_Engine返回结果。如下图的同步模式,在并发处理执行流的场景,大量CPU处于空闲等待的状态(图中虚线表示CPU处于空闲状态),无法有效地利用CPU。

图5. QAT_Engine + OpenSSL 同步模式(图片来源)

图6. QAT_Engine + OpenSSL 异步模式(图片来源)

4.2 QAT Engine ASYNC运行流程

接下来还有一个问题,CPU 如何知道 QAT 卡完成了计算呢? 

在async job执行的过程中,当计算操作提交给QAT卡后,CPU可以把当前任务暂停,切换上下文(保存/恢复栈,寄存器等)返回给用户态。

注:QAT Engine 通过轮询来获取QAT卡的计算状态,基本原理是启动一个线程,不停的调用qatdriver的polling api,轮训获取qat的计算状态,得到相应结果后,写入eventfd,唤醒async job。

图7. QAT engine ASYNC运行流程(图片来源)

    主job调用 SSL_accept,等待 TLS客户端发起 TLS handshake。

  1. SSL内部组织了一个状态机,将握手,读写等操作抽象为两个job,ssl_io_intern(读写), ssl_do_handshake_intern(握手), 统一通过api ASYNC_start_job()进行job调度。这里启动了一个握手的job协程。

  2. 握手job执行 RSA_sign签名操作时,将sign算法卸载到硬件上计算。调用 ASYNC_pause_job()  切回主job, 并将job状态设置为ASYNC_PAUSE, 这个时候CPU会交还给主job进行其它计算工作,同时QAT并行的进行自己的计算。

  3. 主job通过SSL_waiting_for_async()接口获得的一个eventfd,并epoll这个eventfd。当QAT卡计算完成,会执行回调写入eventfd,通知主job计算已完成。

  4. 主job切换回握手job,握手job的完成剩余流程后,再调用ASYNC_pause_job()切换主job,并将job状态设置为ASYNC_FINISH,结束协程完成握手动作。

五、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 性能持平

六、总结

本文介绍了 Intel QAT 技术方案,并讨论了方案提供的Multi-Buffer软件加速以及QAT硬件加速两种方式。同时,通过性能评估测试,我们可以看到QAT技术对TLS握手阶段的加解密算法有显著的性能提升。

6.1 优点和缺点

主要的优点

    高性能:可以显著提高计算密集型任务的性能,减少 CPU 的负载,提高系统吞吐量和响应速度。

  • 低功耗:可以将计算密集型任务卸载到专用硬件上,降低系统功耗,提高能效比。

主要的缺点

    成本较高:需要额外的硬件支持,增加了系统的成本。

  • 应用范围受限:主要适用于计算密集型任务,对于其他类型的任务可能没有显著的性能提升。

  • 不支持所有处理器:只支持Intel特定系列的处理器,需要特定的硬件和软件支持。

  • 改造成本高:需要对应用程序进行QAT异步化改造,需要一定的学习成本和技术支持。

6.2 应用场景

    接入网关:比如nginx网关、长连接网关。QAT可以加速TLS协议处理,提升网关的性能

  • 虚拟私人网络(VPN):QAT 可以加速 VPN 流量的加密和解密过程,提高吞吐量,减少延迟

  • 存储加速:QAT 可以加速数据压缩和解压缩,减少需要传输和存储的数据量

  • 视频编解码:QAT 可以加速视频编解码算法,提高视频处理的效率和质量

参考资料:

    Github:intel/QAT_Engine

  1. Intel® QuickAssist Technology (Intel® QAT)

  2. Intel® QuickAssist Technology & OpenSSL-1.1.0: Performance

  3. TLS

  4. Intel® Processor Architecture: SIMD InstructionsSIMD Instructions

  5. [openssl] openssl async模块框架分析

编程笔记 » TLS 加速技术:Intel QuickAssist Technology(QAT)解决方案

赞同 (43) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽