KAE 是鲲鹏内置加解密/压缩硬件单元的用户态接入方案,业务代码零改动。下文给出环境检查清单、两种接入方式(显式
ENGINE_by_id与openssl.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"
动手练习
- 先用
lspci | grep -E "HPRE|SEC|ZIP"确认机器上有没有加速器------没有则后续实验无法进行:硬件加速的前提是硬件存在。 - 跑
openssl speed -elapsed rsa2048与带-engine kae的版本各一次,记录实际加速比,和官方宣称的约 4 倍对比。 - 把
openssl.cnf的default_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 直接编程。
参考来源
- 鲲鹏 · KAE 加速引擎 --- 硬件单元架构、算法支持矩阵、处理器差异、内核版本要求与 License 规则
- openEuler · 使用 KAE 加速引擎 ---
ENGINE_by_id("kae")调用序列、KAE_CMD_*控制命令、openssl.cnf 完整配置与验证命令 - 鲲鹏 BoostKit 概述 --- KAE 在 BoostCore 基础加速库中的定位与十大库清单