这周工作遇到一个超越原先认知范围的问题,今天下午开始写这篇博文之前依然束手无策,但就刚刚被别部门给力的队友解决了!今天所写的技术都是出初步接触,所以如果有大神直接使用过OpenSSL的异步模式去对接QAT engine进行RSA解密或者gzip等密集计算的(尤其是多线程使用),跪求出来指点与指正~
一、问题综述
我们Workflow作为一个性能优异的异步调度框架,用作server可以对标的系统之一就是nginx这样的接入,而且与nginx的事件编程与形如http模块拆分11个阶段的这种反人类设计比起来,我们的任务概念是非常容易上手开发的。那么,nginx可以做的事情,我们都可以做吗?
那是必吁~的!
比如,这周遇到的一个用户场景:
OpenSSL的解密一旦遇到高并发接入,这种密集计算串行执行起来是非常慢的。但是业内一般都有更好的解决方案,以下是其中一种:首先,Intel有个QAT加速卡,可以作为外接设备进行密集计算的提速,因为其用于RSA解密比较多,所以Intel给它做了个对接于OpenSSL异步调度engine;
于是也需要异步操作OpenSSL。它提供了ASYNC_start_job的机制去获取一个job及注册回调函数(在开始后和结束时都会被调起,由使用者根据状态决定做什么行为),然后如果正在IO,状态就会变成PAUSE;并且你可以拿到fd,用你喜欢的方式去监听它。等这个PAUSE状态变回SUCCESS了,会通知你计算完成;
由于存在状态,因此我们需要在应用层保存上下文和监听fd和做具体读写,这就是nginx做的事情:nginx作为一个支持tls的server,Intel为其提供了框架的patch和模块去支持ssl的异步上下文和增删事件到epoll的步骤,具体的nginx模块也实现了读写事件回来之后的回调函数。
于是,nginx可以通过OpenSSL的异步模式调用QAT的加速卡从而实现异步高效高并发的解密计算。其实不止nginx,所有做接入的系统都应该做到这件事,比如阿里的Tengine等,当然也包括我们的Workflow。
这里涉及了三个层次,自底向上介绍一下各个层次吧,然后我们才能知道上层可以依赖下层做什么事情。
二、Intel QAT加速卡与QAT Engine
QAT加速卡全名是QuickAssist Technology,它在硬件层面实现了密集计算的并行优化,按层次看包括具体的设备(device)、内核态的驱动(driver)、用户态调用的库(library)、以及访问这个库的api、最后就是按照OpenSSL的接口封装了一个engine。