本文介绍RDS MySQL活跃线程数高的原因及解决方案。

背景信息

活跃线程数或活跃连接数是衡量MySQL负载状态的关键指标,通常来说一个比较健康的实例活跃连接数应该低于10,高规格和高QPS的实例活跃连接数可能20、30,如果出现几百、上千的活跃连接数,说明出现了SQL堆积和响应变慢,严重时会导致实例停止响应,无法继续处理SQL请求。

查看活跃线程数

RDS管理控制台提供多种查看活跃线程数的方法:

  • 监控与报警

    在控制台的监控与报警页面,单击标准监控页签内的引擎监控,可以查看实例的活跃线程数监控信息。

    活跃线程监控
  • 数据库自治服务DAS

    在控制台的自治服务 > 性能趋势页面,单击性能趋势页签,查看会话连接情况,如果线程数过高,说明实例会话有阻塞。

    自治服务性能趋势

排查慢SQL堆积问题

  • 现象

    如果通过监控发现活跃线程数升高,首先通过show processlist;命令查看是否有慢SQL。如果有很多扫描行数太多的SQL,容易导致活跃连接数升高。

    您可以在控制台的自治服务 > 一键诊断页面,单击会话管理页签,查看当前正在执行的SQL。

    结束会话
  • 解决方案

    使用SQL限流功能或结束会话,降低慢SQL的影响。

排查表缓存(Table Cache)问题

  • 现象

    Table Cache不足时,会导致大量SQL处于Opening table状态,在QPS过高或者表很多的场景容易出现。

  • 解决方案

    将参数table_open_cache(不需要重启实例)和table_open_cache_instances(需要重启实例)调大。

排查元数据锁(MDL)问题

  • 现象

    出现MDL锁时,会导致大量SQL处于Waiting for table metadata lock的状态,在DDL prepare和commit阶段,DDL语句需要获取MDL锁,如果表上有未提交事务或慢SQL,会阻塞DDL操作,DDL操作又会阻塞其他的SQL,最终导致活跃线程数升高。

  • 解决方案

    中止未提交事务、慢SQL或正在执行的DDL都可以解决问题。

排查行锁冲突问题

  • 现象

    行锁冲突表现为Innodb_row_lock_waitsInnodb_row_lock_time监控项的指标升高。

    您可以在控制台的自治服务 > 性能趋势页面,单击性能趋势页签,查看行锁内的监控项,

    行锁
  • 解决方案

    您可以通过show engine innodb status;命令查看是否有大量会话处于Lock wait状态,如果有,说明行锁冲突比较严重,需要通过优化热点更新、降低事务大小、及时提交事务等方法避免行锁冲突。