充分利用硬件加速器

Fully utilizing HW accelerator

我想使用 OpenSSL 来处理我们所有的 SSL 通信(客户端和服务器端)。我们想使用硬件加速卡来卸载繁重的密码计算。

我们注意到在 OpenSSL 'speed' 测试中,有对加密函数的直接调用(例如 RSA_sign/decrypt 等)。为了充分利用 HW 容量,需要多个线程(最多 128 个线程)来向卡加载请求并确保 HW 卡永远不会空闲。

我们想使用高级 OpenSSL API 来处理 SSL 连接(例如 SSL_connect/read/write/accept),但是这个 API 没有暴露实际加密操作的地方已经完成了。例如,当调用 SSL_connect 时,我们不知道 RSA 操作的完成点,并且我们事先不知道哪些调用会导致繁重的密码计算,并且仅将那些调用给加速器。

问题:

  1. 如何在充分利用硬件加速器的同时使用高级API?我应该使用多线程吗?
  2. 有没有 'standard' 方法可以做到这一点? (实现示例)
  3. (已在更新中回答)您熟悉英特尔的 asynchronous OpenSSL 吗?看起来他们正试图解决这个确切的问题,但我们找不到实际的代码或使用示例。

更新

  1. Accelerating OpenSSL* Using Intel® QuickAssist Technology可以看出,Intel也提到了利用多个threads/processes:

    The standard release of OpenSSL is serial in nature, meaning it handles one connection within one context. From the point of view of cryptographic operations, the release is based on a synchronous/ blocking programming model. A major limitation is throughput can be scaled higher only by adding more threads (i.e., processes) to take advantage of core parallelization, but this will also increase context management overhead.

  2. Intel的OpenSSL分支终于找到了here。 可以在包含 here.

    的 pdf 中找到更多信息

    看起来 Intel 改变了 OpenSSL ENGINE 的工作方式 - 它将工作发布到驱动程序并立即 returns,同时应该轮询相应的结果。

    如果使用其他SSL加速器,对应的OpenSSL ENGINE也要修改。

作为jww has mentioned in the comments, you should use the engine API完成任务。上面 link 中有一个关于如何使用那个 API 的例子。通常,硬件加速器提供程序会实现一个名为 "ENGINE" 的库,该引擎提供加密加速功能,可供 OpenSSL 在内部使用。假设您要使用的加速器实现了 ENGINE(例如 "cswitft"),您应该通过调用 ENGINE *e = ENGINE_by_id("cswift"); 获取引擎,然后将其初始化 ENGINE_init(e); 并将其设置为默认值您要使用的操作,例如 ENGINE_set_default_RSA(e);

调用这些函数后,就可以使用OpenSSL的高级API(例如SSL_connect/read/write/accept

根据 Interpreting openssl speed output for rsa with multi option-multi 没有 "parallelize" 工作什么的,它只是并行运行多个基准测试。

因此,您的 HW 卡的负载基本上会受到当前可用工作量的限制(请注意,在一般行业中,80% 的计划容量负载传统上被认为是负载峰值情况下的最佳选择)。当然,运行 多个服务器 threads/processes 会给你与多个基准测试相同的效果。

OpenSSL supports multiple threads provided that you give it callbacks to lock shared data. For multiple processes, it warns about reusing data state 从父级继承。

这就是垂直缩放。对于水平缩放:

  • openssl 通过异步 BIO
  • 支持异步 I/O
  • 但是,它的基本加密操作和内部 ENGINE 调用是同步的,改变这一点需要逻辑大修
  • 由于主要设计缺陷
  • ,私人努力使他们提供异步操作have met severe criticism

英特尔 announced some "Asynchronous OpenSSL" project (08.2014) to use with its hardware, but the linked white paper gives little details about its implementation and development state. One developer published some related code (10.2015),注意它是 "stable enough to get an overview"。