充分利用硬件加速器

dim*_*mba 9 performance ssl multithreading openssl hardware-acceleration

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

我们注意到在OpenSSL"速度"测试中,可以直接调用加密函数(例如RSA_sign/decrypt,等等).为了充分利用硬件容量,需要多个线程(最多128个线程),这些线程会根据请求加载卡,并确保硬件卡永远不会空闲.

我们希望使用高级OpenSSL API来处理SSL连接(例如SSL_connect/read/write/accept),但是这个API没有公开实际加密操作的位置.例如,在调用时SSL_connect,我们不知道RSA操作完成的点,并且我们事先不知道哪些调用将导致严重的加密计算并且仅将那些调用引用到加速器.

问题:

  1. 如何在充分利用硬件加速器的同时使用高级API?我应该使用多个线程吗?
  2. 有这种"标准"方式吗?(实施例)
  3. (更新时回答)您熟悉英特尔的异步OpenSSL吗?他们似乎试图解决这个问题,但我们找不到实际的代码或用法示例.

UPDATE

  1. 加速OpenSSL*使用英特尔®QuickAssist技术,您可以看到,英特尔还提到了多线程/进程的使用:

    OpenSSL的标准版本本质上是串行的,这意味着它在一个上下文中处理一个连接.从加密操作的角度来看,该发布基于同步/阻塞编程模型.一个主要的限制是吞吐量只能通过添加更多线程(即进程)来扩展,以利用核心并行化,但这也会增加上下文管理开销.

  2. 英特尔的OpenSSL分支终于在这里找到.更多信息可以在这里包含的pdf中找到.

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

    如果使用其他SSL加速器,则也应修改相应的OpenSSL ENGINE.

iva*_*eev 3

根据Interpreting openssl speed output for rsa with multi option-multi不会“并行化”工作或其他东西,它只是并行运行多个基准测试。

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

OpenSSL支持多线程,前提是您提供回调来锁定共享数据。对于多个进程,它会警告重用从父进程继承的数据状态

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

  • openssl通过异步 BIO 支持异步 I/O
  • 但是,它的基本加密操作和内部 ENGINE 调用是同步的,改变这一点需要进行逻辑检修
  • 由于重大设计缺陷,私人努力让它们提供异步操作,但遭到了严厉批评

英特尔宣布了一些与其硬件一起使用的“异步 OpenSSL”项目(08.2014),但链接的白皮书并未提供有关其实施和开发状态的详细信息。一位开发人员发布了一些相关代码(10.2015),指出它“足够稳定,可以概览”。