第 11 讲 · KAE 硬件加速:不改一行业务代码的性能提升

KAE 是鲲鹏内置加解密/压缩硬件单元的用户态接入方案,业务代码零改动。下文给出环境检查清单、两种接入方式(显式 ENGINE_by_idopenssl.cnf)、openssl speed 实测数据与限制矩阵。

把固定算法交给专用硬件

鲲鹏 920 处理器内置了几个专用的硬件加速单元,专门用来做压缩、加解密、数字签名这类运算。这些运算有个共同特点:算法固定、计算量大、软件实现慢------正是硬件加速的理想场景。KAE(Kunpeng Accelerator Engine)就是让应用用上这些单元的方案。

它最大的价值是不需要改业务代码:KAE 兼容 OpenSSL、Tongsuo、BoringSSL、Zlib、ZSTD、LZ4、Snappy 这些标准接口------你继续调用原来的 API,底层自动走硬件。

硬件架构:三个单元各管一摊

KAE 背后的加速单元有三个:

单元 全称 负责
kSEC Kunpeng Security Engine 对称加解密(AES、SM4)
kHPRE Kunpeng High Performance RSA Engine 非对称加解密、数字签名(RSA、SM2、DH)
kZIP Kunpeng Hardware Acceleration Compression Engine 压缩/解压缩

软件侧的架构分两层:

  • UADK(User Space Accelerator Development Kit)------提供密码学、压缩等算法的统一编程接口
  • UACCE (User Space Accelerator)------用户态加速框架,提供统一驱动接口以降低调用路径的性能损耗

为什么强调"用户态"?因为传统的内核态驱动模型每次调用都要陷入内核,这个开销对于短小的加解密操作来说可能超过计算本身。用户态驱动让应用直接访问硬件队列,大幅降低调用开销。

环境准备与检查

KAE 的环境前提比较多,先检查再动手。

前提一:硬件与 License

bash 复制代码
# 检查加速器设备是否存在
lspci | grep -E "HPRE|SEC|ZIP|RDE"

期望输出形如 HiSilicon HPRE Engine (rev 21)

如果没有输出,说明 OS 中无 KAE 加速器设备,需要检查 License。

License 规则

  • 鲲鹏服务器 K 系列硬件,KAE 加速引擎默认开启,无需申请
  • 鲲鹏 920 新型号 处理器在 BIOS 升级至 21.23 及更新版本时,可实现免 License 使用

⚠️ 官方明确警告:如果用户未购买引擎许可证,建议不要通过 KAE 引擎调用相应算法------无 License 时走 KAE 引擎反而可能拖慢 OpenSSL。

前提二:驱动加载

bash 复制代码
# 检查驱动模块
lsmod | grep -E "uacce|hisi_qm|hisi_sec2|hisi_hpre"

# 检查设备节点
ls -al /sys/class/uacce/

没有的话手动加载:

bash 复制代码
sudo modprobe uacce
sudo modprobe hisi_qm
sudo modprobe hisi_sec2
sudo modprobe hisi_hpre

前提三:OpenSSL 版本

bash 复制代码
openssl version

需要 OpenSSL 1.1.1a 或更高(快速入门页要求 1.1.1x)。KAE 兼容的接口版本包括 OpenSSL 1.1.1x、OpenSSL 3.0.x、Tongsuo 8.4.0、BoringSSL。

安装 KAE

RPM 方式 (注意依赖顺序:libwd 必须先于 libkae):

bash 复制代码
sudo rpm -ivh uacce*.rpm hisi*.rpm libwd-*.rpm libkae*.rpm

# 验证安装
rpm -qa | grep -E "hisi|uacce|libwd|libkae"

源码方式(一键编译):

bash 复制代码
# 安装依赖
sudo yum install -y make kernel-devel-`uname -r` libtool numactl-devel \
    openssl-devel lz4-devel libzstd-devel chrpath cmake libunwind-devel patch

# 编译安装
git clone https://gitcode.com/boostkit/KAE.git -b kae2
cd KAE
sh build.sh all

方式一:业务代码显式调用引擎

最直观的方式:在 C 代码里显式获取 KAE 引擎。新建 kae_rsa.c

