充分利用硬件加速器

时间:2015-10-07 14:29:14

标签: multithreading performance ssl 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. (在更新时回答)您熟悉英特尔的asynchronous OpenSSL吗?他们似乎试图解决这个问题,但我们找不到实际的代码或用法示例。
  4. 更新

    1. Accelerating OpenSSL* Using Intel® QuickAssist Technology你可以看到,英特尔还提到了多线程/进程的使用:

        

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

OpenSSL supports multiple threads provided that you give it callbacks to lock shared data。对于多个进程,它会警告从父进程继承的reusing data state

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

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

英特尔announced some "Asynchronous OpenSSL" project(08.2014)与其硬件配合使用,但the linked white paper没有提供有关其实施和开发状态的详细信息。一位开发人员published some related code(10.2015),注意到它“足够稳定以获得概述”。

答案 1 :(得分:1)

正如jww在评论中提到的那样,您应该使用engine API来完成任务。上面的链接中有一个关于如何使用该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