CPU使用率达到100%

版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40195432/article/details/84999844

CPU使用率居然达到100%
http://www.manongjc.com/article/20838.html
https://www.yangcs.net/posts/how-to-deal-with-increasing-of-cpu-usage/

一、查看CPU使用率

top 显示了系统总体的 CPU 和内存使用情况,以及各个进程的资源使用情况
ps 只显示了每个进程的资源使用情况
pidstat 它是一个专门分析每个进程 CPU使用情况的分析工具
pstree -p 以树状图显示进程PID为的进程以及子孙进程,如果有-p参数则同时显示每个进程的PID。
execsnoop 一个专为短时进程设计的工具。它通过 ftrace 实时监控进程的 exec() 行为, 并输出短时进程的基本信息,包括进程 PID、父进程 PID、命令行参数以及执行的结果。

二、cpu使用率过高怎么办?(能找到CPU使用率高的进程)

2.1 定位占用CPU过高的函数

通过 top、ps、pidstat 等工具,你能够轻松找到CPU 使用率较高(比如 100% )的进程。
接下来,你可能又想知道,用 CPU 的到底是代码里的哪个函数呢?
找到它,你才能更高效、更针对性地进行优化。
perf 是 Linux 2.6.31 以后内置的性能分析工具,它以性能事件采样为基础,不仅可以分析系统的各种事件和内核性能,它还可以分析指定应用程序的性能问题。

第一种常见用法是 perf top,类似于 top,它能够实时显示占用 CPU 时钟最多的函数或者指令,
因此可以用来查找热点函数,使用界面如下所示:
$ perf top
Samples: 833  of event 'cpu-clock', Event count (approx.): 97742399
Overhead  Shared Object       Symbol
   7.28%  perf                [.] 0x00000000001f78a4
   4.72%  [kernel]            [k] vsnprintf
   4.32%  [kernel]            [k] module_get_kallsym
   3.65%  [kernel]            [k] _raw_spin_unlock_irqrestore

第一列 Overhead ,是该符号的性能事件在所有采样中的比例,用百分比来表示。
第二列 Shared ,是该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等。
第三列 Object ,是动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动态链接库,而 [k] 则表示内核空间。
最后一列 Symbol 是符号名,也就是函数名。当函数名未知时,用十六进制的地址来表示。   
   
注:perf top 虽然实时的展示了系统的性能信息,但它不能保存数据,无法用于离线分析。

第二种常见用法是 perf record
$ perf record # 按 Ctrl+C 终止采样
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.452 MB perf.data (6093 samples) ]

$ perf report # 展示类似于 perf top 的报告

注:perf record则提供了保存数据的功能,保存后的数据

2.2 定位占用CPU过高线程

方法一:
1、找到最耗CPU的进程
方法:
执行top -c ,显示进程运行信息列表
键入P (大写p),进程按照CPU使用率排序

2、找到最耗CPU的线程
工具:top
方法:
top -Hp 10765 ,显示一个进程的线程运行信息列表
键入P (大写p),线程按照CPU使用率排序
注:-H  :Threads-mode operation

3、将线程PID转化为16进制
方法:printf “%x\n” 10804
0x2a34

4、查看堆栈,找到线程在干嘛
工具:pstack/jstack/grep
方法:jstack 10765(进程id) | grep ‘0x2a34’ -C5 --color

扩展:使用脚本来定位cpu过高是什么线程造成?
https://www.javatang.com/archives/2017/10/19/33151873.html


方法二:
1、将文件下载到执行机器上
curl -O  https://raw.githubusercontent.com/oldratlee/useful-scripts/master/show-busy-java-threads

2、通过Top命令查找消耗CPU最高的Java进程,并获取PID

3、执行以下代码即可获取
sh  show-busy-java-threads $PID

参考网址: 更多使用参数和方法可以参考一下网址
https://github.com/oldratlee/useful-scripts/blob/master/docs/java.md#-show-busy-java-threads

4、当出现线程问题时,可以多用jstack打印几次线程堆栈,然后上传到此网站可以自动协助分析线程是否存在问题
http://fastthread.io/

三、cpu使用率过高怎么办?(找不到CPU使用率高的进程)
http://www.manongjc.com/article/20838.html

碰到常规问题无法解释的CPU使用率情况时,首先要想到有可能是短时应用导致的问题,比如 有可能是下面这两种情况。

第一,应用里直接调用了其他二进制程序,这些程序通常运行时间比较短,通过top等工具也不容易发现。
第二,应用本身在不停地崩溃重启,而启动过程的资源初始化,很可能会占用相当多的CPU。

对于这类进程,我们可以用 pstree 或者 execsnoop 找到它们的父进程,再从父进程所在的应用入手,排查问题的根源。

猜你喜欢

转载自blog.csdn.net/qq_40195432/article/details/84999844