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

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:
    slowlog = "C:\php_logs\php_slow_%s.log"
    request_slowlog_timeout = 5 ; 记录超过5秒的请求
    
    重启PHP服务后,卡顿时段的慢日志会包含请求的调用栈和执行语句,可定位到具体脚本。
  • 追踪数据库连接来源:卡顿时段执行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>检查路由节点是否异常。

可能遗漏的关键点

  1. 元数据锁阻塞:常规慢查询日志无法捕获元数据锁导致的全局阻塞,需通过SHOW ENGINE INNODB STATUS和通用日志排查。
  2. Windows定时任务隐性挂起:部分任务因权限、资源不足等原因后台挂起,任务计划程序显示“已完成”但实际未释放数据库连接。
  3. PHP长连接泄漏:旧版本PHP(如5.2)的长连接未正确关闭,导致数据库连接池耗尽,所有新请求排队等待连接。
  4. 磁盘IO瓶颈:CPU、内存无异常不代表磁盘无压力,大表的批量读写极易占满磁盘IO带宽,拖慢所有数据库操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 23:42:04