Multithreading 充分利用硬件加速器
我想使用OpenSSL来处理所有的SSL通信(客户端和服务器端)。我们希望使用硬件加速卡来卸载繁重的加密计算 我们注意到,在OpenSSL“速度”测试中,有对加密函数的直接调用(例如,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
RSA\u签名/解密
,等等)。为了充分利用硬件容量,需要多个线程(最多128个线程),以向卡加载请求并确保硬件卡从不空闲
我们希望使用高级OpenSSL API来处理SSL连接(例如,SSL\u connect/read/write/accept
),但此API不公开实际加密操作的执行点。例如,在调用SSL\u connect
时,我们不知道RSA操作是在什么地方完成的,我们也不知道哪些调用会导致繁重的加密计算,只将这些调用引用到加速器
问题:
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并没有充分利用我们使用的加速器,需要使用多线程。