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

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

これはへのリンクですこれ質問。

これを実行すると、top次のような結果が得られます。

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

pidは303818%の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を使用または使用しません。したがって、その瞬間にあなたの負荷は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_time = 322,462 pu_time = 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次の2つのファイルを使用してください。

/proc/uptime システムの稼働時間 (秒) およびアイドル・プロセスに費やされた時間 (秒)。
/proc/[PID]/stat プロセスに関するステータス情報です。
  • 最初の値を使用uptimeします(稼働時間)。
  • 以下[PID]/statを使用してください。
#name説明
14 utimeユーザーコードで費やしたCPU時間(紙幣単位で測定)
カーネルコードに費やされた15stime CPU時間(紙幣単位で測定)
サブプロセス時間を含むユーザーコードで消費された16のCPU時間
17 cstimeサブプロセス時間を含むカーネルコードで費やされたCPU時間
22 starttimeプロセスが開始された時間(jiffies)

瞬間時計がカチカチ音です。したがって、sysconf(_SC_CLK_TCK)システムのヘルツ(1秒あたりのティック)を得るために、さまざまな方法を使用します。最後に、他のオプションをすべて使用した後、代替手段として100を使用します。

したがって、utime1234でHertzが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-containerFirefox 関連タスクの実行中に Firefox の平均 CPU 負荷を監視しようとします。

次の出力を使用して:

$ ps -p -o CPU 時間、時間

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.

より明確に説明するために、この例では計算にetimeoverを使用しています。etimesまた、「楽しい」のために%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

この間、プロセスはCPUを38%使用しました。

コードを見てください

それがどのように完了したのかを知り、psCについて少し知りたいのなら、それをやってください(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).

関連情報