c 复制代码
/*
 * kae_rsa.c ------ 显式使用 KAE 引擎做 RSA 运算
 *
 * 编译:
 *   gcc -O2 -o kae_rsa kae_rsa.c -lssl -lcrypto
 * 运行:
 *   export OPENSSL_ENGINES=/usr/local/lib/engines-1.1
 *   ./kae_rsa
 */
#include <stdio.h>
#include <string.h>

/* OpenSSL 头文件 */
#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/engine.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>

int main(void)
{
    /* ── 1. 初始化 OpenSSL ── */
    SSL_load_error_strings();
    ERR_load_BIO_strings();
    OpenSSL_add_all_algorithms();

    /* ── 2. 获取 KAE 引擎句柄 ──
     * "kae" 是引擎 ID,OpenSSL 会在 OPENSSL_ENGINES 指定的目录下查找。
     * 如果找不到,e 会是 NULL ------ 这时应该退回软件实现而不是崩溃。 */
    ENGINE *e = ENGINE_by_id("kae");
    if (e == NULL) {
        fprintf(stderr, "无法加载 KAE 引擎。\n");
        fprintf(stderr, "请检查:\n");
        fprintf(stderr, "  1) export OPENSSL_ENGINES=/usr/local/lib/engines-1.1\n");
        fprintf(stderr, "  2) ls /usr/local/lib/engines-1.1/ | grep kae\n");
        fprintf(stderr, "  3) 驱动是否加载:lsmod | grep hisi\n");
        return 1;
    }

    /* ── 3. 启用异步功能(可选,默认已启用)──
     * 异步意味着加解密请求提交后不阻塞,可以流水线化处理,
     * 在高并发签名场景下能大幅提升吞吐。 */
    if (ENGINE_ctrl_cmd_string(e, "KAE_CMD_ENABLE_ASYNC", "1", 0) == 0) {
        fprintf(stderr, "设置异步模式失败(不影响继续运行)\n");
    }

    /* ── 4. 初始化引擎 ── */
    if (ENGINE_init(e) == 0) {
        fprintf(stderr, "引擎初始化失败\n");
        ENGINE_free(e);
        return 1;
    }

    /* ── 5. 创建使用该引擎的 RSA 上下文 ──
     * 关键:RSA_new_method(e) 而不是 RSA_new()。
     * 传入引擎句柄后,这个 RSA 对象的所有运算都会走 KAE 硬件加速。 */
    RSA *rsa = RSA_new_method(e);
    if (rsa == NULL) {
        fprintf(stderr, "RSA 上下文创建失败\n");
        ENGINE_finish(e);
        ENGINE_free(e);
        return 1;
    }

    printf("KAE 引擎加载成功,RSA 运算将走硬件加速。\n");

    /* ── 6. 这里写你的实际业务逻辑 ──
     * 比如 RSA_generate_key_ex / RSA_sign / RSA_verify 等,用法与普通 RSA 完全一致。 */

    /* ── 7. 清理 ── */
    RSA_free(rsa);
    ENGINE_finish(e);
    ENGINE_free(e);

    return 0;
}

编译运行

bash 复制代码
gcc -O2 -o kae_rsa kae_rsa.c -lssl -lcrypto

export OPENSSL_ENGINES=/usr/local/lib/engines-1.1
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
./kae_rsa

KAE 的控制命令

KAE 引擎提供三个控制命令,通过 ENGINE_ctrl_cmd_string 设置:

命令 说明 默认
KAE_CMD_ENABLE_ASYNC 异步开关,"0" 不使能,"1" 使能 已使能
KAE_CMD_ENABLE_SM3 SM3 加速开关 已使能
KAE_CMD_ENABLE_SM4 SM4 加速开关 已使能

注意 :官方文档中明确列出的只有这三项。不要凭印象添加其他 KAE_CMD_* 命令。

方式二:配置文件方式(推荐用于已有应用)

不改代码的另一条路:用 openssl.cnf 把 KAE 引擎挂到进程的所有 OpenSSL 调用上。

新建 openssl.cnf

ini 复制代码
openssl_conf=openssl_def

[openssl_def]
engines=engine_section

