首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从/proc/pid/stat获得应用程序的CPU总使用量?

如何从/proc/pid/stat获得应用程序的CPU总使用量?
EN

Stack Overflow用户
提问于 2013-05-24 02:22:40
回答 6查看 114.7K关注 0票数 72

我想知道如何计算进程的CPU总使用量。

如果我做了cat /proc/pid/stat,,我认为相关的字段是(取自lindevdoc.org):

  1. 在用户代码中花费的CPU时间,以jiffies度量
  2. 在内核代码中花费的CPU时间,以jiffies度量
  3. 用于用户代码的CPU时间,包括来自子程序的时间
  4. 在内核代码中花费的CPU时间,包括来自子程序的时间

那么,花在14到17字段之和上的总时间是多少呢?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-05-24 13:51:04

准备工作

要计算特定进程的CPU使用量,您需要以下内容:

  1. /proc/uptime
    • 系统的#1正常运行时间(秒)

  2. /proc/[PID]/stat
    • #14 utime - CPU在用户代码中花费的时间,以时钟刻度来衡量。
    • #15 stime - CPU在内核代码中花费的时间,以时钟刻度来衡量。
    • #16 cutime -等着孩子们在用户代码中花费的 CPU时间(时钟滴答)
    • #17 cstime -等待-等待在内核代码中花费的孩子的 CPU时间(时钟刻度)
    • #22 starttime -进程开始时的时间,以时钟刻度

  3. 赫兹(时钟滴答数每秒)的系统。

计算

首先,我们确定整个过程所花费的总时间:

代码语言:javascript
运行
复制
total_time = utime + stime

我们还必须决定是否包括儿童进程的时间。如果我们这样做了,那么我们将这些值添加到total_time

代码语言:javascript
运行
复制
total_time = total_time + cutime + cstime

接下来,我们得到自进程启动以来的总运行时间(以秒为单位):

代码语言:javascript
运行
复制
seconds = uptime - (starttime / Hertz)

最后,我们计算CPU使用率:

代码语言:javascript
运行
复制
cpu_usage = 100 * ((total_time / Hertz) / seconds)

另请参阅

Top和ps没有显示相同的cpu结果。 如何在Linux (c++)中获得cpu的总使用量 计算Linux中进程的CPU使用量

票数 171
EN

Stack Overflow用户

发布于 2013-05-24 09:13:27

是的,你可以这么说。可以使用公式将这些值转换为秒:

代码语言:javascript
运行
复制
      sec = jiffies / HZ ; here - HZ = number of ticks per second

HZ值是可配置的-在内核配置时完成.

票数 6
EN

Stack Overflow用户

发布于 2019-05-08 17:11:01

下面是我用BASH编写的简单解决方案。它是一个linux/unix系统监视器和procfs进程管理器,如"top“或"ps”。有两个版本--简单单色(Fast)和彩色版本(有点慢,但对于监视进程的statе非常有用)。我按CPU的使用进行排序。

https://github.com/AraKhachatryan/top

  • /proc/pid/stat文件中获得utimestimecutimecstimestarttimeE 218获得E 119cpu使用率E 220
  • /proc/pid/stat文件中还获得了状态、ppid、优先级、尼斯、num_线程E 234参数。
  • 用于获取data_and_stack内存使用量并从/proc/pid/statm文件中获取的驻留和参数。
代码语言:javascript
运行
复制
    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
    }

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16726779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档