nginx 异步openssl Intel QAT硬件加速方案

本文详细介绍了如何在CentOS 7中安装QAT 1.7加速器,配合Intel QuickAssist Technology和OpenSSL实现异步加密,包括异步处理流程、性能提升案例及QAT Engine的配置步骤。重点展示了异步模式对SSL连接处理的优化效果和性能提升实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考 

​​​​​​​CentOS7安装QAT 1.7加密卡_Remy的学习记录-CSDN博客

GitHub - intel/QAT_Enginehttps://01.org/sites/default/files/downloads/intelr-quickassist-technology/337003-001-intelquickassisttechnologyandopenssl-110.pdfhttps://01.org/sites/default/files/downloads/intelr-quickassist-technology/337003-001-intelquickassisttechnologyandopenssl-110.pdf

Intel QuickAssist简介

通过内核空间中的设备驱动程序和用户空间中的库访问qat技术加速器。加密服务通过标准引擎框架提供给openssl。引擎构建在用户空间库之上,qat api接口跨版本无需修改。这种分层和与openssl框架的集成允许应用程序无缝利用。将异步支持添加到openssl-1.1.0中意味着应用程序还可以使用标准化API驱动更高级别的性能。

ASYNC_JOB结构构建在许多原语上(在执行过程中不被打断),以允许创建和管理轻量级执行上下文。添加到openssl-1.1.0提供了创建和管理异步作业所需的所有功能(类似协程),但没有主动管理这些资源。管理留给利用此功能的用户代码。

从逻辑上讲,ASYNC_JOB 结构作为openssl-1.1.0中加密复合体的一部分实现,即libcrypto,并由TLS堆栈使用。这允许应用程序继续以与以前相同的方式使用众所周知的openssl api,在应用程序中尽可能利用异步作业。ASYNC_JOB是openssl-1.1.0中可公开访问的API,因此,应用程序也可以直接与EVP API结合使用,或通过openssl-1.1.0 api间接使用。

qat+nginx+openssl异步的技术堆栈图

为什么选择异步?

为了有效地使用加速功能,需要一种机制,允许应用程序在等待英特尔QAT加速器完成未完成的操作时继续执行。该编程模型与非阻塞Berkeley软件分发(BSD)套接字非常相似。操作在主应用程序的上下文之外执行,允许应用程序在加速器并行处理操作时充分利用可用的处理器周期。此功能由应用程序控制,应用程序必须更新以支持异步行为,因为它最了解何时调度每个TLS连接。

异步处理流程

第一次SSL_accept 1th调用。当应用程序将TLS连接标识为具有异步功能时,标准openssl调用将获取异步作业上下文,从而允许堆栈的底层暂停执行,在本例中,在qat引擎中。

这将导致函数返回到应用程序,并显示错误状态SSL_ERROR_WANT_ASYNC。

然后,应用程序可以注册与此TLS连接关联的文件描述符(fd),并使用标准epoll/select/poll调用等待响应的可用性。

一旦应用程序收到通知,它就可以使用该TLS连接再次调用相关的openssl api 第二次SSL_accept 2nd,从而完成响应处理。

或者应用程序可以放弃使用fd和事件通知,而不是在返回成功响应之前连续调用openssl api。

在因特尔官方文档web服务器的异步优势中提到,openssl 1.1.0以上版本支持了异步,结合intel quickassist技术和nginx* 1.0负载平衡,增加了5.6倍连接数处理,相同配置情况下3.9倍于同步调用。

openssl异步处理和同步处理流程:

以卸载TLS1.2 RSA为例,对比openssl、qat+openssl同步、qat+openssl异步每秒连接数。

流水线允许引擎在单个TLS连接上并行执行多个对称加密操作,从而提高批量传输的吞吐量。当为TLS上下文启用管道时,每个SSL_写入操作的输入缓冲区被拆分为多个独立记录,引擎可以同时处理这些记录。然后,操作结果以正确的顺序写入套接字,这对客户端是透明的。在有足够数据可用的情况下,还支持备用方向(SSL_读取)。

安装

QAT_Engine-0.6.10.tar.gz