[engine_section]
kae=kae_section

[kae_section]
engine_id=kae
# OpenSSL 1.1.1x 用这个路径
dynamic_path=/usr/local/lib/engines-1.1/kae.so
# OpenSSL 3.0.x 用下面这个路径
#dynamic_path=/usr/local/lib/engines-3.0/kae.so

# 三个开关,1 表示使能
KAE_CMD_ENABLE_ASYNC=1
KAE_CMD_ENABLE_SM3=1
KAE_CMD_ENABLE_SM4=1

# ALL 表示:所有算法优先查找 KAE 引擎,若引擎不支持则切换 OpenSSL 软件计算
default_algorithms=ALL
init=1

使用方式:

bash 复制代码
export OPENSSL_CONF=/home/app/openssl.cnf
export OPENSSL_ENGINES=/usr/local/lib/engines-1.1
./your_app

default_algorithms=ALL 的语义:所有算法优先尝试 KAE,不支持时自动回退软件实现------配好之后你不需要关心哪些算法被加速了,能加速的自动加速,不能的照常工作。

如果程序需要显式加载配置 ,在 ENGINE_by_id("kae") 之前调用:

c 复制代码
OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CONFIG, NULL);

实测加速效果

openssl speed 对比:

bash 复制代码
# RSA 同步模式对比
echo "=== 软件实现 ==="
openssl speed -elapsed rsa2048

echo "=== KAE 加速 ==="
openssl speed -elapsed -engine kae rsa2048

# RSA 异步模式对比(高并发场景的关键)
echo "=== 软件实现(异步 36 任务)==="
openssl speed -elapsed -async_jobs 36 rsa2048

echo "=== KAE 加速(异步 36 任务)==="
openssl speed -engine kae -elapsed -async_jobs 36 rsa2048

官方宣称数据

场景 软件实现 KAE 加速
RSA 同步签名 724.1 sign/s 2819 sign/s
RSA 异步签名(36 jobs) 735.7 sign/s 54384.1 sign/s

同步提升约 4 倍,异步提升约 74 倍------异步的巨大提升来自硬件队列的并行处理能力。

压缩性能对比

KAEZlib 的测试方法:

bash 复制代码
cd KAEZlib/test/perftest
make

# 生成测试数据
./zip_perf -f ../../../scripts/compressTestDataset/itemdata -o itemdata.zlib -m 1 -n 1

# 压缩对比
./zip_perf -m 8 -l 10240 -n 1000        # 软件实现
./kaezip_perf -m 8 -l 10240 -n 1000     # KAE 加速

# 解压对比
./zip_perf -d -m 8 -f itemdata.zlib -n 1000
./kaezip_perf -d -m 8 -f itemdata.zlib -n 1000

官方宣称 :压缩 0.305 → 7.348 GB/s ,解压 1.482 → 9.422 GB/s

必须知道的限制

限制一:压缩类库大多只有压缩加速

压缩 解压
KAEZlib ✅ 硬件 ✅ 硬件
KAEZstd ✅ 硬件 ❌ 软件
KAELz4 ✅ 硬件 ❌ 软件
KAESnappy ✅ 硬件 ❌ 软件

只有 KAEZlib 是压缩解压都有硬件加速的。 如果你的场景是解压密集(比如读取压缩存储),选错库拿不到预期收益。

KAEZlib 单颗鲲鹏 920 上的表现:最大压缩带宽 7GB/s,最大解压带宽 8GB/s

限制二:支持范围随处理器型号变化

算法 鲲鹏 920 鲲鹏 920 新型号 / 950
SM3、MD5、SM4-CTR/XTS/CBC/ECB
AES-ECB/CTR/XTS/CBC
RSA、DH、zlib/Gzip
SM4-CFB、AES-OFB/CFB
SM2、Zstd、Lz4、Snappy

选加速库之前先确认 CPU 型号,否则方案会落空。

限制三:内核版本决定接口范围

KAE2.0 的内核支持范围:

内核版本 用户态接口 内核态加解密/压缩接口
4.19 不支持
5.4 / 5.10 / 6.6

如果你的内核是 4.19,只有用户态接口可用

