web-dev-qa-db-ja.com

単一プロセスのCPU /メモリ使用量を監視する方法は?

1つのプロセスのメモリ/ CPU使用率をリアルタイムで監視したいと思います。 topに似ていますが、1つのプロセスのみを対象とし、ある種の履歴グラフが望ましいです。

194
Josh K

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

top -p PID

これは、Mac OS Xでも別の構文で利用できます。

top -pid PID
157
Michael Mrozek

psrecord

次のアドレスある種の履歴グラフ。 Python 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 example

memory_profiler

package は、RSSのみのサンプリング(およびいくつかのPython固有のオプション)を提供します。また、子プロセスを含むプロセスを記録することもできます(mprof --helpを参照)。

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

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

mprof

グラファイトスタックとstatsd

単純な1回限りのテストではやり過ぎに見えるかもしれませんが、数日のデバッグのようなものでは、確かに妥当です。便利なオールインワン 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:808 でGrafanaを開き、admin:adminとして認証し、データソースを設定します https:// localhost 、次のようなグラフをプロットできます。

grafana chart

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

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

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

87
saaj

htoptopの優れた代替品です。それは…色!シンプルなキーボードショートカット!矢印キーを使用してリストをスクロールしてください! PIDをメモせずにプロセスを終了します!複数のプロセスにマークを付けて、それらをすべて強制終了します!

すべての機能の中で、マンページは押すことができると言います F tofollowプロセス。

本当に、htopを試してみてください。 topを初めて使用した後は、htopを再び使用することはありませんでした。

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

htop -p PID

67

スクリプトでその情報を使用するには、次のようにします。

calcPercCpu.sh

#!/bin/bash
nPid=$1;
nTimes=10; # customize it
delay=0.1; # customize it
strCalc=`top -d $delay -b -n $nTimes -p $nPid \
  |grep $nPid \
  |sed -r -e "s;\s\s*; ;g" -e "s;^ *;;" \
  |cut -d' ' -f9 \
  |tr '\n' '+' \
  |sed -r -e "s;(.*)[+]$;\1;" -e "s/.*/scale=2;(&)\/$nTimes/"`;
nPercCpu=`echo "$strCalc" |bc -l`
echo $nPercCpu

次のように使用します:calcPercCpu.sh 1234ここで、1234はpidです

指定された$ nPidの場合、CPU使用率のスナップショット平均を1秒全体で測定します(各0.1sの遅延* nTimes = 10)。これは、その瞬間に起こっていることについて、適切で高速で正確な結果を提供します。

必要に応じて変数を調整します。

8
Aquarius Power

私は通常、次の2つを使用します。

  1. HPキャリパー :プロセスを監視するための非常に優れたツールです。コールグラフやその他の低レベルの情報も確認できます。ただし、個人使用の場合のみ無料でご利用ください。

  2. daemontools :UNIXサービスを管理するためのツールのコレクション

5
Hemant

topawkを使用すると、簡単に作成できます。 %CPU($9)+%MEM($10)の使用状況のコンマ区切りのログで、後で統計およびグラフ作成ツールに入力できます。

top -b -d $delay -p $pid | awk -v OFS="," '$1+0>0 {
print strftime("%Y-%m-%d %H:%M:%S"),$1,$NF,$9,$10; fflush() }'

出力は次のようになります

2019-03-26 17:43:47,2991,firefox,13.0,5.2
2019-03-26 17:43:48,2991,firefox,4.0,5.2
2019-03-26 17:43:49,2991,firefox,64.0,5.3
2019-03-26 17:43:50,2991,firefox,71.3,5.4
2019-03-26 17:43:51,2991,firefox,67.0,5.4

ただし、出力されるタイムスタンプがtopのしくみに起因して実際に$delay遅れているため、大きな$delayの場合は良い結果が得られません。詳細に触れずに、これを回避する1つの簡単な方法は、topによって提供された時間をログに記録することです。

top -b -d $delay -p $pid | awk -v OFS="," '$1=="top"{ time=$3 }
$1+0>0 { print time,$1,$NF,$9,$10; fflush() }'

その場合、タイムスタンプは正確ですが、出力は$delayだけ遅れます。

5
xebeche

使用できるプロセス名がわかっている場合

top -p $(pidof <process_name>)
2
user4757345

ここでは少し遅れますが、デフォルトの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
  ....
2
theist

コメントするには評判が足りませんが、psrecordの場合は、プログラムで直接Pythonで呼び出すこともできます。

from psrecord.main import monitor
monitor(<pid number>, logfile = "./test.log", plot="./fig.png", include_children=True)
2
ZettaCircl

Topにプロセスごとの(-p)オプションまたは関連オプションがないカットダウンLinuxディストリビューションがある場合、プロセス名のtopコマンドの出力を解析して、プロセスごとのCPU使用率情報を取得できます。

while true;  do top -bn1 | awk '/your_process_name/ {print  $8}' ; sleep 1; done

8は、組み込みLinuxディストリビューションのtopコマンドの出力で、プロセスごとのCPU使用率を表します

1
Razan Paul
pidstat -p 7994 2 

03:54:43 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
03:54:45 PM     0      7994    1.50    1.50    0.00    3.00     1  AliYunDun
03:54:47 PM     0      7994    1.00    1.00    0.00    2.00     0  AliYunDun

2秒ごとの印刷プロセス7994 cpu使用

0
赵宝磊

特定のプロセスの一定期間の平均が必要な場合は、topの累積-cオプションを試してください。

top -c a -pid PID

「-c a」はMac 10.8.5のトップにあります。

Scientific Linuxの場合、オプションは-Sで、インタラクティブに設定できます。

0
Kieleth