【问题标题】:Fully utilizing HW accelerator充分利用硬件加速器
【发布时间】:2016-01-04 20:20:11
【问题描述】:

我想使用 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 吗?似乎他们试图解决这个确切的问题,但我们找不到实际的代码或使用示例。

更新

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

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

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

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

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

【问题讨论】:

  • 部分重复(但您还有其他问题):EVP Interface with AES-NI supportHow can I check if OpenSSL is support/use the Intel AES-NI?。它适用于所有硬件和加速,而不仅仅是 AES-NI。
  • @jww 感谢您的回答。只是为了澄清我的问题:我想使用高级 API(例如 SSL_read())。这段代码可以在没有我控制的情况下完成握手,我想避免这种情况。我想确切地知道何时将进行代价高昂的操作,以便我可以将其引用到单独的线程(这样我就不会阻塞它)
  • @jww 另外,您所说的加速类型是在 CPU 中完成的。在我的例子中,加速是通过将加密工作从 CPU 卸载到协处理器来实现的。这涉及将数据传递给适当的驱动程序(可能由ioctl()),这涉及上下文切换。
  • 第二个问题(安全协处理器),需要实现一个OpenSSL Engine;有关详细信息,请参阅engine(3)。然后,EVP 将执行卸载。
  • AFAIK,恐怕你不能简单地将代价高昂的操作(假设这里的 RSA 计算)引用到一个单独的线程并继续而不阻塞。您需要等待握手完成,然后才能真正使用 SSL/TLS 通道(即 openssl BIO)。可能您所需要的只是使用引擎。如果您想测量 100% 的硬件利用率,请同时运行多个 openssl speed 进程(如果可能)。

标签: multithreading performance ssl openssl hardware-acceleration


【解决方案1】:

根据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),指出它“足够稳定,可以大致了解一下”。

【讨论】:

    【解决方案2】:

    正如jww 在 cmets 中提到的,您应该使用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

    【讨论】:

    • 感谢您的回答。然而,在“openssl 速度”测试的情况下,正如我在问题中指出的那样,openssl 没有充分利用我们使用的加速器,并且需要使用多线程。
    猜你喜欢
    • 2011-06-05
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 2015-11-29
    • 2012-03-24
    • 2016-07-28
    相关资源
    最近更新 更多