web-dev-qa-db-ja.com

「ps aux」と「ps -ef」のCPU使用率の違いは何ですか?

Ubuntu 12.04.1 Linuxを使用しています。プロセスのCコマンドの%CPUpsの出力形式に違いがあるようです。 psのマニュアルページには明確に記載されていません。

マニュアルページは言う:

  CODE       HEADER  DESCRIPTION
  %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).
  c          C       processor utilization. Currently, this is the integer                  
                     value of the percent usage over the lifetime of the
                     process. (see %cpu).

したがって、基本的には同じである必要がありますが、そうではありません。

$ ps aux | head -1
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
$ ps aux | grep 32473
user     32473  151 38.4 18338028 6305416 ?    Sl   Feb21 28289:48 ZServer -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./log 


$ ps -ef | head -1
UID        PID  PPID  C STIME TTY          TIME CMD
$ ps -ef | grep 32473
user     32473 32472 99 Feb21 ?        19-15:29:50 ZServer -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./log 

上の図は、同時に2%のCPU使用率を示しています。 「top」は現在のCPU使用率を示し、psはプロセスの存続期間中のCPU使用率を示しています。

寿命の定義は、これら2つの形式オプションでは多少異なると思います。

6

%cpu列とC列はほぼ同じですが、まったく同じではありません。 ps/output.cのpsのソースを見ると、pr_cとpr_cpuの違いがわかります

推測できるように、Cは%cpuの整数値です。奇妙な違いは、Cが最大99にクランプされているのに対し、%cpuはクランプされていないことです(%cpuのチェックはありますが、フォーマットがxx.x%からxxx%に変更されるだけです)。

今、私はなぜCがこのクランプを持っているのか本当にわかりません。それは少し恣意的です。 procps 3.2.7(2006)以降に存在しているので、おそらくシングルCPUの時代からのものだった

2
Craig Small

注:私はあなたと同じLinuxを使用していないので、これは明示的な答えをテストするためのより多くの提案です。私はそれがまだ役立つことを願っていますし、同じ結果が得られるかどうかを確認することに本当に興味があります。

私が実行したテストから、C列のCPUパーセンテージ値の切り捨て(丸めない)を除いて、値は同じです。

次のテストを実行して、同様の値が得られるかどうかを確認することをお勧めします。一部のリソースを使用するプロセスを開始します。

dd if=/dev/zero of=/dev/null & 
DD_PID=$!

次に、;を使用してプロセスのチェックを実行し、各呼び出しをできるだけ同時に行います。

ps -f --pid $DD_PID | head ; echo --- ; ps -u -p $DD_PID | head

それは次のようなものを生成するはずです:

UID        PID  PPID  C STIME TTY          TIME CMD
someuser  2743 21793 99 10:38 pts/25   00:24:37 dd if=/dev/zero of=/dev/null
---
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
someuser  2743 99.9  0.0 107940   656 pts/25   R    10:38  24:37 dd if=/dev/zero of=/dev/null

注:-fの代わりに-efを使用し、auxの代わりに-uを使用しましたが、どちらも使用される列とフィルタリングを変更するためのものです、コンテンツではありません。必要に応じて、grepの使用に切り替え、-p PIDを削除できます。

1
Voltaire