首页 » 智能 » 某个应用的CPU运用率居然达到100%我该怎么办?_应用率_内核

某个应用的CPU运用率居然达到100%我该怎么办?_应用率_内核

少女玫瑰心 2024-12-26 15:15:19 0

扫一扫用手机浏览

文章目录 [+]

$ grep 'CONFIG_HZ=' /boot/config-$(uname -r)CONFIG_HZ=250

同时,正由于节拍率 HZ 是内核选项,以是用户空间程序并不能直接访问。
为了方便用户空间程序,内核还供应了一个用户空间节拍率 USERHZ,它总是固定为 100,也便是 1/100 秒。
这样,用户空间程序并不须要关心内核中 HZ 被设置成了多少,由于它看到的总是固定值 USERHZ。
Linux 通过 /proc 虚拟文件系统,向用户空间供应了系统内部状态的信息,而 /proc/stat 供应的便是系统的 CPU 和任务统计信息。
比方说,如果你只关注 CPU 的话,可以实行下面的命令:

# 只保留各个CPU的数据$ cat /proc/stat | grep ^cpucpu 280580 7407 286084 172900810 83602 0 583 0 0 0cpu0 144745 4181 176701 86423902 52076 0 301 0 0 0cpu1 135834 3226 109383 86476907 31525 0 282 0 0 0

这里的输出结果是一个表格。
个中,第一列表示的是 CPU 编号,如 cpu0、cpu1 ,而第一行没有编号的 cpu ,表示的是所有 CPU 的累加。
其他列则表示不同场景下 CPU 的累加节拍数,它的单位是 USER_HZ,也便是 10 ms(1/100 秒),以是这实在便是不同场景下的 CPU 韶光。
当然,这里每一列的顺序并不须要你背下来。
你只要记住,有须要的时候,查询 man proc 就可以。
不过,你要清楚 man proc 文档里每一列的涵义,它们都是 CPU 利用率干系的主要指标,你还会在很多其他的性能工具中看到它们。
下面,我来依次解读一下。

某个应用的CPU运用率居然达到100%我该怎么办?_应用率_内核 某个应用的CPU运用率居然达到100%我该怎么办?_应用率_内核 智能

user(常日缩写为 us),代表用户态 CPU 韶光。
把稳,它不包括下面的 nice 韶光,但包括了 guest 韶光。
nice(常日缩写为 ni),代表低优先级用户态 CPU 韶光,也便是进程的 nice 值被调度为 1-19 之间时的 CPU 韶光。
这里把稳,nice 可取值范围是 -20 到 19,数值越大,优先级反而越低。
system(常日缩写为 sys),代表内核态 CPU 韶光。
idle(常日缩写为 id),代表空闲韶光。
把稳,它不包括等待 I/O 的韶光(iowait)。
iowait(常日缩写为 wa),代表等待 I/O 的 CPU 韶光。
irq(常日缩写为 hi),代表处理硬中断的 CPU 韶光。
softirq(常日缩写为 si),代表处理软中断的 CPU 韶光。
steal(常日缩写为 st),代表当系统运行在虚拟机中的时候,被其他虚拟机占用的 CPU 韶光。
guest(常日缩写为 guest),代表通过虚拟化运行其他操作系统的韶光,也便是运行虚拟机的 CPU 韶光。
guest_nice(常日缩写为 gnice),代表以低优先级运行虚拟机的韶光。
而我们常日所说的 CPU 利用率,便是除了空闲韶光外的其他韶光占总 CPU 韶光的百分比,用公式来表示便是:怎么查看 CPU 利用率

top 和 ps 是最常用的性能剖析工具:top 显示了系统总体的 CPU 和内存利用情形,以及各个进程的资源利用情形。
ps 则只显示了每个进程的资源利用情形。

某个应用的CPU运用率居然达到100%我该怎么办?_应用率_内核 某个应用的CPU运用率居然达到100%我该怎么办?_应用率_内核 智能
(图片来自网络侵删)

# 默认每3秒刷新一次$ toptop - 11:58:59 up 9 days, 22:47, 1 user, load average: 0.03, 0.02, 0.00Tasks: 123 total, 1 running, 72 sleeping, 0 stopped, 0 zombie%Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 stKiB Mem : 8169348 total, 5606884 free, 334640 used, 2227824 buff/cacheKiB Swap: 0 total, 0 free, 0 used. 7497908 avail MemPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 78088 9288 6696 S 0.0 0.1 0:16.83 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.05 kthreadd 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H...

这个输出结果中,top 默认显示的是所有 CPU 的均匀值,这个时候你只须要按下数字 1 ,就可以切换到每个 CPU 的利用率了。
连续往下看,空缺行之后是进程的实时信息,每个进程都有一个 %CPU 列,表示进程的 CPU 利用率。
它是用户态和内核态 CPU 利用率的总和,包括进程用户空间利用的 CPU、通过系统调用实行的内核空间 CPU 、以及在就绪行列步队等待运行的 CPU。
在虚拟化环境中,它还包括了运行虚拟机占用的 CPU。
用 pidstat 吧,它正是一个专门剖析每个进程 CPU 利用情形的工具。
下面的 pidstat 命令,就间隔 1 秒展示了进程的 5 组 CPU 利用率,包括:

