性能分析之 Linux 系统中 ps&top 中 CPU 百分比不一致?

简介: 【8月更文挑战第18天】性能分析之 Linux 系统中 ps&top 中 CPU 百分比不一致?

一、前言

今天在 7DGroup 的群里,有人提了个问题,ps 统计出来的 CPU 百分比为什么比 top 统计出来的少很多?

二、问题现象

如下图:
image.png

image.png
image.png

从上面的图来加一下,确实差别比较大呀。

top 里面:

$$ 800 -16.9-7.6-22.1-29.9-8.8-24.4-16.9-20.3 = 653.1 $$

而 ps 里面只有 300% 以下。

三、问题分析

什么会这样呢?

先得了解 ps 和 top 有什么区别:

  • Top 是一个 monitoring tool,但 ps 是一个 snapshot tool。这是一个本质的区别。

  • ps 是取当前数据的,从 /proc/pid 目录中取出来。 top 是在一直取数据,并且根据刷新周期做计算的。

  • ps怎么计算CPU的呢?

    • 有几参数如下:
      • 系统启动时间: 是系统自启动以来的总时间长度。
      • 线程启动时间:线程启动的时间点。
      • 线程CPU时间:线程用CPU的时间长度。
      • 线程时间 = 系统启动时间 - 线程启动时间
      • 线程CPU使用率 = 线程CPU时间 * 1000 / 线程时间
      • 计算出的CPU使用率百分比 = 线程CPU使用率 / 10. 线程CPU使用率%10
    • 举例说明:
      • 系统启动时间: 15456374.085712
      • 线程启动时间:9470058.848042
      • 线程CPU时间:987163
      • 线程时间 = 15456374.085712 - 9470058.848042 = 5986315.23767
      • 线程CPU使用率 = 987163 * 1000 / 5986315.23767 = 164.9
      • 计算出的CPU使用率百分比 = 164.9 / 10. 164.9%10 = 16.5
  • ps 计算百分比的数据取自 /proc/ 目录

    • 从/proc/pid/stat 取出如下几个时间:
      • utime:用户模式的CPU时间消耗
      • stime:内核模式的CPU时间消耗
      • cutime:用户模式的CPU时间消耗,包括子进程
      • cstime:内核模式的CPU时间消耗,包括子进程
      • starttime:线程启动时间点
  • 时间消耗是通过 CPU 时间片来统计的。计算的基础就是 CPU 时间片,CPU 频率就是每秒内的 CPU 计算次数(但是单精双精浮点运算时 CPU 时间片是不一样的,这个要注意下)。

下面我们只从取出的值的结果来做计算。

如果想用 ps 像 top 一样计算一定时间周期内的 CPU 使用率,可以按如下方式计算。

[root@7dgroup 2287]# ps -p 2287 -o %cpu,cputime,etime,etimes
%CPU     TIME     ELAPSED ELAPSED
0.3 00:00:00       01:03      63

这里有两个参数,etime 和 etimes(这两个参数的 header 都是 ELAPSED),这两个参数别是:

  • etime:线程自启动以来的持续时间,格式是 [DD-]hh:]mm:ss

  • etimes:线程自启动以来的持续时间,以秒为单位。

比如说,上面这个 2287 进程,在第一次取值时,如上所示。

要计算到当前时间消耗了多少 CPU ,需要再取一次数据:

[root@7dgroup 2287]# ps -p 2287 -o %cpu,cputime,etime,etimes
%CPU     TIME     ELAPSED ELAPSED
 0.3 00:00:01       04:30     270

计算一下时间:

前一次取值时:

  • CPU 时间片消耗是:0。计算过程是:(003600+0060+00)

  • CPU 时间窗口是63。计算过程是:1*60+3 = 63.

后一次取值时:

  • CPU 时间片消耗是:1。计算过程是:003600+0060+1

  • CPU 时间窗口是:270。计算过程是:4*60+30 = 270.

CPU 使用率计算是:
$$ ((1-0)/(270-63))*100 = 0.4 $$
所以这个进程在这段时间内所用的 CPU 百分比是 0.4%。

有兴趣的也可以撸一下 ps 的源代码:

image.png
如果对 top 计算结果有异议的,也可以去撸下 top 的源码。

四、总结

上面逻辑了这么多,那么我们在看一个系统的资源使用率时,要看 ps 还是 top 呢?

ps 和 top 的关系如下所示:
image.png
top 是一个时间周期内的资源统计。ps 是一个个时间点的资源值。

如果要监控一个系统的整体资源使用率的话,建议用 top 来看。

如果要分析到一个具体的线程使用的 CPU 资源时,再用 ps 来看。

目录
相关文章
|
4天前
|
存储 缓存 监控
Linux缓存管理:如何安全地清理系统缓存
在Linux系统中,内存管理至关重要。本文详细介绍了如何安全地清理系统缓存,特别是通过使用`/proc/sys/vm/drop_caches`接口。内容包括清理缓存的原因、步骤、注意事项和最佳实践,帮助你在必要时优化系统性能。
111 78
|
8天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
37 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
1月前
|
缓存 Java Linux
如何解决 Linux 系统中内存使用量耗尽的问题?
如何解决 Linux 系统中内存使用量耗尽的问题?
119 48
|
4天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
40 13
|
28天前
|
Ubuntu Linux 网络安全
linux系统ubuntu中在命令行中打开图形界面的文件夹
在Ubuntu系统中,通过命令行打开图形界面的文件夹是一个高效且实用的操作。无论是使用Nautilus、Dolphin还是Thunar,都可以根据具体桌面环境选择合适的文件管理器。通过上述命令和方法,可以简化日常工作,提高效率。同时,解决权限问题和图形界面问题也能确保操作的顺利进行。掌握这些技巧,可以使Linux操作更加便捷和灵活。
20 3
|
4天前
|
Ubuntu Linux C++
Win10系统上直接使用linux子系统教程(仅需五步!超简单,快速上手)
本文介绍了如何在Windows 10上安装并使用Linux子系统。首先,通过应用商店安装Windows Terminal和Linux系统(如Ubuntu)。接着,在控制面板中启用“适用于Linux的Windows子系统”并重启电脑。最后,在Windows Terminal中选择安装的Linux系统即可开始使用。文中还提供了注意事项和进一步配置的链接。
16 0
|
1月前
|
Linux
在 Linux 系统中,`find` 命令
在 Linux 系统中,`find` 命令
33 1
|
1月前
|
网络协议 Linux 虚拟化
如何在 Linux 系统中查看进程的详细信息?
如何在 Linux 系统中查看进程的详细信息?
65 1
|
1月前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
|
15天前
|
存储 Oracle 安全
服务器数据恢复—LINUX系统删除/格式化的数据恢复流程
Linux操作系统是世界上流行的操作系统之一,被广泛用于服务器、个人电脑、移动设备和嵌入式系统。Linux系统下数据被误删除或者误格式化的问题非常普遍。下面北亚企安数据恢复工程师简单聊一下基于linux的文件系统(EXT2/EXT3/EXT4/Reiserfs/Xfs) 下删除或者格式化的数据恢复流程和可行性。
下一篇
DataWorks