プロクパス

プロクパス

1 つのプロセスのメモリ / CPU 使用率をリアルタイムで監視したいと思います。 に似ていますが、top1 つのプロセスのみを対象としており、できれば何らかの履歴グラフが付属しているものが望ましいです。

答え1

Linux では、top当然ながら履歴グラフはありませんが、実際には単一のプロセスにフォーカスすることをサポートしています。

top -p PID

これは、異なる構文で Mac OS X でも利用できます。

top -pid PID

答え2

プロクパス

2020年更新(Linux/procfsのみ)。プロセス分析の問題に何度も立ち返り、最初に以下に説明した解決策に満足できなかったため、私は次のように書くことにしました。自分のこれは、いくつかの依存関係 (重い Matplotlib なし) を含む純粋な Python CLI パッケージであり、procfs からの多くのメトリックをプロットしたり、プロセス ツリーに JSONPath クエリを実行したり、基本的なデシメーション/集約 (Ramer-Douglas-Peucker および移動平均)、時間範囲と PID によるフィルタリング、およびその他の機能を備えています。

pip3 install --user procpath

以下は Firefox の例です。これは、プロセス ID に「firefox」が含まれるすべてのプロセスを1 秒あたり 1 回、120 回記録しますcmdline(PID によるクエリは次のようになります)。'$..children[?(@.stat.pid == 42)]'

procpath record -i 1 -r 120 -d ff.sqlite '$..children[?("firefox" in @.cmdline)]'

記録されたすべてのプロセスのうち、1 つのプロセス (または複数) の RSS と CPU 使用率をプロットすると、次のようになります。

procpath plot -d ff.sqlite -q cpu -p 123 -f cpu.svg
procpath plot -d ff.sqlite -q rss -p 123 -f rss.svg

チャートは次のようになります (実際にはインタラクティブな Pygal SVG です)。

翻訳 CPU

psレコード

以下の住所何らかの履歴グラフ. パイソンpsrecordパッケージはまさにこれを実行します。

pip install psrecord                             # local user install
sudo apt-get install python-matplotlib python-tk # for plotting; or via pip

単一プロセスの場合は次のようになります ( によって停止されますCtrl+C):

psrecord $(pgrep proc-name1) --interval 1 --plot plot1.png

いくつかのプロセスでは、次のスクリプトがチャートを同期するのに役立ちます。

#!/bin/bash    
psrecord $(pgrep proc-name1) --interval 1 --duration 60 --plot plot1.png &
P1=$!
psrecord $(pgrep proc-name2) --interval 1 --duration 60 --plot plot2.png &
P2=$!
wait $P1 $P2
echo 'Done'

チャートは次のようになります: psrecordの例

メモリプロファイラ

パッケージRSS のみのサンプリング (および Python 固有のオプション) を提供します。また、子プロセスとともにプロセスを記録することもできます (を参照mprof --help)。

pip install memory_profiler
mprof run /path/to/executable
mprof plot

python-tkデフォルトでは、エクスポート可能なTkinter ベース (必要な場合があります) のチャート エクスプローラーがポップアップ表示されます。

mprof

グラファイトスタックと統計

単純な一回限りのテストにはやりすぎのように思えるかもしれませんが、数日間のデバッグには確かに妥当です。便利なオールインワンraintank/graphite-stack(Grafanaの著者より)画像とpsutilそしてstatsdクライアント。procmon.py実装を提供します。

$ docker run --rm -p 8080:3000 -p 8125:8125/udp raintank/graphite-stack

次に、別のターミナルで、ターゲット プロセスを開始した後、次の操作を実行します。

$ sudo apt-get install python-statsd python-psutil # or via pip
$ python procmon.py -s localhost -f chromium -r 'chromium.*'

次に、http://localhost:8080 で Grafana を開き、認証としてadmin:admin、データソース https://localhost を設定すると、次のようなチャートをプロットできます。

グラファナチャート

グラファイトスタックとテレグラフ

PythonスクリプトがStatsdにメトリクスを送信する代わりに、telegraf(およびprocstat入力プラグイン) を使用して、メトリックを Graphite に直接送信できます。

最小限のtelegraf構成は次のようになります。

[agent]
  interval = "1s"

[[outputs.graphite]]
  servers = ["localhost:2003"]
  prefix = "testprfx"

[[inputs.procstat]]
  pid_file = "/path/to/file/with.pid"

次に、行を実行しますtelegraf --config minconf.conf。メトリック名を除いて、Grafana 部分は同じです。

ピッドスタット

pidstat(パッケージの一部)は簡単に解析できる出力を生成できます。プロセスから追加のメトリックがsysstat必要な場合に便利です。たとえば、最も役立つ3つのグループ(CPU、メモリ、ディスク)には、、、、、、、、、、、、、、が含まれます。これについては%usr、で説明%systemしました%guest%CPUminflt/smajflt/sVSZRSS%MEMkB_rd/skB_wr/skB_ccwr/s関連する回答

答え3

htopは の優れた代替品ですtop。次のような機能があります... カラー! シンプルなキーボード ショートカット! 矢印キーを使用してリストをスクロール! 終了せずに、また PID をメモせずにプロセスを強制終了! 複数のプロセスをマークして、すべてを強制終了!

すべての機能の中で、マニュアルページFには、フォローするプロセス。

本当に、 を試してみるべきですhtoptopを初めて使用した後、私は二度と使い始めませんでしたhtop

単一のプロセスを表示します。

htop -p PID

答え4

少し遅くなりましたが、デフォルトだけを使ったコマンドライントリックを紹介します。ps

WATCHED_PID=$({ command_to_profile >log.stdout 2>log.stderr & } && echo $!);
while ps -p $WATCHED_PID --no-headers --format "etime pid %cpu %mem rss"; do 
   sleep 1 
done

私はこれをワンライナーとして使用します。ここで、最初の行はコマンドを実行し、変数に PID を保存します。次に、ps は経過時間、PID、CPU 使用率、メモリ率、および RSS メモリを出力します。他のフィールドを追加することもできます。

プロセスが終了するとすぐに、psコマンドは「成功」を返さず、whileループは終了します。

プロファイルする PID がすでに実行されている場合は、最初の行を無視できます。変数に必要な ID を配置するだけです。

次のような出力が得られます。

  00:00  7805  0.0  0.0  2784
  00:01  7805 99.0  0.8 63876
  00:02  7805 99.5  1.3 104532
  00:03  7805  100  1.6 129876
  00:04  7805  100  2.1 170796
  00:05  7805  100  2.9 234984
  00:06  7805  100  3.7 297552
  00:07  7805  100  4.0 319464
  00:08  7805  100  4.2 337680
  00:09  7805  100  4.5 358800
  00:10  7805  100  4.7 371736
  ....

関連情報