最近我用 OpenSSLJCE 替换了 SunJCE,OpenSSLJCE 是一个私有(private)包,它使用 Openssl 原语( native 库)实现 JCE 以进行 TLS 终止。
使用 OpenSSLJCE 观察到性能提高了约 35%。
我的问题是,
这种性能提升的原因是什么?仅仅是因为 openssl 是在 native 代码中执行的吗?
我认为SunJCE正在解密(TLS终止)java堆中的内容,而原生Openssl需要将内容复制到处理堆然后解密内容并将其发送回java堆,这涉及到两个副本。我的理解正确吗?
请提供您的建议和引用。
最佳答案
我将尝试通过提供我的示例来回答您的第一个问题。我创建了一个 JMeter 测试来创建与 Java 应用程序的 TLS 连接。随着负载的增加,Java 应用程序在处理 TLS 握手方面面临着巨大的挑战,因为这对于 Java 来说似乎是一个非常昂贵的操作。我在同一硬件上运行了另一个测试,其中 Nginx 负责终止与 Java 应用程序的 TLS 和代理 TCP 连接。 Nginx(使用 OpenSSL)在处理相同的负载时完全没有问题。
OpenSSL 肯定使用硬件加速来进行加密处理。
下面的文章比较了不同JCE的性能以及硬件加速的作用:https://developer.ibm.com/javasdk/2018/02/16/performance-ibm-jdk-security-ibmjceplus/
关于java - SunJCE 与 OpenSSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42432315/