top和ps没有显示相同的cpu结果


54

这与这个问题有关。

运行时,top我得到以下结果:

在此处输入图片说明

pid 3038正在使用18%的CPU,但是在运行时

在此处输入图片说明

结果是5.5%。而且这个数字似乎并没有随着时间而改变(即稍后再运行同一命令时)...

ps命令是否以某种方式平均cpu使用率?

Answers:


87

man psNOTES部分。

   CPU usage is currently expressed as the percentage of time spent running
   during the entire lifetime of a process.  This is not ideal, and it does not
   conform to the standards that ps otherwise conforms to.  CPU usage is
   unlikely to add up to exactly 100%.

而且,猜想您知道,但您也可以这样做:

top -p <PID>

编辑:关于您对其他答案的评论;

嗯,我想知道如何从ps中获得该值(即时CPU百分比)

简短答案:您不能。

为什么会这样呢?

这就像要求某人根据图片计算汽车的速度。

虽然top是监视工具,ps但是快照工具。可以这样认为:在任何给定的时刻,进程要么使用CPU,要么不使用CPU。因此,在该确切时刻您将承受0%或100%的负载。

给定:如果ps应提供即时CPU使用率,则为0%或100%。

top 另一方面,保持轮询号并计算一段时间内的负载。

ps本可以提供当前的使用情况-但这将要求它多次读取数据并在每次读取之间休眠。没有。

ps%cpu的计算

ps 通过以下方式计算CPU使用率:

正常运行时间=系统已运行的总时间。
ps_time =进程启动时间,从启动起以秒为单位。
pu_time =进程使用CPU的总时间。

;; 秒进程一直在运行:
秒=正常运行时间-ps_time
;; 用法:
cpu_usage = pu_time * 1000 /秒

打印:cpu_usage / 10“。cpu_usage%10


例: 正常运行时间= 344,545 ps_time = 322,462 pu_time = 3,383 秒= 344,545-322,462 = 22,083 cpu_usage = 3,383 * 1,000 / 22,083 = 153 打印:153/10“。153%10 => 15.3

因此打印的数字是:进程在其生命周期内一直在使用CPU的时间。如上例所示。它已经完成了其生命周期的15.3%。在84.7%的时间中,它没有在CPU上出错。

资料检索

ps以及top使用存储在以下文件中的数据/proc/-或过程信息伪文件系统

您的根目录中有一些文件,这些文件/proc/具有有关系统总体状态的各种信息。此外,每个进程都有其自己的子文件夹/proc/<PID>/,用于存储进程特定的数据。因此,例如您问题中的过程在处有一个文件夹/proc/3038/

ps计算CPU使用率时,它使用两个文件:

/ proc / uptime系统的正常运行时间(秒),以及在空闲进程中花费的时间(秒)。
/ proc / [PID] / stat有关进程的状态信息。
  • 从中uptime使用第一个值(正常运行时间)。
  • [PID]/stat它使用以下内容:
 #名称说明
用户代码中花费的14 utime CPU时间(以吉比特为单位)
在内核代码中花费的15 stime CPU时间(以吉比特为单位)
用户代码中花费的16个Cutime CPU时间,包括来自子代的时间
内核代码中花费的17 cstime CPU时间,包括子代的时间 
22 starttime进程开始的时间,以吉比特为单位

一个jiffie是时钟周期。因此,除此之外,它还使用各种方法sysconf(_SC_CLK_TCK)来获取系统的赫兹(每秒的滴答数)-在用尽其他选项之后最终使用100作为回退。

因此,如果utime是1234,赫兹是100,则:

seconds = utime / Hertz = 1234 / 100 = 12.34

实际计算是通过以下方式完成的:

total_time = utime + stime

IF include_dead_children
    total_time = total_time + cutime + cstime
ENDIF

seconds = uptime - starttime / Hertz

pcpu = (total_time * 1000 / Hertz) / seconds

print: "%CPU" pcpu / 10 "." pcpu % 10

示例(来自自定义Bash脚本的输出):

$ ./psw2 30894
System information
           uptime : 353,512 seconds
             idle : 0
