# Mysql使用perf top判断cpu高原因

> 作者/来源: UCloud 运营管理员
> 发布时间: 2023-01-11T05:19:00.000Z
> 分类: 推荐奖励
> 标签: AI, 数据库, Linux
> 原文链接: http://117.50.162.249:3000/yun/articles/1487

---

# Mysql使用perf top判断cpu高原因

> 来源: https://www.ucloud.cn/yun/129444.html
> 作者: IT那活儿
> 发布日期: 发布于2023-01-11 13:19

Mysql使用perf top判断cpu高原因

# **点击上方“IT那活儿****”公众号，关注后了解更多内容，不管IT什么活儿，干就完了！！！**

Perf介绍

**我们在mysql数据库时，经常会遇到主机cpu使用率突增的现象**，碰到紧急情况需要尽快找到原因进行处理，**这里我推荐使用Perf top。**

**Perf 是内置于Linux 内核源码树中的性能剖析工具：**

它基于事件采样原理，以性能事件为基础，支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析。可用于性能瓶颈的查找与热点代码的定位。

linux2.6及后续版本都自带该工具，几乎能够处理所有与性能相关的事件。perf top 是比较常用于展示占用CPU始终最多的函数或者指令，一般以此来查找热点函数。

**指标介绍**

**# perf top**

- **-g：**可以查看堆栈调用；
- **-a：**查看所有CPU。

例：

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129444/images/129444_000.png)

- **Samples :** 采样数, perf 总共采集了 876 个 CPU 时钟事件。
- **event :** 事件类型。
- **Event count (approx.) :** 事件总数量。

**行列：**

- **Overhead:** 是该符号的性能事件在所有采样中的比例，用百分比来表示。
- **Shared:** Shared ，是该函数或指令所在的动态共享对象（Dynamic Shared Object），如内核、进程名、动态链接库名、内核模块名等。
- **Object:** Object ，是动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动态链接库，而 [k] 则表示内核空间。
- **Symbol:** Symbol 是符号名，也就是函数名。当函数名未知时，用十六进制的地址来表示。

上面结果显示内核模块中\_raw\_spin\_unlock\_irqrestore占用 CPU时钟最多，比列占11.31%。

**根据MYSQL进程查找CPU消耗过高的线程信息**

**1.** 找到mysql进程id：

```
ps -ef |grep mysqld|grep -v grep
```

例：

```
[root@gaussdb11 ~]# ps -ef |grep mysqld|grep -v grepmysql 12816      1  0 08:47 ? 00:00:00 /bin/sh /home/mysql/bin/mysqld_safe --defaults-file=/home/mysql_data/db/mysqldb1.cnf --ledir=/home/mysql/binmysql 14206  12816  0 08:47 ? 00:00:36 /home/mysql/bin/mysqld --defaults-file=/home/mysql_data/db/mysqldb1.cnf --basedir=/home/mysql --datadir=/home/mysql_data/db/data --plugin-dir=/home/mysql/lib/plugin --log-error=/home/mysql_data/db/log/mysql.err --pid-file=/home/mysql_data/db/mysql.pid --socket=/home/mysql_data/db/mysql.sock --port=3306
```

**2.** 根据进程id查找MYSQL的调用函数信息及进程的线程信息：

```
perf top -g -p pidtop -H -p pid
```

- -H 显示线程信息；
- -p指定pid。

14206就是mysql进程，我们以这个进程为例：

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129444/images/129444_001.png)

**Children，Self表示函数本身的overhead：**如果某个函数的overhead占60%，那么它的Self overhead就是40%。一个是调用 main() 上，一个是执行 main() 指令，二者的overhead都要计算入main的Children overhead。Self函数所占非常低，说明函数都在被正常调用。

```
[root@gaussdb11 ~]# top -H -p 14206top - 15:11:14 up  6:25, 3 users, load average: 0.00, 0.03, 0.05Threads: 42 total, 0 running, 42 sleeping, 0 stopped, 0 zombie%Cpu(s): 0.0 us, 6.2 sy, 0.0 ni, 93.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 stKiB Mem : 3765236 total, 2696380 free, 566248 used, 502608 buff/cacheKiB Swap: 3145724 total, 3145724 free, 0 used. 2624428 avail MemPID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND14206 mysql     20   0 3345492 414464  11640 S  0.0 11.0   0:03.13 mysqld14207 mysql     20   0 3345492 414464  11640 S  0.0 11.0   0:00.00 mysqld14216 mysql     20   0 3345492 414464  11640 S  0.0 11.0   0:00.41 mysqld14217 mysql     20   0 3345492 414464  11640 S  0.0 11.0   0:00.49 mysqld14218 mysql     20   0 3345492 414464  11640 S  0.0 11.0   0:00.39 mysqld14219 mysql     20   0 3345492 414464  11640 S  0.0 11.0   0:00.39 mysqld14220 mysql     20   0 3345492 414464  11640 S  0.0 11.0   0:00.37 mysqld
```

**3.** 根据上一步查出来的线程pid可以查看该线程详细信息：

```
select CONCAT(kill ,id,;) AS KillSQL,USER,HOST,DB,COMMAND,TIME,STATE,INFO from information_schema.PROCESSLIST where ID = (select PROCESSLIST_ID from  performance_schema.threads where THREAD_OS_ID=14207);
```

**4.** 根据查出来的信息，查看sql执行计划，如果是高耗SQL，与应用确认后予以kill，然后进行在进行sql优化。

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129444/images/129444_002.png)

END

## 本文作者：汤 杰（上海新炬王翦团队）

## 本文来源：“IT那活儿”公众号

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129444/images/129444_003.png)