1つのプロセスのメモリ/ CPU使用率をリアルタイムで監視したいと思います。 top
に似ていますが、1つのプロセスのみを対象とし、ある種の履歴グラフが望ましいです。
Linuxでは、top
は実際には単一のプロセスへのフォーカスをサポートしますが、当然ながら履歴グラフはありません。
top -p PID
これは、Mac OS Xでも別の構文で利用できます。
top -pid PID
次のアドレスある種の履歴グラフ。 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'
package は、RSSのみのサンプリング(およびいくつかのPython固有のオプション)を提供します。また、子プロセスを含むプロセスを記録することもできます(mprof --help
を参照)。
pip install memory_profiler
mprof run /path/to/executable
mprof plot
デフォルトで、これはエクスポート可能なTkinterベースの(python-tk
が必要になる場合があります)チャートエクスプローラーをポップアップ表示します。
単純な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 、次のようなグラフをプロットできます。
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
、%CPU
、minflt/s
、majflt/s
、VSZ
が含まれます、RSS
、%MEM
、kB_rd/s
、kB_wr/s
、kB_ccwr/s
。 関連回答 で説明しました。
htop
はtop
の優れた代替品です。それは…色!シンプルなキーボードショートカット!矢印キーを使用してリストをスクロールしてください! PIDをメモせずにプロセスを終了します!複数のプロセスにマークを付けて、それらをすべて強制終了します!
すべての機能の中で、マンページは押すことができると言います F tofollowプロセス。
本当に、htop
を試してみてください。 top
を初めて使用した後は、htop
を再び使用することはありませんでした。
単一のプロセスを表示します。
htop -p PID
スクリプトでその情報を使用するには、次のようにします。
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)。これは、その瞬間に起こっていることについて、適切で高速で正確な結果を提供します。
必要に応じて変数を調整します。
私は通常、次の2つを使用します。
HPキャリパー :プロセスを監視するための非常に優れたツールです。コールグラフやその他の低レベルの情報も確認できます。ただし、個人使用の場合のみ無料でご利用ください。
daemontools :UNIXサービスを管理するためのツールのコレクション
top
とawk
を使用すると、簡単に作成できます。 %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
だけ遅れます。
使用できるプロセス名がわかっている場合
top -p $(pidof <process_name>)
ここでは少し遅れますが、デフォルトの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
....
コメントするには評判が足りませんが、psrecordの場合は、プログラムで直接Pythonで呼び出すこともできます。
from psrecord.main import monitor
monitor(<pid number>, logfile = "./test.log", plot="./fig.png", include_children=True)
Topにプロセスごとの(-p)オプションまたは関連オプションがないカットダウンLinuxディストリビューションがある場合、プロセス名のtopコマンドの出力を解析して、プロセスごとのCPU使用率情報を取得できます。
while true; do top -bn1 | awk '/your_process_name/ {print $8}' ; sleep 1; done
8は、組み込みLinuxディストリビューションのtopコマンドの出力で、プロセスごとのCPU使用率を表します
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使用
特定のプロセスの一定期間の平均が必要な場合は、topの累積-cオプションを試してください。
top -c a -pid PID
「-c a」はMac 10.8.5のトップにあります。
Scientific Linuxの場合、オプションは-Sで、インタラクティブに設定できます。