MariaDB性能骤降排查:如何区分症状与根因
针对遗留系统定时性能骤降的排查方案
一、数据库层面深度排查(核心方向,所有查询变慢大概率源于DB阻塞)
- 实时抓取锁状态与进程快照:性能骤降瞬间,立刻执行以下命令并保存结果:
SHOW ENGINE INNODB STATUS;:重点查看TRANSACTIONS模块的LOCK WAIT条目,获取阻塞事务的ID、关联表、锁定语句;同时检查BUFFER POOL AND MEMORY模块判断缓存是否失效。SHOW FULL PROCESSLIST;:筛选状态为Locked、Waiting for table metadata lock、Waiting for row lock的进程,记录连接ID、执行语句、来源IP/用户。
- 开启元数据锁与死锁日志:临时配置MariaDB参数(无需重启,重启后失效):
SET GLOBAL innodb_print_all_deadlocks = 1;SET GLOBAL log_warnings = 2;
同时短时间开启通用日志(注意磁盘占用):SET GLOBAL general_log = 1;,异常时段结束后立刻关闭,通过日志定位触发锁阻塞的源头语句。
- 检查事务隔离级别与长事务:执行
SELECT @@GLOBAL.tx_isolation, @@SESSION.tx_isolation;,若存在脚本强制设置REPEATABLE READ以外的级别(如SERIALIZABLE),可能引发大范围锁;另外执行SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX WHERE TIME_TO_SEC(TIMEDIFF(NOW(), trx_started)) > 60;,找出运行超过1分钟的长事务,这类事务极易阻塞其他请求。
二、Windows定时任务追踪(无规律卡顿的高概率诱因)
- 给所有定时任务添加执行日志:编辑任务计划程序中的任务,将操作的命令行改为类似:
记录任务的启动/结束时间、输出内容、报错信息,对比性能骤降时间点,排查是否有任务同步执行。php.exe "C:\scripts\legacy_task.php" >> "C:\task_logs\legacy_task_%date:~0,4%%date:~5,2%%date:~8,2%.log" 2>&1 - 通过事件查看器追踪任务状态:打开「事件查看器→Windows日志→应用程序」,筛选事件ID为100(任务启动)、101(任务完成)、200(操作启动)、201(操作完成)的条目,确认任务实际执行时间,排查是否存在任务延迟启动、后台挂起(未触发完成事件)的情况。
- 逐步禁用排查:暂时禁用非核心定时任务,每次禁用后观察1-2天,若卡顿消失,再逐个恢复定位问题任务。
三、PHP进程与请求追踪(Windows环境替代Datadog的方案)
- 用Process Explorer监控PHP进程:卡顿时段打开Process Explorer,查看
php-cgi.exe或php.exe进程的线程状态,右键进程→「属性→线程」,查看线程调用栈,判断是否卡在数据库调用或文件IO;同时观察进程的句柄数,若句柄数暴增可能是资源泄漏。 - 开启PHP慢请求日志:针对各版本PHP修改
php.ini:
重启PHP服务后,卡顿时段的慢日志会包含请求的调用栈和执行语句,可定位到具体脚本。slowlog = "C:\php_logs\php_slow_%s.log" request_slowlog_timeout = 5 ; 记录超过5秒的请求 - 追踪数据库连接来源:卡顿时段执行
netstat -ano | findstr :3306,统计ESTABLISHED状态的连接数,对比正常时段;记录异常连接的PID,通过Process Explorer关联到对应的PHP进程,再结合站点日志定位到发起请求的脚本。
四、系统层面隐藏瓶颈排查
- 监控磁盘IO性能:打开「性能监视器」,添加
PhysicalDisk计数器:% Disk Time、Avg. Disk Queue Length,若% Disk Time接近100%或队列长度持续大于2,说明磁盘IO已达瓶颈(尤其是机械硬盘承载大表操作时)。 - 检查数据库缓存命中率:执行以下命令,若缓存命中率低于95%,说明缓存失效导致大量磁盘读:
- 查询缓存:
SHOW STATUS LIKE 'Qcache_hit_rate';(若开启) - InnoDB缓冲池:
SELECT (Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads)/Innodb_buffer_pool_read_requests * 100 AS hit_rate FROM INFORMATION_SCHEMA.GLOBAL_STATUS;
- 查询缓存:
- 排查网络延迟:在应用服务器与数据库服务器之间执行
ping -t <DB_IP>,卡顿时段观察是否有丢包或延迟骤增;同时用tracert <DB_IP>检查路由节点是否异常。
可能遗漏的关键点
- 元数据锁阻塞:常规慢查询日志无法捕获元数据锁导致的全局阻塞,需通过
SHOW ENGINE INNODB STATUS和通用日志排查。 - Windows定时任务隐性挂起:部分任务因权限、资源不足等原因后台挂起,任务计划程序显示“已完成”但实际未释放数据库连接。
- PHP长连接泄漏:旧版本PHP(如5.2)的长连接未正确关闭,导致数据库连接池耗尽,所有新请求排队等待连接。
- 磁盘IO瓶颈:CPU、内存无异常不代表磁盘无压力,大表的批量读写极易占满磁盘IO带宽,拖慢所有数据库操作。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

