Multithreading 充分利用硬件加速器

Multithreading 充分利用硬件加速器,multithreading,performance,ssl,openssl,hardware-acceleration,Multithreading,Performance,Ssl,Openssl,Hardware Acceleration,我想使用OpenSSL来处理所有的SSL通信(客户端和服务器端)。我们希望使用硬件加速卡来卸载繁重的加密计算 我们注意到,在OpenSSL“速度”测试中,有对加密函数的直接调用(例如,RSA\u签名/解密,等等)。为了充分利用硬件容量,需要多个线程(最多128个线程),以向卡加载请求并确保硬件卡从不空闲 我们希望使用高级OpenSSL API来处理SSL连接(例如,SSL\u connect/read/write/accept),但此API不公开实际加密操作的执行点。例如,在调用SSL\u co

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

我们注意到,在OpenSSL“速度”测试中,有对加密函数的直接调用(例如,
RSA\u签名/解密
,等等)。为了充分利用硬件容量,需要多个线程(最多128个线程),以向卡加载请求并确保硬件卡从不空闲

我们希望使用高级OpenSSL API来处理SSL连接(例如,
SSL\u connect/read/write/accept
),但此API不公开实际加密操作的执行点。例如,在调用
SSL\u connect
时,我们不知道RSA操作是在什么地方完成的,我们也不知道哪些调用会导致繁重的加密计算,只将这些调用引用到加速器

问题:

  • 如何在充分利用硬件加速器的同时使用高级API?我应该使用多线程吗
  • 是否有一种“标准”的方法来做到这一点?(实施示例)
  • (更新中回答)你熟悉英特尔的吗?看起来他们正试图解决这个问题,但我们找不到实际的代码或使用示例
  • 更新

  • 从中可以看出,Intel还提到了多线程/进程的利用率:

    OpenSSL的标准版本本质上是串行的,这意味着 在一个上下文中处理一个连接。从 加密操作,该版本基于同步/ 分块编程模型。一个主要的限制是吞吐量可能会降低 仅通过添加更多线程(即进程)来实现更高的扩展 核心并行化的优势,但这也会增加上下文 管理费用

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

    看起来Intel改变了OpenSSL引擎的工作方式——它将工作发布到驱动程序并立即返回,同时应该轮询相应的结果

    如果您使用其他SSL加速器,那么也应该修改相应的OpenSSL引擎

  • 正如评论中提到的,您应该使用来完成任务。上面的链接中有一个关于如何使用该API的示例。通常,硬件加速器提供程序实现一个称为“引擎”的库。该引擎提供加密加速,可供OpenSSL内部使用。假设您要使用的加速器实现了一个引擎(例如“cswift”),您应该通过调用
    ENGINE*e=ENGINE_by_id(“cswift”)来获取引擎然后初始化它
    引擎初始化(e)
    并将其设置为要使用的操作的默认值,例如
    ENGINE\u set\u default\u RSA(e)

    调用这些函数后,您可以使用OpenSSL的高级API(例如,
    SSL\u connect/read/write/accept

    根据,
    -multi
    不“并行化”工作或其他什么,它只是并行运行多个基准测试

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

    OpenSSL。对于多个进程,它警告从父进程继承

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

    • openssl
      通过异步BIOs支持异步I/O
    • 但是,它的基本加密操作和内部引擎调用是同步的,改变这一点需要进行逻辑彻底检查
    • 由于主要的设计缺陷,私人努力使它们提供异步操作

    英特尔(2014年8月8日)决定将其与硬件一起使用,但没有提供关于其实施和开发状态的详细信息。一位开发人员(2015年10月)指出,它“足够稳定,可以获得概述”。

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