Ubuntu Linux 16.10システムモニタのCPU使用率の測定値が「pcpu」とおおよそ一致することを望みますps
。これは、4つのコアを持つLenovo Thinkstationデスクトップで実行される単一のFirefoxブラウザプロセスのCPU使用率です。
Ubuntu Linux 16.10システムモニタのデフォルト設定は現在、次のように設定されています。
Update interval in seconds: 3.00
Enable smooth refresh: Yes
Alert before ending or killing processes Yes
Divide CPU usage by CPU count : Yes
Firefoxプロセスのps出力は次のとおりです。
$ ps -eo pid,rss,c,pcpu,cputime,cmd | grep firefox
2848 726024 3 3.5 00:50:23 /usr/lib/firefox/firefox -new-window
読んだ後Linux:プロセスの最後の瞬間のCPU使用率の表示、CPU使用率の最後の瞬間を見る方法を学びました。 Firefoxプロセスの最高出力は次のとおりです。
$ top -b -d 1 | grep -in "firefox"
8: 2848 ratio 20 0 1980240 641516 115240 S 18.8 15.9 73:10.86 firefox
Firefoxブラウザアプリケーションの場合、pcpuは3.5%ですps -eo pid,rss,c,pcpu,cputime,cmd
が、同じFirefoxブラウザアプリケーションの場合、GUIアプリケーションUbuntu System MonitorはCPU使用率を5%で表示します。また、Firefoxのtop -b -d 1 |私たちのCPUが使用する4つのコアを4つに分割すると、最高出力の4.0%が得られます。
ps
最高出力とシステムモニタ値をどのように一貫して作成できますか? 「CPU使用率をCPU数で割る」チェックボックスを有効にする必要がありますか?
答え1
速い答え:いいえ、実際には不可能です。
ここでの問題は、まずCPU「パーセンテージ」という概念です。厳密に言えば、これは実際には意味がありません。 CPUには、作業中(100%)または待機中の2つの状態しかありません。
したがって、プロセスのCPU使用量が50%と報告されても、CPUの50%だけが使用されたという意味ではありません。これは、特定の期間中にCPUがプロセスに合計時間の50%を費やすことを意味します。たとえば、リフレッシュ間隔が1秒に設定され、CPUがプロセスNで0.5秒間作業している場合、プロセスNのCPU%は50%で表示されます。
これを念頭に置いて、CPU%を確認するさまざまな方法を見ることができます。の場合ps
(で)で測定されますman ps
。
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%.
したがって、報告された割合はps
実際にはプロセスの全体的な寿命の平均です。対照的に、top
報告書は次のように記述した。
The task's share of the elapsed CPU time since the last screen
update, expressed as a percentage of total CPU time.
同様に動作すると仮定しますgnome-system-monitor
。 CPU%は、最後の更新以降にCPUが特定のプロセスに費やした時間の割合です。私のC ++の知識は基本的には存在しませんが、次の行はproctable.cpp
(gnome-system-monitor
ソースコードの一部)は、最後のリフレッシュ以降に平均を取ることを示しています。
/* FIXME: total cpu time elapsed should be calculated on an individual basis here
** should probably have a total_time_last gint in the ProcInfo structure */
glibtop_get_cpu (&cpu);
app->cpu_total_time = MAX(cpu.total - app->cpu_total_time_last, 1);
app->cpu_total_time_last = cpu.total;
いいえ、CPU がプロセスに費やした時間の割合を表示するため、同意ps
できません。gnome-system-monitor
ps
そのプロセスが始まってからgnome-system-monitor
パーセントを表示して最後のリフレッシュ以降。
また、2つの値が一致する必要がある理由も想像できません。私の考えでは、XYの問題。究極の目標が何であるか、2つの値を一致させて解決しようとする問題を説明する新しい質問をしたいかもしれません。