回答:
Linuxでは、top
実際には単一のプロセスに焦点を合わせることをサポートしていますが、当然ながら履歴グラフはありません。
top -p PID
これは、異なる構文のMac OS Xでも使用できます。
top -pid PID
top -p `pgrep -f /usr/bin/kvm`
。
hostname
。exit 'および
htop
はの優れた代替品top
です。それは...色です!シンプルなキーボードショートカット!矢印キーを使用してリストをスクロールします!PIDを記録せずに、離れることなくプロセスを強制終了します!複数のプロセスをマークして、それらをすべて強制終了します!
すべての機能の中で、マンページには、プロセスFに従うために押すことができると書かれています。
本当に試してみてくださいhtop
。top
初めて使用した後、私は二度と始めませんでしたhtop
。
単一のプロセスを表示します。
htop -p PID
top
色もあります。を押しz
ます。
top
色があります!あまりにも悪いことに、その色は非常に役に立たない、特に比較するとhtop
(他のユーザーのプロセスをフェードし、プログラムのベース名を強調する)。
htop -p PID
、@ Michael Mrozekの例と同じように機能します。
以下はある種の履歴グラフを扱います。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'
このパッケージは、RSSのみのサンプリング(およびいくつかのPython固有のオプション)を提供します。また、子プロセスでプロセスを記録することもできます(を参照mprof --help
)。
pip install memory_profiler
mprof run /path/to/executable
mprof plot
デフォルトpython-tk
では、エクスポート可能なTkinterベースの(必要な場合がある)チャートエクスプローラーがポップアップ表示されます。
単純な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: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"
次に、lineを実行しますtelegraf --config minconf.conf
。Grafanaパーツは、メトリック名を除いて同じです。
sysdig
(DebianおよびUbuntuのリポジトリで利用可能)sysdig-inspect UIは非常に有望に見え、CPU使用率とRSSとともに非常にきめの細かい詳細を提供しますが、残念ながらUIはそれらをレンダリングsysdig
できず procinfo
、プロセスごとにイベントをフィルタリングできません執筆の時間。ただし、これはカスタムチゼル(sysdig
Luaで記述された拡張機能)で可能になります。
pgrep --help
救助に@EralpB 。少なくとも--newest
とがあり--oldest
ます。
Ctrl+C
は、psrecordプロセスがプロットを保存せずに終了するだけなので、テスト中のプロセスを終了する必要があります。
スクリプトでその情報を使用するには、次のようにします。
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について、1秒全体でCPU使用率の10個のスナップショットの平均を測定します(各0.1秒の遅延* nTimes = 10)。それはまさにその瞬間に起こっていることの良い、高速で正確な結果を提供します。
変数をニーズに合わせて微調整します。
$nPercCpu
)を取得するために10個のプロセスを呼び出すという事実が気に入らないことを意味しました:shell、top、grep、sed、cut ... bc。これらのすべてではないにしても、多くは、たとえば1つのSedまたはAwkスクリプトにマージできます。
私は通常、次の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
$delay
ただし、これは、の出力$delay
がどのように機能するかによって実際には印刷されたタイムスタンプが遅れるため、largeに対しては良い結果を与えませんtop
。詳細を説明しすぎることなく、これを回避する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
....