基础概念
LSE:Large System Extensions,是 ARMv8.1‑A 引入的一套硬件原子指令集。
LSE 指令用于多核下原子加减、CAS 等操作,替代旧的 LDXR/STXR 循环重试;高并发 OLTP 下显著降低锁竞争、提升 WAL、CLog 并发性能,鲲鹏 920/930 支持 LSE。
noLSE 版本:编译时关闭
‑D__ARM_LSE宏,不使用 LSE 硬件原子指令,回退到 ARMv8.0 原生 LDXR/STXR 软件重试实现,用于不支持 LSE 的 ARMv8.0 芯片(如飞腾 D2000、D1000 等)。
⚠️ noLSE仅针对 AArch64 (ARM64) 平台,x86‑64 不存在 LSE/noLSE 区分。
历史:openGauss 6.x 官方二进制包默认开启 LSE;7.0.0‑RC1 开始社区正式提供 noLSE 官方二进制包,6.x 没有官方 noLSE 包,只能源码自行编译关闭 LSE 得到 noLSE 包。
普通 LSE 版本 vs noLSE 版本对比
常用实操命令
检查 CPU 是否支持 LSE
bash
lscpu | grep lse
# 或者
cat /proc/cpuinfo | grep atomics
输出有
lse/atomics标志 → 支持 LSE,用普通包;无输出 → 必须用 noLSE 包,否则启动直接报非法指令。
查看当前 openGauss 二进制是否为 noLSE 编译
bash
pg_config | grep ARM_LSE
# 如果输出-D__ARM_LSE代表LSE版本;无输出代表noLSE版本
源码编译生成 noLSE 包
修改
build/script/utils/make_compile.sh,全部删除所有‑D__ARM_LSE编译选项,再执行 build.sh 打包,产出 noLSE 二进制包openGauss。
选型建议
鲲鹏 920/930、飞腾 D3000:CPU 支持 LSE,直接用官方普通 LSE 版本,获取完整性能。
飞腾 D2000/D1000 等 v8.0 芯片:强制使用 noLSE 包,不要直接跑官方默认 ARM 包,会直接崩溃。
noLSE 性能损失:低并发业务几乎无感;高并发 OLTP 要做压力评估,核数越高性能损失越大,属于硬件指令层面的代价,无法靠参数调优完全抹平。
常见坑
6.0.x 官方没有发布 noLSE 二进制包,网上下载到所谓 “6.0.x noLSE” 都是用户自行编译,注意版本一致性;7.0 及以后可以直接下载官方 noLSE 包。
不要混用:LSE 编译二进制不能跑在无 LSECPU;noLSE 包也可以跑在支持 LSE 的 CPU 上,只是浪费硬件能力,性能不如 LSE 版本。
虚拟机:部分 ARM 虚拟化环境会不透传 LSE 指令,即使物理 CPU 支持,虚拟机内部也需要使用 noLSE 包。