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

参考 

​​​​​​​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异步的技术堆栈图

nginx 异步openssl Intel QAT硬件加速方案_第1张图片

为什么选择异步?

为了有效地使用加速功能,需要一种机制,允许应用程序在等待英特尔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。

nginx 异步openssl Intel QAT硬件加速方案_第2张图片

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

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

nginx 异步openssl Intel QAT硬件加速方案_第3张图片

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

nginx 异步openssl Intel QAT硬件加速方案_第4张图片

流水线允许引擎在单个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相关的东西全部系统性的整理出来。

你可能感兴趣的:(网络安全,nginx开发学习汇总,nginx,openssl,intel,网络优化)