我想知道如何计算进程的CPU总使用量。
如果我做了cat /proc/pid/stat
,,我认为相关的字段是(取自lindevdoc.org):
那么,花在14到17字段之和上的总时间是多少呢?
发布于 2013-05-24 13:51:04
准备工作
要计算特定进程的CPU使用量,您需要以下内容:
/proc/uptime
#1
正常运行时间(秒)/proc/[PID]/stat
#14
utime
- CPU在用户代码中花费的时间,以时钟刻度来衡量。#15
stime
- CPU在内核代码中花费的时间,以时钟刻度来衡量。#16
cutime
-等着孩子们在用户代码中花费的 CPU时间(时钟滴答)#17
cstime
-等待-等待在内核代码中花费的孩子的 CPU时间(时钟刻度)#22
starttime
-进程开始时的时间,以时钟刻度getconf CLK_TCK
返回时钟滴答数。sysconf(_SC_CLK_TCK)
C函数调用也可用于返回赫兹值。计算
首先,我们确定整个过程所花费的总时间:
total_time = utime + stime
我们还必须决定是否包括儿童进程的时间。如果我们这样做了,那么我们将这些值添加到total_time
total_time = total_time + cutime + cstime
接下来,我们得到自进程启动以来的总运行时间(以秒为单位):
seconds = uptime - (starttime / Hertz)
最后,我们计算CPU使用率:
cpu_usage = 100 * ((total_time / Hertz) / seconds)
另请参阅
Top和ps没有显示相同的cpu结果。 如何在Linux (c++)中获得cpu的总使用量 计算Linux中进程的CPU使用量
发布于 2013-05-24 09:13:27
是的,你可以这么说。可以使用公式将这些值转换为秒:
sec = jiffies / HZ ; here - HZ = number of ticks per second
HZ值是可配置的-在内核配置时完成.
发布于 2019-05-08 17:11:01
下面是我用BASH编写的简单解决方案。它是一个linux/unix系统监视器和procfs进程管理器,如"top“或"ps”。有两个版本--简单单色(Fast)和彩色版本(有点慢,但对于监视进程的statе非常有用)。我按CPU的使用进行排序。
https://github.com/AraKhachatryan/top
E 218
获得E 119
cpu使用率E 220
。E 234
参数。 function my_ps
{
pid_array=`ls /proc | grep -E '^[0-9]+$'`
clock_ticks=$(getconf CLK_TCK)
total_memory=$( grep -Po '(?<=MemTotal:\s{8})(\d+)' /proc/meminfo )
cat /dev/null > .data.ps
for pid in $pid_array
do
if [ -r /proc/$pid/stat ]
then
stat_array=( `sed -E 's/(\([^\s)]+)\s([^)]+\))/\1_\2/g' /proc/$pid/stat` )
uptime_array=( `cat /proc/uptime` )
statm_array=( `cat /proc/$pid/statm` )
comm=( `grep -Po '^[^\s\/]+' /proc/$pid/comm` )
user_id=$( grep -Po '(?<=Uid:\s)(\d+)' /proc/$pid/status )
user=$( id -nu $user_id )
uptime=${uptime_array[0]}
state=${stat_array[2]}
ppid=${stat_array[3]}
priority=${stat_array[17]}
nice=${stat_array[18]}
utime=${stat_array[13]}
stime=${stat_array[14]}
cutime=${stat_array[15]}
cstime=${stat_array[16]}
num_threads=${stat_array[19]}
starttime=${stat_array[21]}
total_time=$(( $utime + $stime ))
#add $cstime - CPU time spent in user and kernel code ( can olso add $cutime - CPU time spent in user code )
total_time=$(( $total_time + $cstime ))
seconds=$( awk 'BEGIN {print ( '$uptime' - ('$starttime' / '$clock_ticks') )}' )
cpu_usage=$( awk 'BEGIN {print ( 100 * (('$total_time' / '$clock_ticks') / '$seconds') )}' )
resident=${statm_array[1]}
data_and_stack=${statm_array[5]}
memory_usage=$( awk 'BEGIN {print( (('$resident' + '$data_and_stack' ) * 100) / '$total_memory' )}' )
printf "%-6d %-6d %-10s %-4d %-5d %-4s %-4u %-7.2f %-7.2f %-18s\n" $pid $ppid $user $priority $nice $state $num_threads $memory_usage $cpu_usage $comm >> .data.ps
fi
done
clear
printf "\e[30;107m%-6s %-6s %-10s %-4s %-3s %-6s %-4s %-7s %-7s %-18s\e[0m\n" "PID" "PPID" "USER" "PR" "NI" "STATE" "THR" "%MEM" "%CPU" "COMMAND"
sort -nr -k9 .data.ps | head -$1
read_options
}
https://stackoverflow.com/questions/16726779
复制相似问题