cd QAT_Engine-0.6.10/qat_contig_mem

# make

# make load

# make test

cd QAT_Engine-0.6.10

# ./configure --with-qat_dir=/tmp/QAT\

--with-openssl_dir=/root/openssl-1.1.1g\

--with-openssl_install_dir=/usr/lib64/ssl\

--enable-upstream_driver \

--enable-usdm

# make

# make install
 

# cp /path/to/QAT_Engine-0.6.10/qat/config/c6xx/multi_process_event-driven_optimized/*/etc

# service qat_servicestop

# service qat_servicestart

安装qat1.7驱动

KVM虚拟机网卡和QAT SR-IOV 配置要点 - 简书

Intel® QuickAssist Technology (Intel® QAT) Driver for Linux* for Intel® Server Boards and Systems Based on Intel® 62X Chipset

 cd /root/QAT

 ./configure

 make

 make install

安装openssl-1.1.1g

 cd /root/openssl-1.1.1g

 ./config --prefix=/root/openssl-1.1.1g/.openssl  -Wl,-rpath,\${LIBRPATH}

 make depend

 make

 make install

//指定openssl安装目录下的lib

export OPENSSL_ENGINES=/root/openssl-1.1.1b/.openssl/lib/engines-1.1

//指定openssl安装目录下的lib

export  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64:/root/openssl-1.1.1b/.openssl/lib:/root/openssl-1.1.1b/.openssl/lib/engines-1.1/  

//指定openssl源路径

 export PERL5LIB=$PERL5LIB:/root/openssl-1.1.1b

 export OPENSSL_CONF=/root/openssl-1.1.1b/.openssl/ssl/openssl.cnf

安装qat_config_mem

 cd /root/QAT_Engine/qat_contig_mem/

 make

 make load

 make test (Hello world!)

安装QAT_Engine

 cd /root/QAT_Engine

 ./autogen.sh

 ./configure \

 --with-qat_dir=/root/QAT \

 --with-openssl_dir=/root/openssl-1.1.1b\

 --with-openssl_install_dir=/root/openssl-1.1.1b/.openssl \

 --enable-upstream_driver \

 --enable-usdm

 make

 make install

qat Engine加载

# cd /root/openssl-1.1.1b/apps

# ./openssl engine -t -c-vvvv qat

(qat) Reference implementation of QAT crypto engine
 [RSA, DSA, DH, AES-128-CBC-HMAC-SHA1, AES-128-CBC-HMAC-SHA256, AES-256-CBC-HMAC-SHA1, AES-256-CBC-HMAC-SHA256, TLS1-PRF]
     [ available ]
     ENABLE_EXTERNAL_POLLING: Enables the external polling interface to the engine.
          (input flags): NO_INPUT
     POLL: Polls the engine for any completed requests
          (input flags): NO_INPUT
     SET_INSTANCE_FOR_THREAD: Set instance to be used by this thread
          (input flags): NUMERIC
     GET_NUM_OP_RETRIES: Get number of retries
          (input flags): NO_INPUT
     SET_MAX_RETRY_COUNT: Set maximum retry count
          (input flags): NUMERIC
     SET_INTERNAL_POLL_INTERVAL: Set internal polling interval
          (input flags): NUMERIC
     GET_EXTERNAL_POLLING_FD: Returns non blocking fd for crypto engine
          (input flags): NO_INPUT
     ENABLE_EVENT_DRIVEN_POLLING_MODE: Set event driven polling mode
          (input flags): NO_INPUT
     GET_NUM_CRYPTO_INSTANCES: Get the number of crypto instances
          (input flags): NO_INPUT
     DISABLE_EVENT_DRIVEN_POLLING_MODE: Unset event driven polling mode
          (input flags): NO_INPUT
     SET_EPOLL_TIMEOUT: Set epoll_wait timeout
          (input flags): NUMERIC
     SET_CRYPTO_SMALL_PACKET_OFFLOAD_THRESHOLD: Set QAT small packet threshold
          (input flags): STRING
     ENABLE_INLINE_POLLING: Enables the inline polling mode.
          (input flags): NO_INPUT
 [ available ]
     ENABLE_EXTERNAL_POLLING: Enables the external polling interface to the engine.
          (input flags): NO_INPUT
     POLL: Polls the engine for any completed requests
          (input flags): NO_INPUT
     SET_INSTANCE_FOR_THREAD: Set instance to be used by this thread
          (input flags): NUMERIC
     GET_NUM_OP_RETRIES: Get number of retries
          (input flags): NO_INPUT
     SET_MAX_RETRY_COUNT: Set maximum retry count
          (input flags): NUMERIC
     SET_INTERNAL_POLL_INTERVAL: Set internal polling interval
          (input flags): NUMERIC
     GET_EXTERNAL_POLLING_FD: Returns non blocking fd for crypto engine
          (input flags): NO_INPUT
     ENABLE_EVENT_DRIVEN_POLLING_MODE: Set event driven polling mode
          (input flags): NO_INPUT
     GET_NUM_CRYPTO_INSTANCES: Get the number of crypto instances
          (input flags): NO_INPUT
     DISABLE_EVENT_DRIVEN_POLLING_MODE: Unset event driven polling mode
          (input flags): NO_INPUT
     SET_EPOLL_TIMEOUT: Set epoll_wait timeout
          (input flags): NUMERIC
     SET_CRYPTO_SMALL_PACKET_OFFLOAD_THRESHOLD: Set QAT small packet threshold
          (input flags): STRING
     ENABLE_INLINE_POLLING: Enables the inline polling mode.
          (input flags): NO_INPUT

