哪种工具适合在第一时间分析进程cpu问题呢,我的推荐是perf。
perf
perf top
perf top 命令用于实时系统分析,其功能与 top 实用程序类似。但是,top 实用程序通常显示给定进程或线程使用的 CPU 时间,perf top 会显示每个特定函数使用的 CPU 时间。在默认状态下,perf top 将告知您用户空间和内核空间的所有 CPU 所使用的函数。
[root@localhost ~]# perf top
Samples: 55K of event 'cpu-clock', 4000 Hz, Event count (approx.): 10236634002 lost: 0/0 drop: 0/0
Overhead Shared Object Symbol
10.94% [kernel] [k] __do_softirq
6.51% libpython2.7.so.1.0 [.] PyEval_EvalFrameEx
3.32% [kernel] [k] _raw_spin_unlock_irqrestore
3.03% [kernel] [k] copy_pte_range
2.95% [kernel] [k] run_timer_softirq
2.41% [kernel] [k] unmap_page_range
1.28% [kernel] [k] finish_task_switch
1.26% [kernel] [k] __do_page_fault
- 第一行包含三个数据,分别是采样数(Samples)、时间类型(event)和时间总数量(Event count);
- 第一列 Overhead ,是该符号的性能事件在所有采样中的比例,用百分比来表示。
- 第二列 Shared,是该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等。
- 第三列 Object,是动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动态链接库,而 [k] 则表示内核空间。
- 最后一列 Symbol是符号名,也就是函数名。当函数名未知时,用十六进制的地址来表示。
perf top -g -p pid
-g开启调用关系分析,方便根据调用链分析 -p指定进程id
[wanchao@localhost ~]$ perf top -g -p 21515
按上下方向键切换到我们想查看的进程,再按下回车键展开该进程的调用关系,你会发现那些函数调用占用比例高
perf record
perf top不保存数据,perf record可以保存数据
[wanchao@localhost ~]$ perf record -g #记录性能事件,等待大约15秒后按ctrl+c终止采样
[wanchao@localhost ~]$ perf report #展示perf top报告
pstree
pstree用树状形式显示所有进程之间的关系
当查看用户cpu使用率非常高,但是查看进程的是cpu使用率时,都很低,但是发现一些进程的进程id在频繁改变,这可能两方面的原因:
- 1、 进程在不停的重启,比如因为段错误、配置错误等等,这时,进程在退出后可能又被监控系统自动重启了
- 2、 这些进程都是短时进程,也就是在其他应用内部通过exec调用的外面命令。这些命令一般都只运行很短的时间就会结束,你很难用top这种间隔时间比较长的工具发现
#注:pstree安装不能直接yum install -y pstree,而是:
[root@localhost ~]# yum install -y psmisc
#使用pstree就可以查看该不断重启的进程的调用关系了
[wanchao@localhost yum.repos.d]$ pstree|grep stress-ng
|-sshd-+-sshd---sshd---bash---su---bash---stress-ng---stress-ng-cpu
execsnoop
execsnoop是一个专门未短时进程设计的工具,它通过ftrace实时监控进程的exec()行为,并输出短时进程的基本信息,包括PID、父进程pid、命令行参数以及执行的结果
[wanchao@localhost ~]$ execsnoop
网友评论