前言
openssl中的加解密运算非常消耗cpu,会导致nginx的ssl连接数跟不上,现阶段大多数利用intel QAT加密卡实现openssl的异步机制,让耗时的加解密运算在加密卡中执行。本文利用密码机通过网络实现异步。
一、openssl的异步机制为什么快
nginx建立ssl连接的大致流程如下
nginx在同步模式下建立ssl连接要经历以上五个步骤。其中3密码运算非常消耗cpu,传统的多线程机制不起作用。如果利用异步模式就能让密码运算在密码机的cpu中进行运算,负责建立nginx连接的cpu只用处理1 2 4 5这四个阶段,所以nginx建立ssl的连接效率就会大大增加。
二、实现openssl异步的接口
##引擎所需接口
// 拿到当前的job
ASYNC_JOB *ASYNC_get_current_job(void);
// 通过job拿到对应的ctx,
ASYNC_WAIT_CTX *ASYNC_get_wait_ctx(ASYNC_JOB *job);
#获得注册到ctx中的fd和custom_data
int ASYNC_WAIT_CTX_get_fd(ASYNC_WAIT_CTX *ctx, const void *key,
OSSL_ASYNC_FD *fd, void **custom_data);
#注册fd和custom_data到ctx中,一般注册管道的读端
ASYNC_WAIT_CTX_set_wait_fd(ASYNC_WAIT_CTX *ctx, const void *key,
OSSL_ASYNC_FD *fd, void **custom_data, cleanup);
#将数据包发送给密码机后协程切换到最开始状态
ASYNC_pause_job();
#ssl所需接口
// 创建
ASYNC_WAIT_CTX *ASYNC_WAIT_CTX_new(void);
// 销毁
void ASYNC_WAIT_CTX_free(ASYNC_WAIT_CTX *ctx
//开启一个协程执行func
int ASYNC_start_job(ASYNC_JOB **job, ASYNC_WAIT_CTX *ctx, int *ret,
int (*func)(void *), void *args, size_t size);
#nginx所需要接口
//从ctx中获取注册的fd,并进行监听
int ASYNC_WAIT_CTX_get_all_fds(ASYNC_WAIT_CTX *ctx, OSSL_ASYNC_FD *fd, size_t *numfds);
int ASYNC_WAIT_CTX_get_changed_fds(ASYNC_WAIT_CTX *ctx, OSSL_ASYNC_FD *addfd,
size_t *numaddfds, OSSL_ASYNC_FD *delfd,
size_t *numdelfds);
三、利用密码机实现openssl的异步机制
一个协程---------一个job-------ctx--------存放一个协程数据的对象(pipefd)
总结
openssl异步机制利用协程,需要配合异步加密卡,或者通过网络连接密码机来进行实现,通过将耗时的加解密运算丢给密码机,能够大大提高ssl握手连接数。