ARTICLE DETAIL

资讯详情

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

鲲鹏KAE硬件加速实战:不改代码提升OpenSSL加解密性能

鲲鹏KAE硬件加速实战:不改代码提升OpenSSL加解密性能 1. 从一次压测说起为什么业务代码没动QPS 却翻了倍去年帮一个朋友排查他们网关服务的性能瓶颈场景很典型一台搭载鲲鹏处理器的服务器跑着 Nginx 做 TLS 卸载业务侧用的是标准的 OpenSSL 库。压测的时候单核 RSA 2048 签名操作只能跑到几千次每秒CPU 的sys和usr占用都很高但吞吐就是上不去。当时第一反应是加机器、换更强的 CPU但成本摆在那里而且他们已经在用鲲鹏了再往上堆硬件性价比不高。后来翻鲲鹏的官方文档发现了一个叫KAEKunpeng Accelerator Engine鲲鹏加速引擎的东西。它把加解密、压缩这类计算密集型的操作卸载到专用的硬件加速单元上最关键的一点是——业务代码一行都不用改。你原来怎么调 OpenSSL现在还怎么调只是底层悄悄换了一条路走。这个特性对运维和开发来说太友好了。因为改业务代码意味着重新测试、重新上线、可能引入新 bug而 KAE 的接入方式是在 OpenSSL 的 ENGINE 机制层面做文章属于换引擎不换车的思路。这篇文章就把 KAE 硬件加速的来龙去脉、接入方式、实测效果和踩过的坑完整地讲一遍。适合正在用鲲鹏平台、对 TLS 性能或加解密吞吐有要求、又不想大动业务代码的工程师参考。2. KAE 到底加速了什么先搞清楚它的能力边界2.1 鲲鹏加速引擎的硬件底座KAE 不是一个软件库它是鲲鹏处理器内置的一组硬件加速模块的统称。在鲲鹏 920 这类芯片上集成了几个专门的协处理器单元分别负责对称加密、非对称加密和压缩解压。你可以把它理解成 CPU 旁边专门雇了几个专业工人CPU 自己不用再干这些重复性极高的体力活把任务派给它们就行。具体来说KAE 主要覆盖三类运算对称加密AES 系列的加解密包括 AES-128/192/256 的 CBC、CTR、ECB 等常见模式以及 SM4 国密算法。非对称加密RSA 的签名与验签、DH 密钥交换以及 SM2 国密算法。压缩解压zlib 和 gzip 格式的压缩与解压加速。这三类正好是 TLS 握手和数据传输过程中最耗 CPU 的部分。TLS 握手阶段大量使用 RSA 或 ECDHE 做密钥交换和签名数据传输阶段用 AES 做对称加密HTTP 压缩又涉及 zlib。所以 KAE 的加速点选得很准基本覆盖了 Web 服务性能瓶颈的主要来源。2.2 为什么不改代码这件事如此重要很多人第一次听到硬件加速会以为要调用一套全新的 API把原来的RSA_sign、AES_encrypt全部替换掉。如果真是这样那迁移成本就太高了。KAE 的设计巧妙之处在于它通过OpenSSL 的 ENGINE 机制来接入。OpenSSL 从很早的版本就支持 ENGINE 概念允许第三方实现一个加密引擎注册到 OpenSSL 里。当应用程序调用RSA_sign这类函数时OpenSSL 会检查当前是否有可用的 ENGINE如果有就把实际运算委托给这个 ENGINE 去做。KAE 就是实现了这样一个 ENGINE把运算转发到硬件加速单元。所以整个接入过程对业务代码是透明的。你的程序还是#include openssl/rsa.h还是调RSA_sign只是运行环境里多了一个 KAE 的 ENGINE 库并且通过配置让它生效。这就是标题里不改一行业务代码的真正含义——改的是运行环境和配置不是源码。2.3 KAE 和纯软件实现的性能差距在哪纯软件做 AES 加密CPU 需要一条条执行指令即使有 AES-NI 这类指令集优化单核吞吐也是有上限的。而 KAE 的硬件单元是专门为这类运算设计的电路并行度高、延迟低。在鲲鹏平台上实测AES-256-CBC 的吞吐可以提升数倍RSA 2048 签名的性能提升更明显因为非对称运算本身就是计算密集型的重灾区。不过要注意KAE 的加速效果和具体算法、数据块大小、并发模型都有关系。小数据块的频繁调用加速比可能没那么夸张因为任务派发本身也有开销。大数据块的批量运算加速效果才明显。这个在后面实测部分会详细说。3. 接入 KAE 的完整路径从环境检查到 ENGINE 生效3.1 先确认你的平台到底支不支持不是所有鲲鹏机器都带 KAE。KAE 需要处理器本身集成对应的加速单元而且需要操作系统和内核驱动的配合。所以第一步是确认硬件和系统环境。检查硬件是否支持可以看/proc/cpuinfo里的特性标志或者直接查鲲鹏的型号文档。一般来说鲲鹏 920 系列是支持的。操作系统方面主流的企业级 Linux 发行版在较新的版本里已经集成了 KAE 的驱动和用户态库。一个比较稳妥的检查方式是看系统里有没有 KAE 相关的设备节点和内核模块# 查看内核模块是否加载 lsmod | grep -i kae # 查看设备节点 ls -l /dev/ | grep -i kae # 查看 OpenSSL 是否已经识别到 KAE 引擎 openssl engine -t -c如果openssl engine的输出里能看到kae或类似的引擎名称说明环境基本就绪。如果看不到可能需要安装 KAE 的用户态驱动包或者升级 OpenSSL 到支持 KAE 的版本。提示不同发行版和不同版本的 KAE 驱动包名和设备节点名称可能不一样。有的叫kae有的叫hisi_sec之类。以实际系统的文档为准不要死记命令。3.2 安装 KAE 用户态库和 OpenSSL 引擎KAE 的软件栈通常分两层内核态的驱动和用户态的库。内核驱动负责和硬件通信用户态库提供 OpenSSL 能调用的 ENGINE 接口。很多企业级发行版已经把这两层都打包好了直接通过包管理器安装即可。以常见的做法为例需要安装的包大致包括 KAE 的内核模块包、用户态库包以及一个专门给 OpenSSL 用的引擎包。安装完之后引擎的动态库文件通常是.so文件会被放到 OpenSSL 的引擎目录下比如/usr/lib64/engines/或/usr/lib/aarch64-linux-gnu/engines-3/这类路径。安装完成后再次执行openssl engine -t -c应该能看到 KAE 引擎出现在列表里并且状态是 available。如果显示 unavailable通常是驱动没加载或者权限问题。3.3 让 OpenSSL 真正用上 KAE 引擎引擎装好了不代表就会自动生效。OpenSSL 默认不会主动加载第三方引擎需要显式指定。有两种方式方式一命令行临时指定。在执行 openssl 命令时加上-engine kae参数比如openssl speed -engine kae -evp aes-256-cbc这种方式只对当前命令生效适合测试验证。方式二配置文件全局生效。修改 OpenSSL 的配置文件通常是/etc/ssl/openssl.cnf或/etc/pki/tls/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/kae.so default_algorithms ALL init 1这样配置之后所有使用这个 OpenSSL 配置的程序都会自动加载 KAE 引擎。对于 Nginx、Apache 这类服务它们启动时会读取系统 OpenSSL 配置所以配置改完重启服务即可生效业务代码完全不用动。注意dynamic_path的路径要根据实际系统里 kae.so 的位置来写不同发行版差异很大。写错了引擎加载会失败但 OpenSSL 通常会静默回退到软件实现不会报错所以一定要用openssl engine验证是否真的加载成功。3.4 验证加速是否真的生效配置完之后怎么确认运算真的走了硬件而不是软件回退最直接的办法是用openssl speed做基准测试对比开启和关闭引擎时的性能差异。# 不指定引擎走软件实现 openssl speed -evp aes-256-cbc # 指定 KAE 引擎 openssl speed -engine kae -evp aes-256-cbc如果 KAE 生效后者的吞吐数字应该明显高于前者。如果两者差不多说明引擎没真正起作用需要回头检查配置。另一个验证角度是看 CPU 占用。硬件加速生效时同样的运算量下 CPU 的usr占用会下降因为计算被卸载到了加速单元。这个在压测场景下观察top或mpstat的输出就能看出来。4. 实测数据与性能表现加速比到底有多少4.1 对称加密的加速效果在鲲鹏 920 平台上用openssl speed实测 AES-256-CBC软件实现和 KAE 加速的对比大致是这样的具体数字因平台和版本而异这里给的是量级参考算法与块大小软件实现吞吐KAE 加速吞吐提升倍数AES-256-CBC 16字节块基准值约 2-3 倍中等AES-256-CBC 1024字节块基准值约 4-6 倍明显AES-256-CBC 8192字节块基准值约 6-8 倍显著可以看到一个规律数据块越大加速比越高。原因是硬件加速的任务派发和回收有固定开销小数据块时这个开销占比高摊薄了加速收益。大数据块时计算本身占主导硬件并行优势就体现出来了。这对实际应用的启示是如果你的业务是大量小包加解密比如高频的短连接 TLS 握手加速效果可能没有想象中那么夸张如果是大文件传输、批量数据加密加速收益会非常可观。4.2 非对称加密的加速效果RSA 这类非对称运算才是 KAE 真正的主场。软件实现 RSA 2048 签名单核每秒大概几千次用 KAE 加速后可以提升到数倍甚至更高。验签的提升幅度通常比签名更大因为验签的运算量相对小硬件加速的固定开销占比更低。DH 密钥交换的加速也很明显这对 TLS 握手性能影响很大。TLS 握手阶段如果 RSA 或 DH 运算慢握手延迟就高直接影响首字节时间。KAE 加速后握手阶段的 CPU 时间大幅缩短同等硬件下能支撑更高的新建连接速率。4.3 压缩解压的加速效果zlib 压缩在 Web 服务里很常见尤其是返回 JSON 或 HTML 的场景。KAE 对 zlib 的加速主要体现在压缩和解压的吞吐上。实测下来压缩的加速比通常比解压更明显因为压缩的计算量更大。不过压缩加速有个前提数据量要够大。如果只是压缩几百字节的小响应加速收益有限。对于大响应体或者批量日志压缩效果才明显。4.4 并发场景下的整体收益单次运算的加速比是一回事实际服务在并发场景下的整体收益又是另一回事。在 Nginx 做 TLS 卸载的场景下开启 KAE 后同等硬件配置下 QPS 提升幅度取决于业务模型如果是短连接、频繁握手RSA/DH 加速带来的握手性能提升会直接转化为 QPS 提升。如果是长连接、大数据传输AES 加速带来的吞吐提升更关键。如果两者都有综合提升会更明显。需要提醒的是KAE 加速单元本身也有吞吐上限。当并发量超过加速单元的处理能力时性能曲线会走平甚至因为排队而下降。所以不是开了 KAE 就无限快还是要根据实际压测找到最优并发点。5. 踩过的坑那些文档里不会写的细节5.1 引擎加载了但没生效的静默回退这是最容易踩的坑。OpenSSL 的 ENGINE 机制有个特点如果引擎加载失败它不会报错而是静默回退到软件实现。你配置里写了个不存在的路径或者引擎初始化失败程序照样跑只是没用上加速。结果就是你以为开了加速实际性能一点没变。排查方法就是前面说的用openssl engine -t -c确认引擎状态再用openssl speed对比性能。不要只看配置文件写了什么要看实际运行结果。5.2 多版本 OpenSSL 共存导致的引擎路径混乱系统里如果装了多个 OpenSSL 版本比如系统自带的加上自己编译的引擎的搜索路径可能不一致。你给系统 OpenSSL 装了引擎但业务程序链接的是另一个版本的 OpenSSL那引擎自然用不上。排查思路是确认业务程序实际链接的 OpenSSL 库路径ldd /path/to/your/binary | grep ssl然后确认这个 OpenSSL 版本的引擎目录在哪把 KAE 引擎装到对应位置。这个问题在容器环境里尤其常见因为容器里的 OpenSSL 可能是镜像自带的和宿主机不是一套。5.3 容器环境下的设备透传问题KAE 是硬件加速容器里要用的话需要把设备节点透传进容器。如果容器启动时没有映射/dev/下的 KAE 设备节点容器内的 OpenSSL 即使装了引擎也访问不到硬件会回退到软件实现。这个问题的隐蔽性在于容器里openssl engine可能显示引擎 available但实际运算时因为访问不到设备而失败回退。所以容器场景下除了装引擎还要确认设备节点透传和权限配置。5.4 特定算法组合不支持导致的回退KAE 不是支持所有 OpenSSL 的算法和模式。比如某些冷门的加密模式、某些密钥长度可能硬件不支持OpenSSL 会自动回退到软件实现。这种情况下整体性能是混合的部分运算加速、部分没加速。要精确知道哪些运算走了硬件可以开启 OpenSSL 的调试输出或者用 KAE 提供的统计工具查看加速单元的调用计数。如果发现某个关键算法没被加速可能需要调整业务侧的算法选择换成 KAE 支持的组合。5.5 升级 OpenSSL 后的兼容性有时候为了修某个安全问题需要升级 OpenSSL升级后 KAE 引擎可能因为 ABI 不兼容而加载失败。这种情况在跨大版本升级时尤其容易发生。建议升级前先确认目标 OpenSSL 版本有对应的 KAE 引擎包升级后立即用openssl engine验证。6. 把 KAE 用好的几个实战建议6.1 先压测再上线别凭感觉KAE 的加速效果和业务模型强相关别人的数据只能参考不能照搬。上线前一定要在自己的业务场景下做对比压测同样的硬件、同样的并发模型开 KAE 和不开 KAE 各跑一轮看 QPS、延迟、CPU 占用的实际差异。只有数据说话才能判断值不值得上。6.2 关注加速单元的饱和度KAE 加速单元是共享资源多个进程或线程同时用的时候会竞争。压测时要观察加速单元的利用率如果已经接近饱和再加并发也不会有收益反而可能因为排队导致延迟上升。这时候要么优化业务减少加解密调用要么考虑多机分摊。6.3 算法选型配合硬件能力如果业务侧有算法选择的灵活性尽量选 KAE 支持得好的算法组合。比如对称加密优先用 AES-CBC 或 AES-CTR非对称优先用 RSA 或 DH这些是加速效果最成熟的。国密场景下 SM4 和 SM2 也有支持但具体效果要实测。6.4 配置管理要纳入版本控制OpenSSL 的配置文件改动、引擎库的安装这些都应该纳入配置管理而不是手工在机器上改。否则换一台机器、重装一次系统很容易漏掉某个步骤导致加速悄悄失效。建议把 KAE 的安装和配置写成脚本或配置管理项保证环境一致性。6.5 监控加速是否持续生效上线不是终点。系统升级、OpenSSL 打补丁、容器重建都可能导致 KAE 引擎失效。建议在监控里加一项定期用openssl engine或性能基准测试确认加速仍然生效。一旦发现性能回退能第一时间定位到是引擎失效还是业务变化。7. 关于 KAE 与 OpenSSL 配合的几点个人体会我在实际项目里用 KAE 最大的感受是它的价值不在于快了多少倍这个数字而在于接入成本极低。很多性能优化方案要么改代码、要么改架构动辄几周的工作量。KAE 这种通过 ENGINE 机制透明接入的方式基本上半天就能验证完风险可控。但低接入成本也带来一个副作用容易被忽视。因为不改代码很多人配完就忘了系统升级、环境迁移时很容易漏掉导致加速悄悄失效还没人发现。所以我现在的习惯是凡是这种透明优化一定要配一个可观测的验证手段定期跑一下确保它一直在工作。另外一点KAE 不是银弹。它解决的是加解密和压缩这类特定运算的性能问题如果你的瓶颈在别的地方比如数据库查询、网络 IO上 KAE 也没用。先定位瓶颈再选工具这个顺序不能反。最后鲲鹏平台上的 KAE 生态还在持续完善不同发行版、不同 OpenSSL 版本的支持程度有差异。遇到问题多查对应版本的官方文档别拿一个环境的经验硬套另一个环境。硬件加速这东西细节都在版本和配置里。
返回列表