这是链接到这问题。
当我运行时,top
我得到以下结果:
pid3038
使用 18% cpu,但是运行时
结果是5.5%。而且这个数字似乎不会随着时间而变化(即稍后运行相同的命令时)......
该ps
命令是否以某种方式平均 CPU 使用率?
答案1
man ps
在NOTES
部分。
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 使用率 % 10
例子: 正常运行时间 = 344,545 ps_时间 = 322,462 pu_时间 = 3,383 秒 = 344,545 - 322,462 = 22,083 CPU 使用率 = 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/
.
计算 CPU 使用率时ps
,它使用两个文件:
/proc/uptime 系统的正常运行时间(秒),以及空闲进程所花费的时间(秒)。 /proc/[PID]/stat 有关进程的状态信息。
- 其中
uptime
使用第一个值 (正常运行时间)。 - 其中
[PID]/stat
使用以下内容:
# 名称 描述 14 utime 用户代码所花费的 CPU 时间,以 jiffies 为单位测量 15 stime 花费在内核代码上的 CPU 时间,以 jiffies 为单位测量 16 cutime 用户代码所花费的 CPU 时间,包括子进程的时间 17 cstime 内核代码所花费的 CPU 时间,包括子进程的时间 22 starttime 进程启动的时间,以 jiffies 为单位
A吉菲是时钟滴答声。因此,此外它还使用各种方法,即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.
我在这个示例中使用etime
overetimes
进行计算,只是为了更清楚一点。另外,我添加 %cpu 是为了“有趣”。在 ie bash 脚本中,人们显然会使用etimes
- 或者更好地读取/proc/<PID>/
等。
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
在此期间,进程有 38% 的时间使用 CPU。
看代码
如果你想知道ps
它是怎么做的,并且懂一点 C,就做(看起来你运行 Gnome Debain deriavnt)——代码中关于注释等的态度很好:
apt-get source procps
cd procps*/ps
vim HACKING
答案2
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).