开发者
资源
鲲鹏 920 上 MySQL 性能调优:从 NUMA 内存分配到编译器指令优化全链路实践
鲲鹏 920 上 MySQL 性能调优:从 NUMA 内存分配到编译器指令优化全链路实践
原创
发表于06/02
4350

一、问题核心定位:内存访问与指令优化双重瓶颈

(一)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 页校验和计算成为热点,影响写入吞吐。


二、调优前置准备:环境搭建与依赖配置

配置项具体选型选型原因
操作系统openEuler 22.03 LTS (ARM64)原生支持鲲鹏 NUMA 调度优化,内核内存分配策略完善
编译器GCC 12.1.0支持 ARMv8.2-A CRC32/Crypto 扩展,优化 NEON 指令生成
内核版本Linux 5.10+支持 NUMA Balancing,完善透明大页控制接口
MySQL 版本8.0.34(源码编译)最新稳定版,支持 ARM64 原子操作优化
存储引擎InnoDB业务主力引擎,支持缓冲池多实例与 NUMA 感知
测试工具sysbench、tpcc-mysql标准压测工具,支持并发事务与延迟统计

三、核心调优步骤:从编译到运行时全链路优化

(一)源码编译启用 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

(四)操作系统内核参数优化

# /etc/sysctl.d/99-mysql-tuning.conf

# 内存与 NUMA 优化
vm.swappiness = 1
vm.dirty_ratio = 40
vm.dirty_background_ratio = 10
vm.zone_reclaim_mode = 0

# 网络层优化(降低 TCP 延迟)
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 10
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535

# 文件句柄与进程限制
fs.file-max = 2097152
fs.nr_open = 2097152

# 透明大页控制(MySQL 建议关闭 THP)
kernel.numa_balancing = 0

关闭透明大页:

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

# 永久生效
grubby --update-kernel=ALL --args="transparent_hugepage=never"

四、调优效果验证与总结

使用 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
测试场景TPSP99 延迟CPU 占用内存分布
x86 + MySQL 8.012,50018ms75%均匀
鲲鹏初始部署6,80085ms92%Node0:80% Node1:20%
鲲鹏 + 源码编译优化9,20045ms88%Node0:80% Node1:20%
鲲鹏 + NUMA 配置优化11,80022ms82%Node0:50% Node1:50%
鲲鹏 + 全链路优化13,20016ms80%Node0:50% Node1:50%

关键收益总结:

  1. 编译器指令优化:启用 -march=armv8.2-a+crypto+crc 后,CRC32 计算走硬件指令,CPU 占用下降 8%,写入 TPS 提升 35%
  2. NUMA 内存均衡innodb_numa_interleave=1 配合 numactl 绑核后,跨节点内存访问减少,P99 延迟从 85ms 降至 22ms
  3. 缓冲池多实例:8 个缓冲池实例减少锁竞争,并发读取吞吐提升 40%

生产环境建议:双路鲲鹏服务器务必配置 NUMA 交错分配;源码编译时务必启用 ARM 硬件加速指令;建议关闭 THP 避免内存碎片影响数据库稳定性。

收藏举报
Level 1
0
帖子
0
粉丝
0
获赞