Process information
              PID : 30894
         filename : plugin-containe
            utime : 421,951 jiffies 4,219 seconds
            stime : 63,334 jiffies 633 seconds
           cutime : 0 jiffies 0 seconds
           cstime : 1 jiffies 0 seconds
        starttime : 32,246,240 jiffies 322,462 seconds

Process run time  : 31,050
Process CPU time  : 485,286 jiffies 4,852 seconds
CPU usage since birth: 15.6%

用ps 计算“当前”负载

这是一个(有点?)可耻的尝试,但是可以。让我们去吧。

可以使用提供的时间ps并由此计算CPU使用率。考虑它时,它实际上可能很有用,但有一些限制。

这对于长时间计算CPU使用率可能很有用。也就是说,您想plugin-container在执行某些与Firefox相关的任务时监视Firefox中的平均CPU负载。

通过使用以下输出:

$ ps -p -o cputime,etimes

CODE    HEADER   DESCRIPTION
cputime TIME     cumulative CPU time, "[DD-]hh:mm:ss" format.  (alias time).
etime   ELAPSED  elapsed time since the process was started, [DD-]hh:]mm:ss.
etimes  ELAPSED  elapsed time since the process was started, in seconds.

在此示例中,我在计算时使用etimeetimes更多内容,只是更加清楚了一点。另外,我为“ fun”添加了%cpu。在bash脚本中,显然可以使用etimes-或更好地从/proc/<PID>/etc 读取。

Start:
$ ps -p 30894 -o %cpu,cputime,etime,etimes
%CPU     TIME     ELAPSED ELAPSED
 5.9 00:13:55    03:53:56   14036

End:
%CPU     TIME     ELAPSED ELAPSED
 6.2 00:14:45    03:56:07   14167

Calculate times:
            13 * 60 + 55 =    835   (cputime this far)
3 * 3,600 + 53 * 60 + 56 = 14,036   (time running this far)

            14 * 60 + 45 =    885   (cputime at end)
3 * 3,600 + 56 * 60 +  7 = 14,167   (time running at end)

Calculate percent load:
((885 - 835) / (14,167 - 14,036)) * 100 = 38

在此期间,进程使用CPU 38%的时间。

看代码

如果您想知道ps它是怎么做的,并且知道一点C,那么可以做(看起来像您在运行Gnome Debain deriavnt)-代码中有关注释等的态度很好:

apt-get source procps
cd procps*/ps
vim HACKING

我可能会提供有关的更多信息top,并进行持续监视-或通过延迟(也称为“ ps”)与当前CPU负载进行更新。
Runium

2
真是个好答案!
Theodor

计算整个系统的总CPU使用率时该怎么办。工具是试图通过快照获取CPU使用率,还是将其平均化?
CMCDragonkai 2014年

4
man top

%CPU  --  CPU usage
The  task's share of the elapsed CPU time since the last screen update, expressed as a percentage of total CPU time.  In a true SMP environment, if 'Irix
mode' is Off, top will operate in 'Solaris mode' where a task's cpu usage will be divided by the total number of CPUs.  You toggle  'Irix/Solaris'  modes
with the 'I' interactive command.


man ps 
%cpu       %CPU    cpu utilization of the process in "##.#" format. Currently, it is the CPU time used divided by the time the process has been running                       (cputime/realtime ratio), expressed as a percentage. It will not add up to 100% unless you are lucky. (alias pcpu).

嗯,我想知道如何从ps
Theodor

2
您可以从最佳示例中提取top -p 3343 -n1 | awk '/ R /{print $10}'
Rahul Patil 2012年

1
太棒了 我发现awk:ing为pid效果更好,例如top -p 3343 -n1 | awk '/ 3343 /{print $10}'
Theodor

1
谢谢“ top -p”很不错,我从没注意到这个选项!但是,我不喜欢搜索PID,如果偶然的空闲存储区中出现相同的数字,该怎么办。在我的系统上,该信息位于第8行和第9列,因此我这样做:top -p $PID -n1 | awk '{if (NR ==8) print $9 }'
phil_w
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.