本文介绍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_waits和Innodb_row_lock_time监控项的指标升高。
您可以在控制台的
页面,单击性能趋势页签,查看行锁内的监控项,解决方案
您可以通过
show engine innodb status;
命令查看是否有大量会话处于Lock wait
状态,如果有,说明行锁冲突比较严重,需要通过优化热点更新、降低事务大小、及时提交事务等方法避免行锁冲突。