multithreading - 充分利用硬件加速器

标签 multithreading performance ssl openssl hardware-acceleration

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

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

我们想使用高级 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你可以看到,英特尔还提到了多线程/进程的利用:

    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 . 更多信息可以在 pdf 中找到 here .

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

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

最佳答案

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

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

OpenSSL supports multiple threads provided that you give it callbacks to lock shared data .对于多个进程,它会发出关于 reusing data state 的警告继承自 parent 。

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

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

英特尔 announced some "Asynchronous OpenSSL" project (08.2014) 与其硬件一起使用,但 the linked white paper几乎没有提供有关其实现和开发状态的详细信息。一名开发人员published some related code (10.2015),指出它“足够稳定,可以概览”。

关于multithreading - 充分利用硬件加速器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32994981/

相关文章:

.net - 优化每分钟大量数据库请求的应用程序

asp.net - Umbraco 版本 5 出了什么问题?

Apache - 在没有安全警报的情况下将 https 重定向到不同的域

ruby - 当我尝试调用 Google Geocode API 时出现 SSL 错误

SSL: certificate_verify_failed 使用 Google Assistant SDK

c# - 关于在 .NET 中干净地终止线程的问题

c++ - 通过引用多个线程传递变量会破坏堆

c# - c#/perfmon 中的自定义性能计数器

Java:在线程中执行一条语句

multithreading - Python在休眠时终止线程