一、问题核心定位:内存访问与指令优化双重瓶颈
(一)InnoDB 缓冲池跨 NUMA 节点分配,内存访问延迟不均
MySQL 迁移至鲲鹏 920 双路服务器后,TPC-C 测试显示 TPS 波动大,P99 延迟高达 200ms。numastat -m 显示 Node 0 内存占用 80%,Node 1 仅 20%,缓冲池未均匀分布在两个 NUMA 节点上。跨节点内存访问导致部分查询延迟飙升,CPU 等待内存的时间占比达 25%。
(二)默认编译未启用 ARM NEON/SVE 加速,CRC32 校验走软件路径
MySQL 源码默认编译未针对 ARM64 优化,perf record 显示 crc32() 函数占用 8% CPU,未走鲲鹏硬件 CRC32 指令。InnoDB 页校验和计算成为热点,影响写入吞吐。
二、调优前置准备:环境搭建与依赖配置
三、核心调优步骤:从编译到运行时全链路优化
(一)源码编译启用 ARM 硬件加速指令
下载 MySQL 源码并配置编译参数,启用鲲鹏硬件 CRC32 与原子操作:
(四)操作系统内核参数优化
关闭透明大页:
四、调优效果验证与总结
使用 sysbench 进行 OLTP 压测(64 表,每表 1000 万行,64 并发):
关键收益总结:
- 编译器指令优化:启用
-march=armv8.2-a+crypto+crc 后,CRC32 计算走硬件指令,CPU 占用下降 8%,写入 TPS 提升 35% - NUMA 内存均衡:
innodb_numa_interleave=1 配合 numactl 绑核后,跨节点内存访问减少,P99 延迟从 85ms 降至 22ms - 缓冲池多实例:8 个缓冲池实例减少锁竞争,并发读取吞吐提升 40%
生产环境建议:双路鲲鹏服务器务必配置 NUMA 交错分配;源码编译时务必启用 ARM 硬件加速指令;建议关闭 THP 避免内存碎片影响数据库稳定性。
一、问题核心定位:内存访问与指令优化双重瓶颈
(一)InnoDB 缓冲池跨 NUMA 节点分配,内存访问延迟不均
MySQL 迁移至鲲鹏 920 双路服务器后,TPC-C 测试显示 TPS 波动大,P99 延迟高达 200ms。
numastat -m显示 Node 0 内存占用 80%,Node 1 仅 20%,缓冲池未均匀分布在两个 NUMA 节点上。跨节点内存访问导致部分查询延迟飙升,CPU 等待内存的时间占比达 25%。(二)默认编译未启用 ARM NEON/SVE 加速,CRC32 校验走软件路径
MySQL 源码默认编译未针对 ARM64 优化,
perf record显示crc32()函数占用 8% CPU,未走鲲鹏硬件 CRC32 指令。InnoDB 页校验和计算成为热点,影响写入吞吐。二、调优前置准备:环境搭建与依赖配置
三、核心调优步骤:从编译到运行时全链路优化
(一)源码编译启用 ARM 硬件加速指令
下载 MySQL 源码并配置编译参数,启用鲲鹏硬件 CRC32 与原子操作:
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.34.tar.gz tar xzf mysql-8.0.34.tar.gz && cd mysql-8.0.34 # 配置编译参数 cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_C_FLAGS="-march=armv8.2-a+crypto+crc -mtune=tsv110 -O3" \ -DCMAKE_CXX_FLAGS="-march=armv8.2-a+crypto+crc -mtune=tsv110 -O3" \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_SSL=system \ -DWITH_ZLIB=bundled \ -DMYSQL_DATADIR=/data/mysql \ -DSYSCONFDIR=/etc/mysql \ -DWITH_NUMA=ON make -j$(nproc) && make install ``` 验证 CRC32 硬件加速是否生效: ```bash # 查看编译后的符号表 nm /usr/local/mysql/bin/mysqld | grep crc32 # 应显示硬件 CRC32 调用而非软件实现 ``` ### (二)配置 NUMA 感知的 InnoDB 缓冲池 编辑 MySQL 配置文件,启用 NUMA 交错分配与多实例缓冲池: ```ini # /etc/mysql/my.cnf [mysqld] # NUMA 内存分配策略 innodb_numa_interleave = 1 # 缓冲池配置(双路鲲鹏 920,每路 128GB 内存) innodb_buffer_pool_size = 192G innodb_buffer_pool_instances = 8 innodb_buffer_pool_chunk_size = 256M # 日志与 IO 优化 innodb_log_file_size = 2G innodb_log_buffer_size = 64M innodb_flush_log_at_trx_commit = 2 innodb_flush_method = O_DIRECT # 并发线程优化 innodb_read_io_threads = 16 innodb_write_io_threads = 16 innodb_purge_threads = 8 # 事务锁优化 innodb_lock_wait_timeout = 50 innodb_rollback_on_timeout = ON ``` ### (三)NUMA 绑核与中断均衡配置 **1. MySQL 进程 NUMA 绑定启动** ```bash # 启动脚本,绑定到两个 NUMA 节点并启用交错分配 numactl --interleave=all --cpunodebind=0,1 \ /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/mysql/my.cnf & # 或 systemd service 配置 [Service] ExecStart=/usr/bin/numactl --interleave=all --cpunodebind=0,1 \ /usr/local/mysql/bin/mysqld --defaults-file=/etc/mysql/my.cnf ``` **2. 网卡中断绑定(避免网络处理与 MySQL 竞争 CPU)** ```bash # 将网卡中断绑定到 Node 0 的 CPU 0-7,MySQL 使用 Node 0/1 的 CPU 8-31 for i in {0..7}; do irq=$(cat /proc/interrupts | grep eth0-TxRx-$i | awk -F: '{print $1}' | tr -d ' ') echo $i > /proc/irq/$irq/smp_affinity_list done(四)操作系统内核参数优化
关闭透明大页:
四、调优效果验证与总结
使用 sysbench 进行 OLTP 压测(64 表,每表 1000 万行,64 并发):
sysbench oltp_read_write \ --mysql-host=127.0.0.1 \ --mysql-port=3306 \ --mysql-user=root \ --mysql-password=xxx \ --mysql-db=sbtest \ --tables=64 \ --table-size=10000000 \ --threads=64 \ --time=300 \ --report-interval=10 \ run关键收益总结:
-march=armv8.2-a+crypto+crc后,CRC32 计算走硬件指令,CPU 占用下降 8%,写入 TPS 提升 35%innodb_numa_interleave=1配合numactl绑核后,跨节点内存访问减少,P99 延迟从 85ms 降至 22ms生产环境建议:双路鲲鹏服务器务必配置 NUMA 交错分配;源码编译时务必启用 ARM 硬件加速指令;建议关闭 THP 避免内存碎片影响数据库稳定性。