前几天同事碰上个怪事。他负责的一个后台API服务,在迁移到新的鲲鹏服务器后,监控显示TLS握手阶段的CPU开销明显变高了。这说不通,因为鲲鹏920芯片里集成了一套KAE加解密引擎,按说应该能硬件加速RSA、AES这些操作,减轻CPU负担才对。
服务是用Nginx配的SSL,算法和证书都没动过。一开始怀疑是内核的加速模块没加载,查了lsmod | grep kae,驱动明明在。又试了用OpenSSL的命令行工具测速:
结果出来,数值挺高,看起来硬件加速是生效的。这就更怪了,为什么在Nginx里就没用上呢?
问题得往深了挖。我们知道,OpenSSL支持通过“引擎”机制来接入第三方硬件。在鲲鹏上,KAE是以引擎形式提供的。仅仅驱动加载了还不够,还得让OpenSSL正确地找到并使用这个引擎。
检查Nginx的编译信息,确认它是带OpenSSL支持的。关键一步,是要看运行时OpenSSL是否真的启用了KAE引擎。我们写了段简单的C测试程序,调用ENGINE_by_id("kae")来查找引擎,果然返回了空。这说明在服务运行时环境里,OpenSSL的引擎表里根本没有KAE。
原因出在路径上。KAE引擎的动态库libkae.so通常安装在/usr/lib64或/usr/local/lib64下,但OpenSSL默认的引擎搜索路径可能不包含它,或者依赖的配置文件没被正确加载。此外,还需要设置一个环境变量OPENSSL_ENGINES,指向引擎库所在的目录,OpenSSL启动时才会去那里扫描。
解决方案是一套组合配置。首先确保环境变量正确设置,可以在systemd服务文件里加上:
其次,有些场景下还需要在OpenSSL的配置文件openssl.cnf中显式配置并激活kae引擎。
配置完后,用测试程序验证,引擎能找到了。重启Nginx,再用openssl s_client连上去抓包分析,同时观察/proc/interrupts里关于KAE引擎的中断计数是否在握手时增加。确认硬件确实开始干活后,CPU使用率也降到了预期水平。
这个坑给我们提了个醒:硬件加速功能的就绪,是一个多层验证的过程。
驱动层:模块要加载。
接口层:引擎库要存在且可被链接。
运行时环境层:路径、环境变量、配置文件要正确。
应用层:应用(如Nginx)要使用正确的SSL库调用路径。
迁移时,我们往往只确认了第一层,就以为万事大吉。后面的任何一层断裂,都会导致整个加速链静默地回退到软件实现,让你以为是硬件性能不行,其实是根本没跑上去。在鲲鹏这类集成专用加速硬件的平台上,这种“全栈检查”的思路,对于用好它的特性至关重要。
前几天同事碰上个怪事。他负责的一个后台API服务,在迁移到新的鲲鹏服务器后,监控显示TLS握手阶段的CPU开销明显变高了。这说不通,因为鲲鹏920芯片里集成了一套KAE加解密引擎,按说应该能硬件加速RSA、AES这些操作,减轻CPU负担才对。
服务是用Nginx配的SSL,算法和证书都没动过。一开始怀疑是内核的加速模块没加载,查了
lsmod | grep kae,驱动明明在。又试了用OpenSSL的命令行工具测速:结果出来,数值挺高,看起来硬件加速是生效的。这就更怪了,为什么在Nginx里就没用上呢?
问题得往深了挖。我们知道,OpenSSL支持通过“引擎”机制来接入第三方硬件。在鲲鹏上,KAE是以引擎形式提供的。仅仅驱动加载了还不够,还得让OpenSSL正确地找到并使用这个引擎。
检查Nginx的编译信息,确认它是带OpenSSL支持的。关键一步,是要看运行时OpenSSL是否真的启用了KAE引擎。我们写了段简单的C测试程序,调用
ENGINE_by_id("kae")来查找引擎,果然返回了空。这说明在服务运行时环境里,OpenSSL的引擎表里根本没有KAE。原因出在路径上。KAE引擎的动态库
libkae.so通常安装在/usr/lib64或/usr/local/lib64下,但OpenSSL默认的引擎搜索路径可能不包含它,或者依赖的配置文件没被正确加载。此外,还需要设置一个环境变量OPENSSL_ENGINES,指向引擎库所在的目录,OpenSSL启动时才会去那里扫描。解决方案是一套组合配置。首先确保环境变量正确设置,可以在systemd服务文件里加上:
其次,有些场景下还需要在OpenSSL的配置文件
openssl.cnf中显式配置并激活kae引擎。配置完后,用测试程序验证,引擎能找到了。重启Nginx,再用
openssl s_client连上去抓包分析,同时观察/proc/interrupts里关于KAE引擎的中断计数是否在握手时增加。确认硬件确实开始干活后,CPU使用率也降到了预期水平。这个坑给我们提了个醒:硬件加速功能的就绪,是一个多层验证的过程。
驱动层:模块要加载。
接口层:引擎库要存在且可被链接。
运行时环境层:路径、环境变量、配置文件要正确。
应用层:应用(如Nginx)要使用正确的SSL库调用路径。
迁移时,我们往往只确认了第一层,就以为万事大吉。后面的任何一层断裂,都会导致整个加速链静默地回退到软件实现,让你以为是硬件性能不行,其实是根本没跑上去。在鲲鹏这类集成专用加速硬件的平台上,这种“全栈检查”的思路,对于用好它的特性至关重要。