限制四:版本与维护状态

  • KAE2.0 是当前维护版本
  • KAE1.0 是历史版本,不再新增特性、不再做 OS/内核适配、不再修复问题

新项目应该用 KAE2.0(基于 UADK 框架)。

卸载与故障排查

bash 复制代码
# 卸载时注意顺序:libkae 必须先于 libwd
sudo rpm -e libkae
sudo rpm -e libwd

# 驱动升级失败(重启后仍是旧版本)------通常是 initramfs 未更新
sudo dracut --force

故障排查清单

bash 复制代码
# 1) 引擎库是否存在
ls /usr/local/lib/engines-1.1/ | grep kae

# 2) 环境变量是否设置
echo $OPENSSL_ENGINES

# 3) 依赖库是否就位
ls /usr/lib64/ | grep libwd
ldd /usr/local/lib/engines-1.1/kae.so

# 4) 硬件设备是否存在
lspci | grep -E "HPRE|SEC|ZIP"

# 5) 驱动是否加载
lsmod | grep -E "uacce|hisi"

动手练习

  1. 先用 lspci | grep -E "HPRE|SEC|ZIP" 确认机器上有没有加速器------没有则后续实验无法进行:硬件加速的前提是硬件存在。
  2. openssl speed -elapsed rsa2048 与带 -engine kae 的版本各一次,记录实际加速比,和官方宣称的约 4 倍对比。
  3. openssl.cnfdefault_algorithms=ALL 去掉再跑一次,观察程序行为变化,理解该配置项的作用。

进阶与拓展

  • 调优参数取舍KAE_CMD_ENABLE_ASYNC 保持默认使能即可------异步提升约 74 倍、同步约 4 倍,差距来自请求提交后不阻塞、可流水线化;串行短连接场景拿不到异步收益,按 4 倍预期规划。openssl speed -async_jobs 官方示例取 36,实际值结合核数与并发模型实测再定。
  • 动态使能与验证 :不改 openssl.cnf 也能启用------设好 OPENSSL_ENGINES 后用 openssl engine -t kae 验证引擎能否加载;进程内按需 ENGINE_by_id("kae") + ENGINE_init 挂载、ENGINE_finish/ENGINE_free 释放(即本文代码的序列)。
  • 无硬件 / 无 License 时的退路default_algorithms=ALL 的回退语义保证"配了引擎但算法不支持"时自动走软件;机器上根本没有加速器或没买 License 时,最干净的退路是不加载 KAE------OpenSSL 软件路径零影响,两种接入方式都无需回改代码。
  • 边界与深入 :选型前先核对本文三张矩阵------CPU 型号决定算法集、内核 4.19 只有用户态接口、解压硬件加速仅 KAEZlib 一家;想再往下走,KAE2.0 开源在 gitcode.com/boostkit/KAE(kae2 分支),底座是 UADK 用户态加速框架,可从其接口文档入手绕过 OpenSSL 直接编程。

参考来源

相关推荐
hanbon1 小时前
技术参数响应表怎么写?
人工智能·招投标·ai写标书·评分表
byte轻骑兵1 小时前
【BlueZ 】sdp 模块:服务发现协议的用户态实现基础
linux·人工智能·bluez·电脑蓝牙·嵌入式蓝牙
小白学大数据1 小时前
Python 项目实战:用 Flask 构建生产级 MySQL 增删改查 REST API
开发语言·人工智能·python·mysql·flask
YangYang9YangYan1 小时前
资金分析校招 JD 拆解,现金流建模与数据分析能力怎么准备
大数据·人工智能·数据分析
名不经传的养虾人1 小时前
从0到1:企业级AI项目迭代日记 Vol.110|协作有了预算,延迟有了归因,知识有了保真
大数据·人工智能·机器人·ai编程·企业ai
孟郎郎1 小时前
Windows 环境使用 OpenCode 配置使用大模型
人工智能·windows·ai·大模型·开源软件·opencode
逐米时代1 小时前
实验检测智能管理:LIMS如何让检验任务排程和资质校验自动化
人工智能·机器学习
TK泰妞1 小时前
2026TikTok带货视频怎么做?
人工智能·prompt·音视频