用户态 CPU 利用率 (%usr);内核态 CPU 利用率(%system);运行虚拟机 CPU 利用率(%guest);等待 CPU 利用率(%wait);以及总的 CPU 利用率(%CPU)。
末了的 Average 部分,还打算了 5 组数据的均匀值。

# 每隔1秒输出一组数据,共输出5组$ pidstat 1 515:56:02 UID PID %usr %system %guest %wait %CPU CPU Command15: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 CommandAverage: 0 15006 0.00 0.99 0.00 0.00 0.99 - dockerdCPU 利用率过高怎么办?

利用 perf 剖析 CPU 性能问题,我来说两种最常见、也是我最喜好的用法。
第一种常见用法是 perf top,类似于 top,它能够实时显示占用 CPU 时钟最多的函数或者指令,因此可以用来查找热点函数,利用界面如下所示:

$ perf topSamples: 833 of event 'cpu-clock', Event count (approx.): 97742399Overhead 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...

输出结果中,第一行包含三个数据,分别是采样数(Samples)、事宜类型(event)和事宜总数量(Event count)。
比如这个例子中,perf 统共采集了 833 个 CPU 时钟事宜,而总事宜数则为 97742399。
再往下看是一个表格式样的数据,每一行包含四列,分别是:

第一列 Overhead ,是该符号的性能事宜在所有采样中的比例,用百分最近表示。
第二列 Shared ,是该函数或指令所在的动态共享工具(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等。
第三列 Object ,是动态共享工具的类型。
比如 [.] 表示用户空间的可实行程序、或者动态链接库,而 [k] 则表示内核空间。
末了一列 Symbol 是符号名,也便是函数名。
当函数名未知时,用十六进制的地址来表示。
还是以上面的输出为例,我们可以看到,占用 CPU 时钟最多的是 perf 工具自身,不过它的比例也只有 7.28%,解释系统并没有 CPU 性能问题。
perf top 的利用你该当很清楚了吧。
接着再来看第二种常见用法,也便是 perf record 和 perf report。
perf top 虽然实时展示了系统的性能信息,但它的缺陷是并不保存数据,也就无法用于离线或者后续的剖析。
而 perf record 则供应了保存数据的功能,保存后的数据,须要你用 perf report 解析展示。

$ 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的报告

测试一下这个 Nginx 做事的性能

# 并发10个要求测试Nginx性能,统共测试100个要求$ ab -c 10 -n 10000 http://192.168.0.10:10000/This is ApacheBench, Version 2.3 <$Revision: 1706008 $>Copyright 1996 Adam Twiss, Zeus Technology Ltd, ...Requests per second: 11.63 [#/sec] (mean)Time per request: 859.942 [ms] (mean)...

新开一个终端运行 top 命令,并按下数字 1 ,切换到每个 CPU 的利用率:

$ top

怎么知道是 php-fpm 的哪个函数导致了 CPU 利用率升高呢?我们来用 perf 剖析一下。
在第一个终端运行下面的 perf 命令:

# -g开启调用关系剖析,-p指定php-fpm的进程号21515$ perf top -g -p 21515小结

CPU 利用率是最直不雅观和最常用的系统性能指标,更是我们在排查性能问题时,常日会关注的第一个指标。
以是我们更要熟习它的含义,尤其要弄清楚用户(%user)、Nice(%nice)、系统(%system) 、等待 I/O(%iowait) 、中断(%irq)以及软中断(%softirq)这几种不同 CPU 的利用率。
比如说:

用户 CPU 和 Nice CPU 高,解释用户态进程占用了较多的 CPU,以是该当着重排查进程的性能问题。
系统 CPU 高,解释内核态占用了较多的 CPU,以是该当着重排查内核线程或者系统调用的性能问题。
I/O 等待 CPU 高,解释等待 I/O 的韶光比较长,以是该当着重排查系统存储是不是涌现了 I/O 问题。
软中断和硬中断高,解释软中断或硬中断的处理程序占用了较多的 CPU,以是该当着重排查内核中的中断做事程序。
碰到 CPU 利用率升高的问题,你可以借助 top、pidstat 等工具,确认引发 CPU 性能问题的来源;再利用 perf 等工具,排查出引起性能问题的详细函数。
思考

本文由博客一文多发平台 https://openwrite.cn?from=article_bottom 发布!

标签:

相关文章

CSS绘图,介绍网页图表设计的无限可能

随着互联网技术的飞速发展,数据可视化已成为展示信息的重要手段。在众多数据可视化工具中,CSS绘图以其独特的优势逐渐崭露头角。本文将...

智能 2024-12-28 阅读0 评论0

CSS类ID,网页美学的灵魂之窗

随着互联网的飞速发展,网页设计已经成为一门不可或缺的技艺。在网页设计中,CSS类ID扮演着至关重要的角色。本文将从CSS类ID的定...

智能 2024-12-28 阅读0 评论0

CSS透明度,设计中的艺术与科学

随着互联网技术的飞速发展,网页设计已经成为了一个备受关注的领域。在众多设计技巧中,CSS透明度无疑是一种极具魅力的表现手法。它既能...

智能 2024-12-28 阅读0 评论0