「htop」は正しいCPU%を表示しませんが、「top」は表示します


12

実行中mencoder(クアッドコアCPU上で)スレッド= 4。本当の CPU使用率htopは表示されませんが、表示されますtop

htopは1つのコアについてのみレポートしているようです。これはhtopのバグ/制限ですか?ここで何が起こっていますか?

以下のための他のエントリはありませんmencoderのはに表示psまたはhtopまたはtop。私はその前提と100%の 1つのコアが限界に達していることを意味しますが、でもこれは私には奇妙に思えます。他のコアはどうですか?

更新:「システムモニター」出力を追加

                  PID   %CPU   COMMAND                    
           "top"  1869   220   mencoder                 
          "htop"  1869    95   mencoder -noodml /media/...  
"System Monitor"  1869   220   mencoder

htopにはどのフラグを使用していますか?
Sep332

sep332 ... "htop"を実行するだけです...ですから、デフォルトが何であれそれが当てはまります。
Peter.O

ビンゴ!sep332 ..それから答えを出して、解決済みとマークします。デフォルトを見てくれました....「H」は「ユーザースレッドを非表示にするトグルキーです...情報ヘルプを読んでください」が、正しい指示で役立つヒントが役立つ場合があります。ありがとう。
Peter.O

@ Peter.O:偶然ダウン投票(マウスタッチパッド!)。投稿を編集する場合はキャンセルします。
SabreWolfy

回答:


24

自分で言ったように、Hユーザースレッドを表示するためにヒットできます。

ただ、将来の参考のために(と楽しみのために)、の計算のCPU使用率を聞かせて!

ちょっとした背景:

最新のオペレーティングシステムには、スケジューラがあります。すべてのプロセスとそのスレッドが計算時間のかなりの部分を確保することを目的としています。私はあまりスケジューリングを行いません(本当に複雑です)。しかし、最終的には実行キューと呼ばれるものがあります。これは、すべてのプロセスのすべての命令が順番に実行されるのを待つ場所です。

すべてのプロセスは、その「タスク」を実行キューに入れ、プロセッサの準備が整うと、それらをポップして実行します。たとえば、プログラムがスリープ状態になると、実行キューから自分自身を削除し、実行の準備が整うと「行末」に戻ります。

このキューでのソートは、プロセスの優先度(「nice value」とも呼ばれます。つまり、プロセスはシステムリソースに適しています)に関係しています。

キューの長さにより、システムの負荷が決まります。たとえば、2.5の負荷は、CPUがリアルタイムで処理できるすべての命令に対して2.5命令があることを意味します。

ところで、Linuxでは、この負荷は10ミリ秒間隔で計算されます(デフォルト)。

次に、CPU使用率のパーセント値について説明します。

2つのクロックがあり、1つが呼び出されtリアルタイムを表しているとします。1秒ごとに1秒を測定します。私たちが呼ぶもう一つの時計c。実行する処理がある場合にのみ実行されます。つまり、プロセスが何かを計算したときにのみクロックが実行されます。これはCPU時間とも呼ばれます。システム上のすべてのプロセスは、それらの1つを「持っています」。

単一プロセスのプロセッサ使用率を計算できるようになりました。

U = c / t = 0.5s / 1s = 0.5

またはすべてのプロセスに対して:

代替テキスト

マルチコアマシンでは、CPUが完全に使用された場合、毎秒4秒の計算を計算できるため、これはもちろん3.9の値になる可能性があります。

ウィキペディアには次の例があります。

6 CPU UNIXマシンで実行されているソフトウェアアプリケーションは、ユーザーの要件を満たすために3つのUNIXプロセスを作成します。これら3つのプロセスはそれぞれ2つのスレッドを作成します。ソフトウェアアプリケーションの作業は、アプリケーション用に作成された6つの独立した実行スレッドに均等に分散されます。リソースの待機が関与しない場合、合計CPU時間は経過したリアルタイムの6倍になると予想されます。

これはこれを行う小さなPythonスニペットです

>>> import time
>>> t = time.time()
>>> c = time.clock()
>>> # the next line will take a while to compute
>>> tuple(tuple(i**0.2 for i in range(600)) for i in range(6000))
>>> print (time.clock() / (time.time() - t)) * 100, "%"
66.9384021612 %

完璧な世界では、システム負荷は100-66.93 = 33,1%であると推測できます。(しかし、実際にはI / O待機、スケジューリングの非効率性などの複雑なことのために間違っているでしょう)

loadとは対照的に、これらの計算の結果は常に 0からプロセッサ数の間、つまり0から1または0から100%の値になります。100%のCPUを使用する3つのタスクを実行するマシンと、100%のタスクを実行するマシンを区別する方法は現在ありません。たとえば、多くのコンピューターで多数のプロセスのバランスをとろうとしている場合、CPU使用率はほとんど役に立ちません。負荷はそこにあるものです。

現在、実際には、これらの処理タイムクロックが複数あります。たとえば、I / Oを待つためのものがあります。したがって、I / Oリソース使用率も計算できます。

これは元の質問に関しては役に立たなかったかもしれませんが、興味深いことを願っています。:)


この単純な方法を使用して、計算はおそらく±1%オフになりますので、私は本当に、不確定値が含まれている必要がありますが、私はボアみんなにしたくなかった、あまりにも多くの。
ステファノパラッツォ

レッスンをありがとう。私はそのほとんどを知っていましたが、いくつかのことは私が学んだことよりも具体的でした。
NightwishFan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.