どのプロセスがCPUを消費しているのかを推測することしかできないという問題に取り組んでいます。
私のpsensorのすべてのコアのCPU使用率は約80%です。
私はそれを試しましたhtop
(top
最後ps -A -o pcpu,pid,cmd --sort +pcpu
にsudoを使用しても役に立ちませんでした)。
これは、犯人PIDが(私が知っている限り)約7%しか使用していないことを示唆しています...
その pid に SIGKILL シグナルを送信すると、すべてが正常に戻ります。
テストのためにターミナルで無限ループを作ってみましたがwhile true;do echo -n;done
、htopでは確かにわかり、問題の原因はこれと同じではないようです。
それでは、推測せずに犯人を見つける他の方法はないだろうか?
psensor
もう一度考えると、その値を表示できますが、他の値は表示できない計算と「システムロードインジケータアプレット」が何を使用しているのかを知りたいです。
答え1
正確なヒントを提供するのに十分な詳細はありませんが、実際に導出されたロードと表示されたCPU使用率の間に2つの不一致の原因があると思います。
プロセスは複数のスレッドで構成でき、
top
それを要約することはできません。以下を使用してスレッド数を確認できます。ps -eo pid,nlwp,%cpu,user,args
top
スイッチスレッド処理を使用できますH
。スレッドあたりのCPU使用率は通常非常に低いです。このプロセスは過度のI / Oを引き起こす可能性があります。 I / OレイテンシはCPU全体の負荷の一部ですが、プロセスのCPU使用率の一部ではない可能性があります。したがって、小切手
wait
の値ですtop
。どのプロセスがどの程度原因であるかはわかりませんが、値が低いとその効果を説明できません。
答え2
UNIXシステムで実行されるコードは、カーネルコードとユーザーモードコードに分けられます。ユーザーモードコードは常にプロセスに接続されているため、CPUがユーザーモードコードを実行している場合に表示されますtop
。カーネルコードは通常プロセスにリンクされます。カーネルがシステムコールを実行すると、カーネル内の処理が実行されます。そのプロセスに属するとみなされます。カーネル時間は、ユーティリティによって報告された「システム時間」ですtime
。
カーネルが実行する一部の操作は、プロセスに対して直接計算できません。特に、ハードウェア割り込みは本質的にプロセスごとに変わらない。たとえば、割り込みがネットワークカードによってトリガされるとします。カーネルはネットワークパケットを読み取って解析するコードを実行し、これまでプロセスは含まれていませんでした。ファイアウォールルールによってパケットが拒否される可能性があります。この場合、どのプロセスでもその処理時間を必要とすることはできません。プロセスが最終的にパケットを受信すると、受信時間の一部が[プロセス]タブに表示されますが、最初のステップは表示されません。
したがって、どのプロセスにも属さないCPU時間を持つことができます。ただし、CPU時間が一部のプロセスによって間接的に発生することもあります。たとえば、別のシステムにパケットを送信して他のシステムに応答させるプロセスがありますが、ファイアウォールが応答パケットをブロックしている場合、応答パケットを解析して破棄するのにかかる時間は、その転送プロセスまで追跡されません。しかし、転送プロセスが中断されてリモートコンピュータからの応答が中断されると、カーネルはもはやパケットを拒否するのに時間を費やすことはありません。もちろん、ネットワーキングは一例に過ぎず、カーネルがプロセスを直接追跡することができないタスクを実行する他の多くの方法があります。
何が起こっているのかを確認するのに十分な情報を提供していませんが(カーネルデバッガがなければ理解するのは難しいかもしれません)、それは合理的な説明です。
答え3
htop、ps、およびtopを使用したくない場合は、systemtapを使用してより多くの基本的な詳細を取得できます。