マシンを占有しているプロセスを見つける方法

マシンを占有しているプロセスを見つける方法

シナリオ: 突然、コンピューターの動作が遅くなったように感じます。マウスは動きますが、ウィンドウが開くまでに時間がかかります。uptime負荷は 7.69 で増加中と表示されます。

負荷の原因となっているプロセスを見つける最も早い方法は何ですか?

さて、「top」や類似のツールは、CPUまたはメモリの使用率を表示するものの、両方を同時に表示することはできないため、答えにはなりません。必要なのは、発生したときに入力できる単一のコマンドです。

プロセス X のため、システムは 8GB の RAM をディスクにスワップしようとしています...

または

プロセスXはディスク全体をシークする

または

プロセス X は CPU を 400% 使用しています"

私が探しているのは、iostat、htop/atop、および同様のツールが次のような出力で実行されることです。

 1235 cp - Disk trashing
   87 chrome - Uses 2 GB of RAM
  137 nfs_bench - Uses 95% of the network bandwidth

私が欲しいのは、分析できる数値を提供してくれるツールではなく、現在の負荷の原因となっているプロセスを正確に教えてくれるツールです。キーボードの前にいるユーザーは「プロセス」の書き方をほとんど知らないものの、「常駐サイズ」、「仮想メモリ」、または「プロセスのライフ サイクル」となるとすぐに圧倒されてしまうと仮定します。

私の主張はこうです: ユーザーが問題に気づきます。理由は何千通りもあるでしょう... まあ、ほぼそうです :-) ユーザーは問題の原因を知りたいのです。

現在のソリューションでは多くの数字が提示されますが、これらの数字が何を意味するのかを知る必要があります。私が探しているのはメタ ツールです。データの 99% は問題とは無関係です。したがって、ツールが行うべきことは、リソースを大量に消費するプロセスを探し、そのプロセスのみを「このプロセスは大量の CPU を必要とし、このプロセスは多くの IRQ を生成し、このプロセスは大量の RAM を割り当てます (そして、まだ増加中)」とリストすることです。

これは比較的短いリストになります。このリストは、たとえば、htop約 5000 個の数字が返されるものの、自分でマルチスレッド プロセスを折りたたむ必要がある出力 ( VIRT 2750MRAM が 16 GB しかないと表示される行が 50 行あります。マシンはスワップによって自動的に死ぬはずですが、もちろん、これはすぐに起こり得るデータの誤った解釈です) よりも、このリストの方が、初心者にとって原因を見つけるのがはるかに簡単になります。

答え1

回答を見ると笑ってしまいます。なぜなら、それぞれがツールXを実行するように指示しているからです。唯一の問題は、表示されているものが断続的である場合、相関関係を調べる方法がまったくないということです。サル十分に高い頻度で実行すれば役立つかもしれませんが、収集するさらに良いです。

のようにサルRPM をインストールして を実行すると、デーモンとして実行されます/etc/init.d/collectl start

何か遅いものが見つかったら、collectl -p /var/log/collectl/filename --topデータを再生して上位のプロセスを表示します。また、単に実行してcollectl --topリアルタイムで確認することもできます。ちなみに、リアルタイムで実行できるものはすべて再生することもできます。

CPU 負荷に関しては、割り込みによって過負荷になった場合はどうなるでしょうか? では、 collectl -sC個々の CPU の負荷 (または平均負荷) が表示されるだけでなく、CPU の時間消費状況も表示されます。 ( )-scを含めると、CPU あたりの割り込み数が表示されます。大文字を使用すると、CPU あたりの各割り込みの種類が表示されます。-j-scj-J

もちろん、vmstat が本当に好きな場合は、いつでも collectl データを再生することができ--vmstat、履歴データが vmstat 形式で表示されます。

スイッチはリストアップする時間がないほどたくさんありますが、以下で確認できます。ソースフォージまたはグーグルで検索してください。

答え2

正しい数値を見ている限り、「top」は十分に機能します。 見てみましょう:

top - 13:11:45 up 13 days,  1:13, 21 users,  load average: 0.06, 0.11, 0.26
Tasks: 271 total,   2 running, 267 sleeping,   0 stopped,   2 zombie
Cpu(s): 19.0%us,  6.3%sy,  0.0%ni, 74.0%id,  0.5%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:   8183668k total,  8002712k used,   180956k free,    12476k buffers
Swap: 11847900k total,   723480k used, 11124420k free,   767016k cached

ここで、CPU がすべて使用されているためにシステムが遅い場合は、「Cpu(s):」行の「us」列と「sy」列が合わせて 100% に近くなることが表示されます。

スワッピングが原因で速度が遅い場合は、「Mem:」の「free」には非常に低い値が表示され、「Swap:」の「used」に高い値が表示されます。

遅い場合は入出力一般的に、「Cpu(s):」の「wa」は、時間が I/O 待機に費やされていることを示します。

ここで、I/O 待機が問題であることがわかっている場合は、「iotop」プログラムを使用して、どのプロセスが最も多くの I/O を作成するかを知ることができます。

答え3

400% の使用率から、クアッドコア プロセッサを搭載していると想定します。負荷平均は容量のほぼ 2 倍で、プロセスの半分が CPU を待機しています。

まず、reniceシェルを 0 または -10 に設定してシステムの応答性を高め、次に を使用してhtop問題のあるプロセスを見つけ、strace特定のプロセスに対して を実行します。役立つ可能性のあるその他のツールは次のとおりです。

  • vmsat
  • sar
  • iostat
  • pmap

答え4

vmstat は一般的な意味で役立ちます。使用例は次のとおりです。

$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0      0 977908 426184 1543884    0    0    38    45  106  385  4  1 95  1

X 秒ごとに実行することもできます。コマンドの後に数字 X を追加するだけです。

編集: コメントを考慮して... 次の内容をファイルに書き込み、そのファイルを実行可能にします。マシン上の上位 3 つのプロセスが表示されます。

top -n 1 | tail -16 | head -4 | awk '{print $13}'

CPU ではなくメモリを占有しているものを知りたい場合は、トップのマニュアル ページを読んで、表示順序を変更します。

関連情報