单台虚拟机MySQL顺序插入性能异常低下的原因排查咨询
这种情况确实挺闹心的——明明软硬件配置、Docker环境都保持一致,结果偏偏有一台机器的插入性能差了好几倍。结合你的场景,我整理了几个优先级最高的排查方向,你可以一步步验证:
存储IO是首当其冲的嫌疑:CPU和内存参数看起来一致,但磁盘性能才是批量插入的核心瓶颈。你可以用
iostat -x 1实时查看这台机器的磁盘IO使用率、读写延迟,也可以用fio跑个简单的写入测试对比:fio --name=test_seq_write --ioengine=sync --rw=write --bs=16k --numjobs=1 --size=1G --runtime=60 --time_based重点看吞吐量(bw)和延迟(lat),和正常机器对比差异。另外还要确认Docker数据卷是不是挂载在性能拉胯的存储上——比如机械硬盘、超负载的共享存储,或者云环境里的低IO实例。
Docker容器的资源限制被忽略了:有没有可能这台机器的MySQL容器被悄悄设置了资源配额?用
docker inspect <你的MySQL容器ID>查看HostConfig字段,重点看BlkioWeight(IO权重)、CpuShares(CPU份额)、Memory(内存限制)这些参数,会不会是IO权重设得太低,导致容器抢不到足够的磁盘IO资源?MySQL配置有没有隐性差异:虽然Docker镜像一致,但会不会启动时挂载了自定义的
my.cnf,或者传了不同的启动参数?比如innodb_flush_log_at_trx_commit这个参数,设成1是最安全但写入最慢的,要是其他机器设成2或者0,性能差距会非常明显。你可以在容器里执行:SHOW VARIABLES LIKE 'innodb%flush%';把结果和正常机器对比,看看有没有关键参数不一样。
系统IO调度器不匹配:Debian Bullseye不同的存储介质适合不同的IO调度器,比如SSD用
mq-deadline或者noop(none)效率更高,而机械盘适合deadline。如果这台机器用了cfq调度器,对顺序写入的性能影响会很大。用这个命令查看当前调度器:cat /sys/block/$(df /var/lib/docker | tail -1 | awk '{print $1}' | cut -d'/' -f3)/queue/scheduler对比正常机器的设置,必要时调整调度器。
宿主机的资源竞争:如果这台是虚拟机,那宿主机的资源占用情况也得排查。是不是宿主机上其他虚拟机在疯狂读写磁盘,把IO带宽占满了?可以联系运维在宿主机上用
iostat、vmstat看看整体的磁盘、CPU负载,确认你的VM有没有被“抢资源”。文件系统及挂载参数差异:同样是Debian,有没有可能这台机器的Docker数据目录用了不同的文件系统?比如ext4和xfs的性能差异,或者挂载时没开
noatime、nodiratime这些能减少磁盘IO的参数。用mount命令查看挂载点的参数,和正常机器做对比。内核缓存参数的影响:系统的
vm.dirty_ratio和vm.dirty_background_ratio参数决定了脏页刷盘的时机,如果这台机器的这些参数设得太小,系统会频繁触发刷盘操作,拖慢写入速度。用sysctl -a | grep dirty查看参数,对比正常机器的配置。
备注:内容来源于stack exchange,提问作者Paflow

