GNU/Linux >> Linux の 問題 >  >> Linux

/proc/pid/stat からアプリケーションの合計 CPU 使用率を取得するにはどうすればよいですか?

準備

特定のプロセスの CPU 使用率を計算するには、以下が必要です:

<オール>
  • /proc/uptime
    • #1 システムの稼働時間 (秒)
  • /proc/[PID]/stat
    • #14 utime - ユーザー コードで費やされた CPU 時間 (クロック ティックで測定)
    • #15 stime - カーネル コードで費やされた CPU 時間 (クロック ティックで測定)
    • #16 cutime - 待望の子供向け ユーザー コードで費やされた CPU 時間 (クロック ティック) )
    • #17 cstime - 待望の子供向け カーネル コードで費やされた CPU 時間 (クロック ティック) )
    • #22 starttime - プロセスが開始された時間 (クロック ティックで測定)
  • システムのヘルツ (1 秒あたりのクロック数)。
    • ほとんどの場合、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 使用率の計算


    過去 10 秒間にプロセスが使用した CPU% を計算する必要がある場合

    <オール>
  • gettotal_time (13+14) in jiffies => t1starttime(22) in jiffies => s1
  • -- 10 秒の遅延

    total_time (13+14) in jiffies => t2starttime(22) in jiffies => s2

    t2-t1 *100 / s2 - s1 は % を与えませんか??


    はい、そう言えます。数式を使用して、これらの値を秒に変換できます:

          sec = jiffies / HZ ; here - HZ = number of ticks per second
    

    HZ 値は構成可能です - カーネル構成時に行われます。


    これが BASH で書かれた私の簡単な解決策です . "top " または "ps ". 単純なモノクロ (高速) とカラー バージョン (少し遅いが、特にプロセスの状態を監視するのに役立ちます) の 2 つのバージョンがあります。CPU 使用率で並べ替えました。

    https://github.com/AraKhachatryan/top

    • ユータイム時間キュータイムcstime開始時間 CPU 使用率の取得に使用 /proc/[pid]/stat から取得 ファイル。

    • 状態ppid優先いいねnum_threads /proc/[pid]/stat からもパラメータを取得 ファイル。

    • 住人data_and_stack メモリ使用量の取得に使用されるパラメータ /proc/[pid]/statm から取得 ファイル。

    
        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
        }
    
    


    Linux
    1. Linuxは複数の連続したパスセパレーター(/ home //// username /// file)をどのように処理しますか?

    2. Linux – / proc // exeシンボリックリンクは通常のシンボリックリンクとどのように異なりますか?

    3. Linux – / procからインターフェイスのIpv4アドレスを取得する方法は?

    1. Linux – / proc / pid / smapsからプロセスのメモリ使用量に関する情報を取得しますか?

    2. コマンドラインから Linux の CPU/コア数を取得する方法は?

    3. プロセスが実行されているフォルダーを見つける方法は?

    1. Unix / Linux でプロセスのパスを取得するにはどうすればよいですか

    2. CからLinuxでPIDによってプロセスのCPU使用率を計算する方法は?

    3. stdin がシェルから /dev/null かどうかを確認する方法は?