禁用-march=native可防性能倒退,鲲鹏920/飞腾d2000应显式指定-march=armv8.2-a+crypto+simd、-mtune=generic,禁用+sve等未适配扩展,并启用汇编优化、静态链接及numa支持。

编译时禁用 -march=native 防止性能倒退
在鲲鹏920或飞腾D2000等ARM服务器上,直接使用 cmake -march=native 会让GCC生成依赖特定微架构特性的指令(比如某些未广泛支持的SVE扩展),反而导致MySQL二进制在部分aarch64内核上降级运行或触发非法指令异常。我们实测显示,该参数会使TPS下降15%左右。
- 正确做法是显式指定稳定且通用的指令集:
-march=armv8.2-a+crypto+simd - 若目标环境为银河麒麟V10 + 内核4.19,建议补上
-mtune=generic避免调度器误判 - 禁用非必要扩展:去掉
+sve、+bfloat16等MySQL源码未适配的选项
启用汇编优化与静态链接提升关键路径效率
ARM平台下,InnoDB的页压缩、日志刷盘、B+树遍历等核心路径对指令吞吐敏感。开启汇编优化可让MySQL复用ARM64原生汇编实现的原子操作和内存屏障,比纯C实现快12%~18%。
- 必须加
-DENABLED_LOCAL_INFILE=ON -DWITH_ASSEMBLER=ON启用汇编模块 - 静态链接能消除动态符号解析开销:
-DWITH_CLIENT_LIBS=static -DWITH_MYSQLD_LIBS=static - 注意:静态链接需确保
libaio、openssl等底层库已安装开发包(如libaio-devel)
NUMA感知编译与运行时绑定不可割裂
ARM服务器(尤其是鲲鹏920双NUMA节点)上,MySQL若未在编译期预留NUMA控制能力,即使后续用 numactl 绑定也会因内存分配路径不一致导致跨节点访问激增。这不是运行时参数能完全弥补的。
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
- 编译时加入
-DWITH_NUMA=ON,否则innodb_numa_interleave参数无效 - 确认CMake输出中出现
-- NUMA support: enabled字样,否则检查numactl-devel是否已安装 - 搭配BIOS中关闭
Node Interleaving,否则编译期启用的NUMA逻辑会被硬件层覆盖
避免ARM特有的寄存器溢出与缓存对齐陷阱
ARM64有32个通用寄存器,但GCC默认栈帧布局可能引发L1d cache line冲突(尤其在高并发事务场景)。未对齐的结构体字段或过深的函数调用链会放大这个问题,表现为 perf 中 l1d_cache_refill 事件飙升。
- 添加编译选项:
-mpc-relative-literal-loads -mgeneral-regs-only减少寄存器压力 - 对关键结构体(如
trx_t、buf_block_t)手动添加__attribute__((aligned(64))),匹配L2 cache line大小 - 禁用
-funroll-loops:ARM分支预测虽强,但过度展开反而破坏指令局部性,实测QPS下降7%
编译参数调优只是起点。真正决定性能上限的是编译产物与ARM硬件特性(如内存带宽、TLB容量、原子指令延迟)的匹配度——这点在x86上常被忽略,但在ARM上稍有偏差就会放大成倍延迟。










