You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

新PCIe服务器MariaDB迁移后性能异常技术咨询

MariaDB新PCIe服务器性能不如旧机器的排查与优化方案

哇,这种新硬件跑不过老机器的情况我碰过好几次,先别慌,咱们一步步拆解问题——毕竟两台机器的OS、MariaDB版本、硬件细节都有差异,直接复制配置肯定踩坑。下面是我整理的排查步骤和优化方向:

一、先排查迁移与版本兼容问题

直接拷贝二进制文件迁移虽然省事,但小版本升级也可能埋坑:

  • 立即执行mysql_upgrade -u root -p,确保系统表同步到10.1.26的版本。老机器是10.1.21,新机器是10.1.26,虽然是同系列小版本,但部分系统表结构可能有变化,没升级的话会导致隐性性能损耗甚至错误。
  • 检查MariaDB启动日志(/var/log/mysql/error.log),有没有报错或者警告,比如InnoDB初始化时的异常、表空间加载问题。

二、修正操作系统层面的差异

Debian 9和FreeBSD 11的内核、IO调度、文件系统默认配置差很多,尤其是针对NVMe这种高速存储:

1. 调整IO调度器

NVMe不需要传统的IO调度算法(比如CFQ),直接用noop或者none就能发挥最大性能:

# 临时生效
echo noop > /sys/block/nvme0n1/queue/scheduler
# 永久生效:编辑/etc/rc.local,添加上面的命令(Debian 9默认启用rc.local)

验证是否生效:cat /sys/block/nvme0n1/queue/scheduler,确保[noop]在最前面。

2. 优化文件系统挂载参数

如果你的NVMe分区用的是ext4,修改/etc/fstab,添加这些参数:

UUID=xxx / ext4 defaults,noatime,nodiratime,discard 0 1
  • noatime/nodiratime:禁用文件访问时间记录,减少不必要的IO
  • discard:开启TRIM,让NVMe及时回收空闲空间,保持性能

3. 内核参数优化

编辑/etc/sysctl.conf,添加以下参数,然后执行sysctl -p生效:

# 减少内存交换倾向
vm.swappiness = 10
# 调整脏页写入阈值,适配NVMe的高速IO
vm.dirty_ratio = 30
vm.dirty_background_ratio = 10
# 增大TCP连接队列,避免并发请求被拒绝
net.core.somaxconn = 65535
# 禁用透明大页(可能导致InnoDB性能波动)
echo never > /sys/kernel/mm/transparent_hugepage/enabled

三、重新适配MariaDB配置(别直接复制老机器的!)

新机器有128G内存,老机器只有64G,直接复用配置完全浪费硬件资源,重点调整以下参数:

1. 内存核心参数

# InnoDB缓冲池,设为物理内存的70-80%(128G的话建议96G)
innodb_buffer_pool_size = 96G
# 缓冲池分实例,每16G一个实例,96G就设8个
innodb_buffer_pool_instances = 8
# 临时表内存上限,大内存可以调大
tmp_table_size = 64M
max_heap_table_size = 64M

2. InnoDB IO优化(针对NVMe)

# 日志文件大小,NVMe可以设到4G(改完要停库,删除旧的ib_logfile0/1再启动!)
innodb_log_file_size = 4G
# 日志缓冲大小,大并发下调大
innodb_log_buffer_size = 64M
# 刷新日志的策略:如果不需要严格ACID,设为2(性能提升明显);要严格一致性设为1,配合下面的flush方法
innodb_flush_log_at_trx_commit = 2
# NVMe推荐用O_DIRECT_NO_FSYNC,跳过文件系统缓存直接写盘,同时减少fsync调用
innodb_flush_method = O_DIRECT_NO_FSYNC
# 开启异步IO,提升并发性能
innodb_read_io_threads = 64
innodb_write_io_threads = 64
innodb_io_capacity = 10000
innodb_io_capacity_max = 20000

3. 线程与连接优化

# 线程缓存,避免频繁创建销毁线程,设为64足够应对大部分场景
thread_cache_size = 64
# 打开表缓存,大内存机器调大
table_open_cache = 4096
table_definition_cache = 2048
# 最大连接数,根据并发需求调整,别设太大(比如1000足够)
max_connections = 1000

四、修正基准测试的方式

确保测试条件和老机器完全一致,避免误判:

  • 测试前预热:先跑1-2次mysqlslap测试,让InnoDB缓冲池加载数据,新机器第一次跑缓存是空的,肯定不如老机器有缓存的情况。
  • 统一测试参数:比如并发数、迭代次数、SQL语句要完全相同,举个例子:
mysqlslap --user=root --password=yourpass --concurrency=100 --iterations=5 --create-schema=test_db --query="SELECT * FROM your_table WHERE id=RAND()" --verbose
  • 监控实时性能:测试时用iostat -x 1看NVMe的IO使用率(%util),如果一直100%说明IO是瓶颈;用top看CPU使用率,有没有单线程瓶颈;用SHOW ENGINE INNODB STATUS看缓冲池命中率(要接近100%)、锁等待情况。

五、后续排查方向

如果上面的调整后还是没改善:

  • 对比两台机器的mysqlslap输出细节,比如QPS、平均响应时间、错误数,看具体是哪块指标差。
  • 用pt-query-digest分析慢查询日志,看有没有特定SQL在新机器上变慢。
  • 检查CPU是否有睿频限制:Debian 9默认可能开启了CPU节能模式,用cpupower frequency-info看,设置为performance模式:
cpupower frequency-set --governor performance

内容的提问来源于stack exchange,提问作者2ge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:29:51