查看原文
其他

如何快速定位当前数据库消耗CPU最高的sql语句?

这是Bella酱的第 173 期分享

概述

你好呀,我是Bella酱~

今天我们聊一个MySQL的性能排查问题,希望正在读此文的你可以掌握这个小技巧,提升自己的数据库问题排查能力哟!

如果是Oracle数据库我们可以很容易通过sql来定位到当前数据库中哪些消耗CPU高的语句,而mysql数据库可以怎么定位呢?这里用一个简单例子说明下。

主要是了解如何定位的思路,具体看官网介绍:

One of our customers recently asked whether it is possible to identify, from the MySQL side, the query that is causing high CPU usage on his system. The usage of simple OS tools to find the culprit has been a widely used technique for a long time by PostgreSQL and Oracle DBAs, but it didn’t work for MySQL as historically we’ve lacked the instrumentation to match an OS thread with an internal processlist thread – until recently.

Percona added support to map processlist ids to OS thread ids through column TID of the information_schema.processlist table starting on Percona Server for MySQL 5.6.27. With the release of 5.7, MySQL followed with its own implementation by extending the PERFORMANCE_SCHEMA.THREADS table and adding a new column named THREAD_OS_ID, which Percona Server for MySQL adopted in place of its own, as it usually does remain as close to upstream as possible.

The following approach is useful for cases where there is a query overloading one particular CPU while other cores are performing normally. For cases where it is a general CPU usage issue, different methods can be used, such as the one in this other blog post Reducing High CPU on MySQL: A Case Study.

(参考:https://www.percona.com/blog/2020/04/23/a-simple-approach-to-troubleshooting-high-cpu-in-mysql/)

主要意思是针对定位CPU的问题,Percona增加了对通过信息的TID列将processlist ID映射到OS线程ID的支持,而MySQL在5.7版本后在 PERFORMANCE_SCHEMA.THREADS表加了一个THREAD_OS_ID新列来实现,以下方法适用于在其他内核正常运行时,某个特定CPU的查询过载的情况。

find out which session is using the most CPU resources in my database?

1.定位线程

pidstat -t -p <mysqld_pid> 1  5

通过该命令我们可以定位到802、4445等线程消耗了大量的CPU,这里尽量确保在pidstat的多个样本中验证消耗是恒定的。根据这些信息,我们可以登录到数据库,并使用以下查询找出哪个MySQL线程是罪魁祸首。

2.定位问题sql

select * from performance_schema.threads where thread_os_id = xx;
select * from information_schema.`PROCESSLIST` where  id=threads.processlist_id;

根据操作系统id可以到processlist表找到对应的会话,如下:

3.查看问题sql执行计划

这里对应看一下执行计划基本就可以判断当前数据库CPU为什么消耗这么高了。

至于优化的点只需要在dock建一个索引即可,这里就不介绍了。

作者丨波波说运维 

原文链接 | toutiao.com/i6923526305795293707?wid=1623686217615

-END-

更多精彩文章

1.业务团队如何在日常工作中做稳定性?涵盖事前、事中、事后的方方面面 | 原创

2.花97分钟开导了在京东迷茫的学弟,你经历过这种迷茫吗?| 原创

3. 一文聊透策略模式 | 原创

4. 万字长文讲解如何优化MySQL,建议收藏!

5. 漫说数据湖——如何建湖?如何做数据ETL?为什么大数据需要数据湖?

6. 我看技术人的成长路径 | P8大佬干货分享

7.谨以此文献给毕业的这5年 | 原创

8.财务小课堂 | 收入&成本


更多系列文章请查看公众号底部菜单栏【系列文章】,快捷获取Java后端、计算机基础、系统架构、大数据、面试等系列文章~


如果你喜欢本文

请长按二维码,关注 Bella的技术轮子

转发至 朋友圈,是对我最大的支持

喜欢就点个在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存