背景:
aws RDS for MySQL不能通过top命令来查看占用cpu的进程信息,那么我们如何定位cpu利用率较高的线程在执行的sql是什么呢?
下面为您介绍通过增强监控的Process List查看cpu利用率高的问题。
假如pid = 24230
#第一步,查看24230的thread_id和PROCESSLIST_ID以及正在运行的函数名称。
select thread_id,name ,PROCESSLIST_ID,THREAD_OS_ID from performance_schema.threads where thread_os_id='24230';
| thread_id | name | PROCESSLIST_ID | THREAD_OS_ID |
+-----------+-----------------+----------------+--------------+
| 1 | thread/sql/main | NULL | 24230 |
+-----------+-----------------+----------------+--------------+
#第二步,查看thread_id为1的进程自行的具体sql,由于thread_id是程序的入口函数所以没有正在执行的sql文本。
select sql_text from performance_schema.events_statements_current where thread_id = 1 \G;
#第三步,可以通过下面的sql进一步确定验证。
select * from sys.processlist where thd_id=1\G;
根据上述步骤排查确定sql后,通过explain和profile来分析具体的sql(explain和profile的使用网上已经有大量的文章介绍这里就不过多介绍了)。如果是后台线程占用cpu就需要进一步分析是否是相关的参数设置不合理。由于RDS for MySQL并不是开源软件,不像开源MySQL可以通过相应的函数对应的源码来分析问题,但依然可以按分析开源MySQL的方法来分析RDS for MySQL,虽然源码会略微不同,但整体的设计理念是十分近似的。