新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:禁用文件访问时间记录,减少不必要的IOdiscard:开启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
相关产品推荐
相关产品推荐

