top、htop、ps を使用せずに CPU を消費しているプロセスを検出しますか?

top、htop、ps を使用せずに CPU を消費しているプロセスを検出しますか?

どのプロセスが CPU を消費しているかを推測することしかできない問題が発生しました。

私の CPU 使用率は、psensor のすべてのコアで約 80% でした。

htoptopを試しましたps -A -o pcpu,pid,cmd --sort +pcpu(最後に試したのは sudo ですが、効果はありませんでした)。
これらすべてで、原因となっている pid (私が認識しているもの) が約 7% しか使用されていないことが示されました...

その pid に対して SIGKILL を実行すると、すべてが正常に戻ります。

テストのために、ターミナルで無限ループを実行しましたwhile true;do echo -n;doneが、htop でそれがはっきりと確認できました。そのため、問題の原因はそれとは似ていなかったと推測します...

では、推測せずに犯人を見つける他の方法はあったのだろうか?

psensorもう一度考えてみると、他のアプレットでは表示できなかったが、その値を表示できた計算と「システム負荷インジケーター アプレット」が使用した計算が何なのかを知りたいと思います。

追伸:待ち時間に関するリンク負荷平均に関するリンク

答え1

正確なヒントを提供できるほど詳細に精通しているわけではありませんが、実際に発生した負荷と表示される CPU 使用率の違いには 2 つの原因があると思います。

  1. プロセスは複数のスレッドで構成され、topそれらを合計しない場合があります。スレッドの数は次の方法で確認できます。

    ps -eo pid,nlwp,%cpu,user,args
    

    では、topを使用してスレッド処理を切り替えることができますH。各スレッドの CPU 使用率は通常かなり低くなります。

  2. プロセスは大量の I/O を引き起こす可能性があります。I/O 待機時間は全体的な CPU 負荷の一部ですが、プロセスの CPU 使用率の値の一部ではない可能性があります。そのため、waitの値を確認してtopください。どのプロセスがどの程度 I/O を引き起こしているかはわかりませんが、値が低い場合はその影響を説明できません。

答え2

UNIX システムで実行されるコードは、カーネル コードまたはユーザー ランド コードのいずれかに分類されます。ユーザー ランド コードは常にプロセスにアタッチされるため、CPU がユーザー ランド コードの実行でビジー状態の場合は、 のどこかの行に表示されますtop。カーネル コードは通常、プロセスにアタッチされます。カーネルがシステム コールを実行している場合、カーネル内の処理はそのプロセスに属するものと見なされます。カーネル時間は、ユーティリティによって報告される「システム時間」ですtime

カーネルが行う処理の中には、1 つのプロセスに直接関連付けることができないものもあります。特に、ハードウェア割り込みは、本来特定のプロセスに属するものではありません。たとえば、ネットワーク カードによって割り込みがトリガーされたとします。カーネルは、ネットワーク パケットを読み取って解析するコードを実行します。この時点では、プロセスは関与していません。パケットはファイアウォール ルールによって拒否される可能性があり、その場合、どのプロセスもその処理時間を請求できません。プロセスがそのパケットを受信すると、受信時間の一部はそのプロセスのタブに記録されますが、初期段階は記録されません。

つまり、どのプロセスにも属さない CPU 時間が存在する可能性があります。しかし、その CPU 時間は間接的に何らかのプロセスによって発生することがあります。たとえば、別のマシンにパケットを送信してこの別のマシンに応答させるプロセスがあるが、ファイアウォールが応答パケットをブロックする場合、応答パケットの解析と破棄に費やされた時間は、その送信プロセスにまでさかのぼることはできません。ただし、送信プロセスが停止してリモート マシンが応答を停止すると、カーネルはパケットを拒否するのに時間を費やさなくなります。もちろん、ネットワークは 1 つの例にすぎず、カーネルが 1 つのプロセスに直接追跡できないことを実行する方法は他にもたくさんあります。

これが実際に起こっていることであることを確信するには情報が不十分ですが (カーネル デバッガーなしでは把握するのが難しい場合があります)、これはもっともらしい説明です。

答え3

htop、ps、topを使いたくない場合は、より低レベルの詳細を得るためにsystemtapを使うことができます。

関連情報