service qat_service restart

lsmod | grep qat

service qat_service status

rsa2048 性能测试

./openssl speed -engine qat -elapsed -multi [num] -async_jobs [num] rsa2048

进程数

加密算法

异步

实例数

sign/s

verify/s

8

rsa2048

72

101860.5

882608.9

8

rsa2048

72

17362.0

110056.6

nginx async patch

GitHub - intel/asynch_mode_nginx

阿里七层流量入口 Tengine硬件加速探索之路 - 知乎

其实还有很多东西需要补充,后续会把qat相关的东西全部系统性的整理出来。

### 构建任务失败解决方案 当遇到 `Execution failed for task ':app:shrinkReleaseRes'` 错误时,这通常意味着资源压缩过程中出现了问题。此错误可能由多种原因引起,包括但不限于配置不正确、依赖冲突或特定于项目的其他因素。 #### 可能的原因分析 1. **ProGuard 或 R8 配置不当** ProGuard 和 R8 是用于优化和混淆代码以及减少 APK 大小的工具。如果这些工具的配置存在问题,可能会导致资源无法正常处理[^1]。 2. **重复资源** 如果项目中有多个模块定义了相同的资源名称,可能导致冲突并引发该错误。检查是否存在重名的 drawable、string 等资源文件[^2]。 3. **第三方库兼容性** 某些第三方库可能与当前使用的 Gradle 插件版本或其他库存在兼容性问题,从而影响到资源打包过程中的行为[^3]。 4. **Gradle 缓存问题** 有时旧缓存数据会干扰新编译的结果,尝试清理本地仓库和重新同步项目可以帮助排除此类潜在障碍[^4]。 #### 推荐的操作方法 为了有效解决问题,建议按照以下步骤逐一排查: ```bash # 清理项目构建目录 ./gradlew clean # 删除 .gradle 文件夹下的所有内容以清除缓存 rm -rf ~/.gradle/caches/ ``` 调整 `build.gradle` 中的相关设置也是一个重要环节: ```groovy android { ... buildTypes { release { minifyEnabled true // 是否启用代码缩减 shrinkResources true // 是否开启资源压缩 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' // 尝试禁用 shrinkResources 来测试是否为资源压缩引起的错误 // shrinkResources false } } } ``` 此外,在 `proguard-rules.pro` 文件内添加必要的保留规则,防止关键类被意外移除: ```text -keep class com.example.yourpackage.** { *; } # 替换为你自己的包路径 -dontwarn androidx.**,com.google.** # 忽略警告信息 ``` 最后,确保所使用的 Android Studio 版本是最新的稳定版,并且已经应用了所有的补丁更新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值