cpu使用率100怎么办
如何查看 CPU 使用率
说道查看 CPU 使用率的工具,大多数人第一反应肯定是top和ps,毕竟这两个是最常用的性能分析工具,也是初步接触 linux 性能优化时最易上手的工具:
比如,top 的输出格式为:
top - 21:05:55 up 4:47, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 255 total, 1 running, 254 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.7 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 985888 total, 71740 free, 606652 used, 307496 buff/cache
KiB Swap: 1046524 total, 709116 free, 337408 used. 169712 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ commaND
1039 root 20 0 527548 87584 18984 S 2.0 8.9 0:50.74 Xorg
2109 zwx 20 0 641036 18088 10368 S 1.0 1.8 0:08.19 gnome-terminal-
1803 zwx 20 0 1367480 77788 16872 S 0.3 7.9 1:17.32 compiz
1926 zwx 20 0 192776 11276 8744 S 0.3 1.1 0:14.72 vmtoolsd
6007 root 20 0 49028 3664 2880 R 0.3 0.4 0:00.53 top
1 root 20 0 185308 3700 2052 S 0.0 0.4 0:02.61 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.03 kthreadd
该输出结果中,第三行 %Cpu 就是系统 CPU 使用率,top 默认显示的是所有 CPU 的平均值,这个时候你只需要按下数字 1,就可以切换到每个 CPU 的使用率。不过,top 并没有细分进程的用户态 CPU 和内核态 CPU,要想查看每个进程的详细情况,可以使用pidstat,它是专用于分析每个进程 CPU 使用情况的工具。比如,下面的 pidstat 命令,每隔 1 秒展示进程的 5 组 CPU 使用率,包括:
- 用户态 CPU 使用率( %usr );
- 内核态 CPU 使用率( %system );
- 运行虚拟机 CPU 使用率( %guest );
- 等待 CPU 使用率( %wait );
- 总 CPU 使用率( %CPU );
- 5 组数据平均值。
# 每隔 1 秒输出一组数据,共输出 5 组
$ pidstat 1 5
15:56:02 UID PID %usr %system %guest %wait %CPU CPU Command
15:56:03 0 15006 0.00 0.99 0.00 0.00 0.99 1 dockerd
...
Average: UID PID %usr %system %guest %wait %CPU CPU Command
Average: 0 15006 0.00 0.99 0.00 0.00 0.99 - dockerd
CPU 使用率过高怎么办
面对这种情况,利用 top、ps 等工具,通常只能定位到 CPU 使用率较高的进程,而如何找到大量占用 CPU 的那块代码,才是我们真正想要做到的。如果只是发现某个进程大量占用 CPU,或许该进程正是我们的业务程序,难道直接告诉研发人员程序有问题,把难题抛给研发人员吗?
正确的做法是,选择合适的 Linux 调试工具,定位到造成这一问题的具体函数。我估计大部分人第一时间想到的会是 GDB(The GNU Project debugger),但实际上 GDB 并不是一个优秀的前期性能分析工具,因为它在调试过程中会不断中断程序的运行,这在线上环境往往是不允许的,另外,它对于新人玩家并不太友好。
相较于 GDB,我认为 perf 是更好的选择,它内置于 Linux 2.6.31之后的版本,主要通过性能事件采样,分析系统的各种事件和内核性能,且可以用来分析指定程序的性能问题。关于 perf,就不做过多介绍了,详细内容可参考 man手册(想学好 Linux 离不开 man 的帮助),在此只提供一种使用 perf 分析 CPU性能问题的用法—— perf top,它的表现形式类似于 top,不同的是,perf top 能够实时显示占用 CPU 时钟最多的函数或指令,因此可以用来定位高频函数,形式如下图所示:
$ perf top
Samples: 729 of event 'cpu-clock', Event count (APProx.): 72684182
Overhead Shared Object symbol
8.04% perf [.] 0x00000000003b6210
5.13% [kernel] [k] vsnprintf
4.67% [kernel] [k] module_get_kallsym
4.01% [kernel] [k] _raw_spin_unlock_irqrestore
...
代码块中第二行有三个参数,分别是 Samples(采样数)、Event(时间类型)和 Event count(事件总数),共采集 729 个 CPU 时钟事件,总事件数为 72684182。第三行有四个指标,分别是 :
- Overhead —— 该符号的性能事件在所有采样中所占比例;
- Shared —— 该函数或指令所属对象,如内核、进程、动态库、模块等;
- Object —— 表示对象的类型,如 [.] 表示用户空间的可执行程序、或动态库,[k]表示内核空间;
- Symbol —— 符号名,即函数名,当函数名未知时,用十六进制的地址来表示。
大致了解输出形式之后,我们再来看 perf top 的具体表现,其中占用 CPU 时钟最多的是 perf 工具自身,不过也仅占 8.04%,这意味着当前系统并没有 CPU 性能问题,如果某个程序占用 CPU 异常,那么你会看到一个趋近于 100% 的数值。现在让你去解决一个 CPU 使用率异常的问题,应该是手到擒来了吧,perf top足以应付大部分这方面的场景。
小结
CPU 使用率是最直观且常用的系统性能指标,也是在系统环境下排查性能问题是,通常会关注的第一个参数。因此,熟练掌握 CPU 使用率的相关概念至关重要,尤其对于几种不同类型的 CPU 使用率要区分清楚,如user(用户)、nice(Nice)、system(系统)、iowait(等待 I/O)、irq(中断)以及 softirq(软中断)。常见场景如:
- 用户 CPU 使用率高,说明用户态进程占用 CPU 较多,所以应该重点排查进程性能问题;
- 系统 CPU 使用率高,说明内核态占用较多 CPU,所以应该重点排查内核线程或系统调用的性能问题;
- 中断 CPU 使用率高,说明中断处理程序占用较多 CPU,所以应该重点排查内核中的中断服务函数;
当然,perf top也不是万能的,在实际解决问题时,应当合理利用不同工具来进行不同阶段的问题定位,对于 perf top 存在的缺陷或不足,比如它仅支持查看实时数据而不支持保存功能,就需要利用其它工具进行弥补。
相关阅读
cpu供电电路主要由电源管理芯片、场效应管、电感、滤波电容等组成 跑线路过程如下: 电源12V经过电感和滤波电容到达
在电子技术中,脉冲信号是一个按一定电压幅度,一定时间间隔连续发出的脉冲信号。脉冲信号之间的时间间隔称为周期;而将在单位时间(如
视频拍摄出来后,不仅仅是发布出去那么简单,还要有推广过程。今天就跟大家分享一下短视频渠道及推广过程。一、渠道分类有哪些?渠道现
---------------------------------------linux下如何定位代码问题------------------------------- 1、先通过top命令找到消耗cp
今天的内容量很多也很实用,建议大家耐心阅读完后收藏备用呐~不知道大家发现没有,就是随着技能工具的增多,我们现在的设计形式越来越多