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


170

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


どのメモリ統計が必要ですか?たくさんあります。
vwduder

特定の時間枠でのメモリ使用量、現在の使用量、最大使用量、平均。
ジョシュK

回答:


139

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

top -p PID

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

top -pid PID

9
また、毎回PIDを検索したくない場合があるため、次のようなものを試してくださいtop -p `pgrep -f /usr/bin/kvm`
ステファンLasiewski

私はCactiを使用して個々のプロセスを監視していますが、本格的なCactiのインストールは、ここでの単純な状況には複雑すぎるように聞こえます。
ステファンLasiewski

@ステファン:私はそれをリモートで実行する必要があると仮定していますか?
ジョシュK

@Josh:はい、別のサーバーでCactiを実行する必要があります(MySQL、Apache、および他のいくつかのパッケージが必要です)。ほとんどのディストリビューションでは、Yumまたはapt-getを使用してインストールするのは非常に簡単です。
ステファンLasiewski

@Stefanをリモートでチェックする場合は、ssh @ remotehost 'top -p PID>〜_pid.txtを実行できますhostname。exit 'および
klerk

61

htopはの優れた代替品topです。それは...色です!シンプルなキーボードショートカット!矢印キーを使用してリストをスクロールします!PIDを記録せずに、離れることなくプロセスを強制終了します!複数のプロセスをマークして、それらをすべて強制終了します!

すべての機能の中で、マンページには、プロセスF従うために押すことができると書かれています。

本当に試してみてくださいhtoptop初めて使用した後、私は二度と始めませんでしたhtop

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

htop -p PID


7
htopの場合は+1。これは、新しいシステムにインストールする最初のプログラムの1つです。それは私の人生をずっと楽にします。ツリービューも非常に便利です。
バーセレミー

9
top色もあります。を押しzます。
シェパン

2
あなたが正しい!top色があります!あまりにも悪いことに、その色は非常に役に立たない、特に比較するとhtop(他のユーザーのプロセスをフェードし、プログラムのベース名を強調する)。
デニルソンサマイア

1
またhtop -p PID、@ Michael Mrozekの例と同じように機能します。
ノイズブリード14年

1
次に、topを使用する唯一の理由は、htopが使用できないか、インストールできないためです。それが、はるかに多くの機能を提供するためにhtopが作成された理由です。
lepe

59

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の例

memory_profiler

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

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

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

mprof

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

単純な1回限りのテストでは過剰に思えるかもしれませんが、数日間のデバッグのようなものでは、確かに合理的です。便利なオールインワンraintank/graphite-stack(Grafanaの著者による)画像psutilstatsdクライアント。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

sysdig(DebianおよびUbuntuのリポジトリで利用可能)sysdig-inspect UIは非常に有望に見え、CPU使用率とRSSとともに非常にきめの細かい詳細を提供しますが、残念ながらUIはそれらをレンダリングsysdig できず procinfo、プロセスごとにイベントをフィルタリングできません執筆の時間。ただし、これはカスタムチゼルsysdigLuaで記述された拡張機能)で可能になります。


pgrep systemdは複数行の出力を提供しているため、psrecordにバグがあります。どうすればよいですか?任意のプロセスでテストしたいだけです。
EralpB

1
pgrep --help救助に@EralpB 。少なくとも--newestとがあり--oldestます。
-saaj

2
これは実際にメモリ使用履歴プロットを提供するので、受け入れられた答えでなければなりません。psrecordメソッドについてCtrl+Cは、psrecordプロセスがプロットを保存せずに終了するだけなので、テスト中のプロセスを終了する必要があります。
user2561747

8

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

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 12341234はpidです

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

変数をニーズに合わせて微調整します。


オーム、1のCPU使用量を監視するための10のプロセス?
xebeche

@xebeche「10個のスナップショットの平均を測定します」「nTimes = 10;#カスタマイズ」:)
Aquarius Power

私は、1つの番号($nPercCpu)を取得するために10個のプロセスを呼び出すという事実が気に入らないことを意味しました:shell、top、grep、sed、cut ... bc。これらのすべてではないにしても、多くは、たとえば1つのSedまたはAwkスクリプトにマージできます。
xebeche

@xebecheかっこいいです。既存のコマンドにもっと良いコマンドを追加して(代わりに)自由に編集してください。あなたは私の好奇心を感じました:)
Aquarius Power

1
私は自分の答えを追加しました。ところで、topの出力平均以上なので平均を計算しても意味がないことに注意してください$delay。Cf. CPUの使用率を計算する方法
xebeche

5

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

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

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


6
何年もdaemontoolsを使用しました。他のプロセスのスーパーバイザー/ウォッチドッグとして最適です。1つのプロセスのCPU /メモリ使用量を監視するのにどのように役立ちますか?
ステファンLasiewski

3

を使用する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ます。


2

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

top -p $(pidof <process_name>)

8
それは、何年も前から受け入れられている答えであり、その最初のコメントは言っています。
dhag

1

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

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

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


1

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

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

0

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

top -c a -pid PID

Mac 10.8.5の上部にある「-c a」。

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


topこの機能を実際に提供するバージョンの詳細をさらに追加することをお勧めします。Fedora 19の私のバージョンはそうではありません。Ubuntu 13.04でも同じです。
slm

あなたが正しい!、私は何か便利なものを見つけてとてもうれしかったです、私は自宅で私のMacにいたことを忘れました。
キーレス

0

私はここで少し遅れていますが、デフォルトだけを使用してコマンドラインのトリックを共有します 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
  ....
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.