topとpsは同じCPU結果を表示しません


54

これはこの質問にリンクされています。

実行するtopと、次の結果が得られます。

ここに画像の説明を入力してください

pid 3038は18%CPUを使用していますが、実行中は

ここに画像の説明を入力してください

結果は5.5%です。そして、この数値は時間とともに変化しないように見えます(つまり、同じコマンドを少し後で実行する場合)...

されたpsコマンドは、何らかの形でCPU使用率を平均化?

回答:


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を使用するかどうかを決定します。したがって、その正確な瞬間に0%または100%の負荷があります。

ps付与:即時のCPU使用率を与える必要がある場合、0%または100%のいずれかになります。

top 一方、ポーリング数を保持し、時間の経過とともに負荷を計算します。

ps現在の使用状況を指定することもできますが、データを複数回読み取り、各読み取りの間にスリープする必要があります。そうではありません。

ps%cpuの計算

ps 次の方法でCPU使用率を計算します。

稼働時間=システムが稼働している合計時間。
ps_time =ブートからの秒数で測定されたプロセス開始時間。
pu_time =プロセスがCPUを使用している合計時間。

;; 秒プロセスが実行されています:
秒=稼働時間-ps_time
;; 使用法:
cpu_usage = pu_time * 1000 /秒

print: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/

psCPU使用率を計算するとき、2つのファイルを使用します。

/ proc / uptimeシステムの稼働時間(秒)、およびアイドルプロセスに費やされた時間(秒)。
/ proc / [PID] / statプロセスに関するステータス情報。
  • uptimeそれは最初の値(使用稼働時間を)。
  • [PID]/stat以下から使用します。
 #名前説明
jiffiesで測定されたユーザーコードで費やされた14 utime CPU時間
カーネルコードで消費される15 stime CPU時間(jiffiesで測定)
子からの時間を含むユーザーコードで費やされた16キューティーCPU時間
カーネルコードで費やされた17 cstime CPU時間(子からの時間を含む) 
22 starttimeプロセスが開始された時間(jiffiesで測定)

jiffieは、クロックティックです。そのため、さらに、さまざまな方法を使用sysconf(_SC_CLK_TCK)して、システムのヘルツ(1秒あたりのティック数)を取得します。最終的には、他のオプションを使い果たした後、フォールバックとして100を使用します。

その場合はutime1234ヘルツは、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を使用した「現在の」負荷の計算

これは(ちょっと?)日陰の努力ですが、OKです。やってみましょう。

提供された時間を使用し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ます。また、「楽しい」ために%cpuを追加します。すなわち、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

の詳細情報topと継続的な監視で更新するかps、現在のCPU負荷で「by by delay」というスナップショットで更新する場合があります。
ルニウム

2
本当に素晴らしい答えです!
テオドール

システム全体の合計CPU使用率を計算する場合はどうでしょうか。ツールはスナップショットを介してCPU使用率を取得しようとしていますか、それとも経時的に平均化しますか?
CMCDragonkai 14

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).

うーんええ、私はからその(インスタントCPUの割合)を取得する方法ワンダーps
テオドール

2
あなたは、トップの例から抽出することができますtop -p 3343 -n1 | awk '/ R /{print $10}'
ラーフルパティル

1
驚くばかり。私はその見つかったawk:INGのためpidのように、より良い仕事をtop -p 3343 -n1 | awk '/ 3343 /{print $10}'
テオドール

1
「top -p」はいいですね、このオプションに気付いたことはありません!ただし、PIDを検索するのは好きではありません。空きメモリセクションなどに偶然同じ数字が表示される場合はどうでしょうか。私のシステムでは、情報は8行9列にあるため、次のようにしますtop -p $PID -n1 | awk '{if (NR ==8) print $9 }'
。– phil_w
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.