如何使用工具显示CPU使用率. pdf
查看cpu利用率工具总结
概要
遇到软件性能问题时,需要确认系统的CPU、内存、磁盘等方面的情况。 确认CPU的使用状况是最优先的事项。 看CPU,主要阐明以下几个问题。
1. CPU使用率是否高
2 .哪个进程和哪个线程正在使用CPU
3 .占用CPU的任务是在用户状态还是内核状态下消耗时间。
4 .系统负载时,系统CPU是否稍微过载?
5 .如何查看消耗CPU的任务中哪个路径的代码正在消耗CPU
上面的五个步骤是自然的、循序渐进的,取决于正反两方面的想法。 基本上通过明确上述五个方面,可以明确CPU使用率高的具体理由。 可以对优化器起到指导作用。
查看CPU利用率
关于性能问题,首先是检查CPU的利用率。 检查CPU利用率的方法是一个众所周知的top命令,但要知道top显示了多核系统中所有CPU的平均利用率。 例如,在四核系统中,如果一个CPU的利用率为100%,而另一个CPU空闲,则top命令显示的利用率可能仅为25%。
另一个top命令是top -H -p pid,它允许您检查一个进程中所有线程的CPU利用率
顶级PID
上面的命令是确定进程中的哪个线程占用了更多的CPU
top - 15:31:32 up 69 days、6:09、35users、loadaverage:1.78、3.36、3.86
tasks : 3总,0运行,3 sleeping,0 stopped,0 zombie
CPU(s ) : 0.0% us、0.0% sy、0.0% ni、99.9% id、0.0% wa、0.0% hi、0.0% si
Mem: 264037488k total,261933344k used,2104144k free,4541060k buffers
Swap: 33554428k total,1116764k used,32437664k free,212254216k cached
piduserprnivirtresshrs % CPU % memtimecommand
134 root 200229620720 s0.0. 00:00.09 ypbind
139 root 200229620720 s0.0. 00:00.00 ypbind
140 root 200229620720 s0.0. 00:18.59 ypbind
如何确定进程消耗的是CPU时间是用户状态还是内核状态
程序消耗CPU基本上有两种情况
1 .程序进行大量的计算操作,例如加密操作等,此时,程序在用户状态下消耗大量的CPU
2 .程序提出了很多IO要求。 例如,在网络上发送接收消息,或者读写磁盘。 此时,在核心状态下消耗大量的CPU。
要确定进程使用的是用户状态还是内核状态,可以使用以下命令
vmstat 1
mpstat -P ALL 1
sar -P ALL -u 1
$vmstat 1
procs-------- -内存------swap------ io------系统--------- -系统
rbswpdfreebuffcachesisobiboincsussyidwa
0 0 1117164 1847008 4544520 212508872 0 0 11 41 0 0 1 1 98 0
0 0 1117164 1846976 4544520 212508948 0 0 0 12 1864 3419 0 0 100 0
0 0 1117164 1847328 4544520 212508948 0 0 0 12 2210 3792 0 0 100 0
0 0 1117164 1847164 4544520 212508948 0 0 0 12 2293 3657 0 0 100 0
0 0 1117164 1846848 4544520 212508948 0 0 0 12 2946 4963 0 0 99 0
0 0 1117164 1846848 4544520 212508948 0 0 0 38020 1894 2941 0 0 100 0
0 0 1117164 1846972 4544528 212508948 0 0 0 48 401 1272 0 0 100 0
root @ localhost :~# mpstat-pall 1
Linux 3
.12.19-rt30 (localhost) 01/09/70 _ppc_ (2 CPU)02:43:11 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
02:43:12 all 97.52 0.00 1.98 0.00 0.00 0.50 0.00 0.00 0.00 0.00
02:43:12 0 95.05 0.00 3.96 0.00 0.00 0.99 0.00 0.00 0.00 0.00
02:43:12 1 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:43:12 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
02:43:13 all 96.98 0.00 3.02 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:43:13 0 93.07 0.00 5.94 0.00 0.00 0.99 0.00 0.00 0.00 0.00
02:43:13 1 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:43:13 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
02:43:14 all 97.50 0.00 2.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:43:14 0 95.00 0.00 5.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:43:14 1 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
root@localhost:~# sar -P ALL -u 1
Linux 3.12.19-rt30 (localhost) 01/09/70 _ppc_ (2 CPU)
03:01:04 CPU %user %nice %system %iowait %steal %idle
03:01:05 all 97.00 0.00 3.00 0.00 0.00 0.00
03:01:05 0 96.00 0.00 4.00 0.00 0.00 0.00
03:01:05 1 98.00 0.00 2.00 0.00 0.00 0.00
03:01:05 CPU %user %nice %system %iowait %steal %idle
03:01:06 all 97.00 0.00 3.00 0.00 0.00 0.00
03:01:06 0 95.00 0.00 5.00 0.00 0.00 0.00
03:01:06 1 99.00 0.00 1.00 0.00 0.00 0.00
如何查看系统CPU的负载
从上面的命令和方法我们大致知道了哪些CPU上面,哪些进程和线程消耗了多少CPU,并且知道消耗CPU是在用户态还是在内核态。接下去我们还想知道这么多进程在忙碌的跑着,是不是真的达到了系统的满载程度呢?对的,查看一下系统的负载,我们有如下命令查看系统负载。
1. uptime
2. sar -P ALL -q 1
root@localhost:~# sar -P ALL -q 1
Linux 3.12.19-rt30 (localhost) 01/09/70 _ppc_ (2 CPU)
03:06:06 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked
03:06:07 12 174 15.86 16.09 15.86 0
03:06:08 11 174 15.86 16.09 15.86 0
03:06:09 13 174 15.79 16.07 15.86 0
03:06:10 13 174 15.79 16.07 15.86 0
从上面命令的结果来看
1. runq-sz 表示系统中可运行的程序线程数目
2. plist-sz 表示系统中总共的进程和线程数目
3. ldavg-1 表示一分钟内系统的负载大小,也可以理解位平均可运行状态的线程数目
如何查找消耗CPU的代码
OK,上面的方法使我们队消耗CPU的程序有了大概的认识,最有我们要在这个程序中找到真正导致CPU忙的“如意的方盒”,也就是我们希望找到有问题的代码具体位置,完成这个目标的方法有如下三个。
1. perf top -p pid
2. pstack pid
3. 上一篇文章中介绍的CPU call trace采样并且绘制出火焰图来,这个方法比较重量级,但是更加直观和可视化。
彩蛋
如何用一条命令占用CPU
while true; do a=1; done &