华为云鲲鹏服务器上MySQL 8.0的IO性能调优:从EXT4到XFS的抉择
上个月帮一个客户做数据库迁移,把一套MySQL 8.0从X86物理机迁到了华为云鲲鹏通用计算增强型 kc1 实例上。迁移完成后,OLTP压测(sysbench)的TPS只有原机器的60%,iostat显示磁盘%util长期打满,但IOPS数值并不高。排查了一圈,最后发现问题出在文件系统和鲲鹏架构的IO调度器上。
一、 现象:IO瓶颈但带宽未满
环境:鲲鹏920(8核32G),系统盘用华为云超高IO(SSD),挂载了一块1TB的数据盘(也是超高IO)。MySQL数据目录放在数据盘上。压测时iostat -x 1显示await(平均等待时间)高达20ms以上,%util接近100%,但rkB/s和wkB/s远未达到磁盘标称带宽。
二、 根因分析:EXT4在ARM+SSD下的“水土不服”
原X86机器用的是EXT4,迁移时为了省事,数据盘也格式化成了EXT4。但鲲鹏架构下,EXT4的日志(journal)提交策略和高IOPS SSD的配合存在瓶颈:每次fsync(MySQL的innodb_flush_log_at_trx_commit=1)都会触发EXT4的日志同步,在ARM的多核并发下,EXT4的全局锁竞争比X86更明显。
三、 调优实践:XFS + IO调度器 + 内核参数
1. 文件系统切换:EXT4 → XFS
XFS在处理大文件和高并发IO时,锁的粒度更细,尤其适合数据库场景。我们将数据盘重新格式化为XFS,并调整了挂载参数:
bash
mkfs.xfs -f -l size=128m -n size=8192 /dev/vdb
mount -o noatime,nodiratime,nobarrier,logbufs=8,logbsize=256k /dev/vdb /data
关键参数说明:nobarrier(SSD有掉电保护时可开,云盘一般有)、logbsize=256k(增大日志缓冲区,减少日志写次数)。
2. IO调度器调整
鲲鹏云服务器的SSD盘默认调度器是mq-deadline,对于MySQL这种随机IO密集的场景,none(即noop)往往表现更好,因为SSD本身有复杂的FTL层做调度。
bash
echo none > /sys/block/vdb/queue/scheduler
# 同时增大队列深度
echo 1024 > /sys/block/vdb/queue/nr_requests
3. MySQL参数配合
既然文件系统换了,MySQL的innodb_io_capacity也要相应调整。超高IO盘标称IOPS约33000,我们把参数从默认的200调到了8000,让InnoDB更积极地刷脏页,避免checkpoint抖动。
ini
innodb_io_capacity = 8000
innodb_io_capacity_max = 16000
innodb_flush_neighbors = 0 # SSD上关闭邻居页刷新
innodb_log_buffer_size = 64M
四、 压测结果对比
同样sysbench(128并发、10张表、每表100万行):
调优前(EXT4):TPS ≈ 2400,await ≈ 22ms
调优后(XFS+none):TPS ≈ 4100,await ≈ 4ms
TPS提升了70%,基本追平甚至略超原X86物理机的表现。
五、 总结
云服务器迁移不是“数据拷过去就完事”。ARM架构 + SSD云盘的组合,在文件系统(XFS优于EXT4)、IO调度器(none优于mq-deadline)和数据库参数上都需要重新适配。建议做鲲鹏迁移的兄弟,先用fio和sysbench跑一遍基线,再逐项调优,数据会告诉你答案。
- 点赞
- 收藏
- 关注作者
评论(0)