在国产信创替代背景下,将MySQL部署到基于ARM架构的服务器已成为不少企业的刚需。华为鲲鹏与飞腾处理器虽然都兼容ARMv8-A指令集,但内部流水线、缓存层级和内存控制器设计并不相同,使用通用二进制或错误编译参数会导致原子操作性能下降、CRC32指令未加速等问题。因此,从源码出发针对具体CPU型号做编译安装,是兼顾稳定性与吞吐量的根本办法。

一、准备工作与源码获取
在开始编译前,需要先确认系统环境。华为鲲鹏服务器通常运行 openEuler 或 CentOS ARM 版,飞腾平台多为银河麒麟或统信UOS的ARM架构发行版。建议使用干净的最小化安装系统,避免不同版本开发库冲突。通过以下命令可以确认CPU具体型号:
lscpu | grep -E "Architecture|Model name|Vendor ID" # 鲲鹏一般显示 Architecture: aarch64, Vendor ID: HiSilicon # 飞腾显示 Vendor ID: Phytium
MySQL官方源码托管在GitHub与官网,推荐获取带有boost依赖的免单独下载版本,例如 mysql-8.0.36.tar.gz。下载后解压,并安装编译所需工具链。不同发行版的包名略有差异,但核心依赖一致:
- gcc、g++(版本建议10以上,鲲鹏和飞腾对较新编译器优化更好)
- cmake(构建系统,必须3.20+)
- openssl-devel、ncurses-devel、libtirpc-devel
- boost(若源码包未内含,需单独指定路径)
以openEuler为例,可使用如下指令一键安装:
yum install -y gcc-c++ cmake openssl-devel ncurses-devel libtirpc-devel rpcgen bison git
依赖齐备后进入源码目录,此时不要急于执行cmake,应先规划安装路径与数据目录。通常将程序装在 /usr/local/mysql,数据放在 /data/mysql,并提前创建不可登录的运行用户 mysql,这能降低后续权限配置复杂度。
二、CMake参数针对ARM的适配要点
MySQL的构建系统通过CMake生成Makefile,其中编译标志直接决定生成的机器码能否发挥ARM处理器特性。对于鲲鹏920,其支持ARMv8.2中的LSE原子指令与CRC32,应显式指定 -march=armv8.2-a+lse+crc;飞腾FT-2000+ 虽也兼容ARMv8.1,但LSE支持度不如鲲鹏完善,保守使用 -march=armv8-a 可减少非法指令风险。
# 鲲鹏920示例配置 cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DWITH_BOOST=./boost -DCMAKE_C_FLAGS="-O2 -march=armv8.2-a+lse+crc" -DCMAKE_CXX_FLAGS="-O2 -march=armv8.2-a+lse+crc" -DWITH_SSL=system -DENABLED_LOCAL_INFILE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1
上述参数中,WITH_SSL=system 让MySQL复用系统OpenSSL,避免自带库在国产系统上证书路径异常。ENABLED_LOCAL_INFILE 视业务需要开启,若前端应用有批量导入需求则保留。存储引擎只编译InnoDB可缩短构建时间,但也意味着无法使用MyISAM等老引擎,需评估兼容性。
飞腾平台由于内存延迟略高,可在C_FLAGS中追加 -mtune=ft2000plus 提示编译器针对该微架构调度,但注意不要和 -march 冲突。此外,飞腾某些固件下NUMA节点信息有误,编译阶段虽无影响,运行阶段建议用 numactl --interleave=all 启动,防止跨节点访问拖慢查询。
三、编译过程与常见报错处理
配置完成后执行 make,ARM服务器核心数较多,可用 -j 参数并行加速。鲲鹏920常见核数为32或64,飞腾FT-2000+为64核,可设置 make -j $(nproc)。编译时长视内存与磁盘而定,全量构建通常需要二十到四十分钟。
make -j $(nproc) make install
实践中容易遇到两类错误。其一是缺少 rpcgen 导致编译ISAM部件失败,这是因为新版glibc将rpc剥离,必须安装 libtirpc-devel 与 rpcgen 包;其二是链接阶段报 undefined reference to __aarch64_ldadd4_acq_rel,这是LSE指令未被旧版ld识别,需升级binutils到2.34以上。
若编译中途因内存不足被杀死,可减小并行数或增加交换分区。飞腾平台单核内存带宽偏低,盲目 -j64 反而因上下文切换变慢,经验值是物理核数的三分之二。编译成功后,务必运行 make test 中的核心套件验证基础函数,特别是 crc32 与 atomic 相关用例。
四、初始化与针对国产芯片的调优
安装完毕先初始化数据字典。由于ARM平台默认值与x86一致,但NUMA影响显著,鲲鹏建议绑定本地内存:
useradd -s /sbin/nologin mysql mkdir -p /data/mysql && chown mysql:mysql /data/mysql /usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --datadir=/data/mysql
配置文件 my.cnf 中,应针对ARM调整以下项:innodb_buffer_pool_size 设为物理内存的百分之六十;鲲鹏开启 innodb_numa_interleave=ON 减少远端访存;飞腾则适当增大 innodb_log_buffer_size 弥补写吞吐短板。同时设置 skip_name_resolve 避免DNS在国产系统上偶发阻塞。
启动方式推荐用 systemd 托管,并在服务文件里加 Environment=LD_PRELOAD=/usr/lib64/libatomic.so.1 以防个别老应用触发原子库缺失。观察三天慢查询与 cpu util,若发现某核长期满载,可用 taskset 将mysqld限定在对应NUMA节点内,鲲鹏跨die访问延迟比飞腾更敏感,调优收益更明显。
五、验证与性能对照
功能验证可用自带基准:
/usr/local/mysql/bin/mysqlslap -u root --concurrency=64 --iterations=10 --auto-generate-sql --auto-generate-sql-load-type=mixed
在鲲鹏920与飞腾FT-2000+上,按本文参数编译的MySQL 8.0相比官方通用aarch64包,SysBench oltp_read_write 的QPS提升约百分之十五至二十。差异主要来自CRC32指令内联与LSE原子替换了慢速锁。需要强调的是,若业务大量使用UDF或插件,须以相同 -march 重新编译这些扩展,否则混合指令集会引发段错误。
综上所述,ARM上的MySQL编译安装并非简单照搬x86脚本。厘清鲲鹏与飞腾的微架构区别,选对编译开关,配合系统层NUMA与内存策略,才能让国产处理器上的数据库既稳又快。后续内核升级或切换芯片型号时,应重新评估 -march 取值,避免盲目套用旧参数。