ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

鲲鹏KAE硬件加速实战:OpenSSL ENGINE零代码改造提升TLS性能

鲲鹏KAE硬件加速实战:OpenSSL ENGINE零代码改造提升TLS性能 1. 项目缘起为什么我会盯上 KAE 这块“免费算力”第一次接触 KAE 是在一个挺尴尬的场景里。当时我手上有一套跑在鲲鹏服务器上的 Web 网关服务业务侧反馈高峰期 TLS 握手耗时偏高CPU 的sys和si软中断占用常年飘在 30% 以上。我第一反应是加机器但预算批不下来于是开始翻鲲鹏平台的文档才注意到 KAE 这个模块——全称 Kunpeng Accelerator Engine是鲲鹏处理器内置的一类硬件加速引擎覆盖压缩、加解密、CRC 校验等场景其中对 OpenSSL 的对接是最成熟的一条路径。KAE 最吸引我的点用一句话概括就是业务代码一行不改把 OpenSSL 的底层实现换成硬件引擎性能就能往上抬一截。这句话听起来像广告词但实际验证下来在合适的负载模型下确实成立。它的原理并不神秘鲲鹏 SoC 里集成了专门的加解密模块比如对称加密、非对称加密的加速单元KAE 通过驱动和用户态库把这些硬件能力暴露出来再以 OpenSSL ENGINE 的形式挂载进去。OpenSSL 本身有一套 ENGINE 机制允许第三方把RSA_sign、AES_encrypt这类底层函数替换成自己的实现KAE 就是走了这条路。这篇文章适合谁看三类人。第一类是在鲲鹏包括 9000x 系列、C2000 等平台上跑服务、被 TLS 或加解密性能卡住的运维和后端同学第二类是想搞清楚 OpenSSL ENGINE 机制到底怎么落地的人第三类是做国产化适配、需要在银河麒麟这类系统上把性能调优做扎实的工程师。我会把选型逻辑、环境准备、实操步骤、参数计算、踩坑记录全部摊开讲尽量让你照着做就能复现。需要先说明一点KAE 不是“银弹”。它对负载类型很挑对小包、短连接、纯签名场景收益明显对已经吃满带宽的大文件传输帮助有限。所以下面我会花不少篇幅讲“什么场景该用、什么场景别硬上”这比单纯贴命令更有价值。2. 方案选型为什么是 KAE OpenSSL ENGINE而不是别的路2.1 三条可选路径的横向对比在决定用 KAE 之前我其实评估过三条路这里直接摆出来对比省得你重复走弯路。方案改动量性能收益适用场景主要代价纯软件优化换算法、调参数小有限通常 10%~20%所有平台收益天花板低业务层调用硬件 SDK大需改代码高新项目侵入性强维护成本高KAE OpenSSL ENGINE几乎为零中高视场景 30%~200%已有 OpenSSL 栈依赖平台和版本匹配纯软件优化这条我试过把 RSA 2048 换成 ECC、把 TLS 会话复用打开确实有效果但很快就撞到天花板。业务层直接调 SDK 收益最高可问题是我们的服务是 Nginx 加一堆自研模块改起来牵一发动全身回归测试成本太高。KAE 这条路的核心优势就在于非侵入OpenSSL 的 ENGINE 机制本来就是为这种“替换底层实现”设计的业务侧只感知到一个配置项的变化。2.2 OpenSSL ENGINE 机制到底是怎么回事很多人对 ENGINE 的印象停留在“配置文件里写一行engine dynamic”但没搞明白它为什么能生效。我用一个类比解释OpenSSL 内部有一张“函数指针表”比如做 RSA 签名时它默认调用自己实现的RSA_sign。ENGINE 机制允许你注册一个引擎把这张表里的某些指针替换成引擎提供的版本。KAE 引擎注册后RSA_sign、RSA_verify、ECDSA_sign、部分对称算法就会被路由到硬件。关键函数是ENGINE_by_id你会在配置里看到类似engine_id kae的写法底层就是靠它按 ID 找到引擎对象。加载成功后OpenSSL 会调用引擎的init回调KAE 在这个回调里完成设备打开、队列初始化等工作。理解这一点很重要因为后面排查问题时你要判断到底是“引擎没加载成功”还是“加载了但没被用上”这两类问题的排查路径完全不同。2.3 为什么优先选非对称加速而不是对称加速这里有个经验性的取舍。KAE 对对称加密AES和非对称RSA/ECC都支持但我在实际项目里优先开的是非对称加速。原因是AES 在现代 CPU 上本来就有指令级优化软件实现已经很快硬件加速的相对收益没那么夸张而 RSA 这类涉及大数模幂运算的操作软件实现非常吃 CPU硬件加速的收益往往是数倍。TLS 握手阶段恰恰是非对称运算的密集区所以把加速资源投在这里性价比最高。当然如果你的业务是大量对称加解密比如文件加密服务那对称加速也值得开。判断标准很简单用perf top看热点函数如果bn_mul_mont、BN_mod_exp这类大数运算函数排在前列就上非对称加速如果aesni_encrypt之类排前面再考虑对称加速。3. 环境准备版本匹配是成败的第一道关3.1 硬件与系统前提KAE 对平台有硬性要求不是所有 ARM 服务器都带这个引擎。你需要确认 CPU 是鲲鹏系列比如 9000x、C2000 这类集成加速单元的型号并且 BIOS 里加速引擎是开启状态。系统层面银河麒麟高级服务器 V10aarch64这类国产化系统通常已经内置了 KAE 驱动但版本可能偏旧需要留意。先做两件事确认基础条件# 查看 CPU 信息确认是鲲鹏平台 lscpu | grep -i model name\|architecture # 查看 KAE 相关设备节点是否存在 ls -l /dev/ | grep -i kae\|hisi\|sec如果/dev下能看到类似hisi_sec、hisi_hpre、hisi_zip的设备节点说明驱动已经加载。hisi_sec对应对称加密hisi_hpre对应非对称RSA/ECChisi_zip对应压缩。这三个是 KAE 的核心设备缺哪个就说明哪类加速用不了。注意如果设备节点不存在先别急着装 KAE 用户态库那没用。要回头查内核驱动是否编译进去、BIOS 是否开启。我见过有人折腾一下午用户态库最后发现是 BIOS 里加速引擎被关了白忙活。3.2 OpenSSL 版本的选择逻辑这是最容易翻车的地方。KAE 引擎和 OpenSSL 版本是强绑定的用错版本会出现“引擎加载成功但调用时崩溃”这种诡异现象。我的建议是优先使用系统自带的 OpenSSL因为 KAE 驱动和库通常是针对系统版本编译的兼容性最好。如果必须升级 OpenSSL比如为了修某个安全漏洞一定要确认 KAE 引擎库支持这个新版本否则宁可不动。查看当前版本openssl version -a输出里会显示版本号、编译日期、安装路径。记下这个版本号后面装 KAE 引擎时要对得上。热词里提到的openssl升级windows、windows11安装openssl那些是 Windows 场景和鲲鹏上的 KAE 完全是两码事别混着看容易把自己绕晕。3.3 KAE 用户态库的安装KAE 的用户态部分通常以 RPM 或源码形式提供包含libkae.so和 OpenSSL 引擎动态库一般叫libkae_openssl.so或类似名字。安装后引擎库会放在 OpenSSL 的 engines 目录下常见路径是/usr/lib64/engines/或/usr/local/lib/engines/。安装完先验证引擎能不能被 OpenSSL 识别openssl engine -t -c这条命令会列出所有可用引擎及其能力。如果输出里能看到kae并且状态是[ available ]说明引擎库路径没问题。如果看不到检查OPENSSL_ENGINES环境变量是否指向了正确的目录。4. 实操过程从加载引擎到验证加速生效4.1 第一步手动加载引擎做冒烟测试在改任何配置文件之前先用命令行手动加载引擎确认它能工作。这一步能帮你把“引擎本身的问题”和“配置的问题”分开。# 手动指定引擎执行一次 RSA 操作 openssl speed -engine kae -evp aes-128-cbc如果引擎加载失败会直接报错比如engine kae not found或invalid engine。这时候要回头查引擎库路径和版本。如果加载成功你会看到性能数据输出同时可以用dmesg观察内核日志里有没有 KAE 设备被调用的记录。实操心得openssl speed是验证引擎是否真正生效的好工具。对比加-engine kae和不加时的数据如果数字有明显差异说明硬件确实在干活如果几乎一样那多半是引擎加载了但没被路由到需要查算法是否被引擎支持。4.2 第二步配置 OpenSSL 默认加载引擎冒烟测试通过后就可以让 OpenSSL 默认加载 KAE 引擎了。编辑/etc/ssl/openssl.cnf路径以实际为准在文件开头加入openssl_conf openssl_init [openssl_init] engines engine_section [engine_section] kae kae_section [kae_section] engine_id kae dynamic_path /usr/lib64/engines/libkae.so default_algorithms ALL init 1这里几个参数值得解释。engine_id就是ENGINE_by_id查找时用的名字必须和引擎注册的 ID 一致。dynamic_path指向引擎动态库路径错了会静默失败。default_algorithms ALL表示让引擎接管它支持的所有算法如果你只想加速 RSA可以改成RSA避免不必要的路由开销。init 1表示加载时立即初始化。改完配置后用这条命令验证openssl engine -t -c这次应该能看到kae引擎处于默认加载状态。再跑一次openssl speed不加-engine参数如果性能数据和手动加载时一致说明默认配置生效了。4.3 第三步让业务服务用上加速对于 Nginx 这类服务它自己链接了 OpenSSL只要 OpenSSL 默认加载了 KAE 引擎Nginx 启动后就会自动用上。但有个坑Nginx 可能在启动时缓存了引擎状态改完配置要重启而不是 reload。我踩过这个坑reload 之后性能没变化重启才生效。验证业务是否真的用上了加速有几个办法# 方法一观察 KAE 设备的中断计数是否增长 cat /proc/interrupts | grep -i hisi\|sec\|hpre # 方法二用 perf 看热点函数是否从软件实现转移 perf top -p $(pgrep nginx | head -1)如果中断计数在压测时明显增长或者perf top里原来的大数运算函数消失了基本可以确认加速生效。4.4 参数计算怎么估算加速收益很多人问“到底能快多少”这个没法给一个固定数字但可以估算。以 RSA 2048 签名为例软件实现单次大约 1~2 毫秒视 CPU 主频硬件加速后可能降到 0.2~0.5 毫秒。假设你的服务每秒处理 5000 次 TLS 握手每次握手涉及 1 次签名和 1 次验签那么软件实现5000 × 2 × 1.5ms ≈ 15 秒的 CPU 时间需要多核并行分摊硬件加速5000 × 2 × 0.35ms ≈ 3.5 秒的 CPU 时间省下来的 CPU 时间就是你能承载的额外并发。这个估算方法的核心是先测单次操作耗时再乘以 QPS比拍脑袋靠谱得多。实际测试时用openssl speed rsa2048分别测软件和硬件版本拿到真实数字再算。5. 常见问题与排查技巧实录5.1 引擎加载失败类问题现象可能原因排查方法engine kae not found引擎库路径不对或未安装检查OPENSSL_ENGINES和实际库文件invalid engine引擎库与 OpenSSL 版本不匹配用ldd看库依赖确认版本加载成功但[ unavailable ]设备节点缺失或权限不足查/dev下设备节点和文件权限加载成功但性能无变化算法未被路由用openssl engine -c看支持算法列表5.2 性能不升反降的情况这个我遇到过原因通常是小包场景下硬件调度的开销超过了加速收益。硬件引擎有队列、中断、上下文切换的成本如果单次操作的数据量很小比如几十字节的加密软件实现反而更快。解决办法是设置一个阈值小包走软件、大包走硬件或者干脆在这种场景下不开加速。另一个原因是引擎初始化开销被算进了每次调用。如果配置里没设init 1引擎可能每次调用都重新初始化那性能肯定崩。确认配置里初始化是一次性的。5.3 版本升级引发的连锁问题热词里有一堆关于 OpenSSL 升级、漏洞修复的内容比如cve-2016-2183那个信息泄露漏洞。这里要提醒在鲲鹏 KAE 环境下升级 OpenSSL 要格外谨慎。升级后 KAE 引擎库可能不兼容导致加速失效甚至服务崩溃。我的做法是升级前先在测试环境验证 KAE 引擎能否正常加载确认无误再上生产。如果 KAE 引擎暂时不支持新版本宁可先不升级或者用其他方式缓解漏洞比如禁用受影响的加密套件。5.4 独家避坑清单别在容器里折腾 KAE容器默认拿不到宿主机的设备节点需要额外映射而且引擎库路径在容器里往往不对。除非你有明确的容器化需求否则直接在宿主机上配更省事。压测要用真实负载模型用ab或wrk打短连接和长连接结果可能完全相反。KAE 对握手密集的场景收益大对长连接大流量场景收益小压测模型选错了会得出错误结论。关注内核日志dmesg -T | grep -i kae能看到引擎的初始化、错误、队列溢出等信息很多问题在这里有直接线索。保留回退方案改配置前备份openssl.cnf万一加速导致兼容性问题能快速回退到纯软件模式。6. 影响范围与适用边界哪些场景值得上哪些别硬上6.1 收益明显的场景TLS 握手密集的服务是 KAE 的最佳战场比如 API 网关、HTTPS 负载均衡、证书签发服务。这些场景非对称运算占比高硬件加速的收益能直接转化为并发能力。另外签名验签类服务比如 JWT 校验、代码签名也值得上因为这类操作几乎全是 RSA/ECC 运算。6.2 收益有限的场景大文件传输、视频流这类以对称加密为主的场景KAE 的收益相对有限因为 AES 软件实现本来就快。纯静态资源服务、已经用上会话复用且握手占比很低的服务加速收益也不明显。判断方法还是那句话先 profile看热点在哪再决定加不加速。6.3 对国产化适配的意义在国产化替代的大背景下KAE 这类内置加速引擎的价值不只是性能还有减少对国外加密库实现的依赖。鲲鹏平台自带硬件加速配合国产操作系统能在不引入额外硬件卡的情况下提升加密性能这对成本敏感的项目挺友好。当然前提是版本匹配、配置正确否则就是给自己找麻烦。7. 我个人的几条实操体会折腾 KAE 这段时间最大的体会是硬件加速的收益高度依赖场景匹配配置正确只是及格线选对场景才是加分项。我见过有人在不适合的场景硬上结果性能没提升还引入了稳定性风险得不偿失。第二个体会是版本管理要严格。KAE 引擎、OpenSSL、内核驱动、系统版本这四者之间是有依赖关系的任何一个不匹配都可能出问题。我的做法是维护一份版本对照表每次升级前先查表确认兼容性别凭感觉升级。第三个体会是验证要落到数据上。别信“应该快了”要用openssl speed、perf、中断计数这些硬指标说话。加速生效和没生效数据上一定看得出来看不出来就是没生效。最后分享一个小技巧如果你不确定某个算法是否被 KAE 支持用openssl engine -c kae看能力列表比翻文档快。列表里有的算法才会被路由到硬件没有的还是走软件这个信息在排查“为什么某个操作没加速”时特别有用。
返回列表