Linuxの単一プロセスのCPU使用量とメモリ使用量を取得しますか?


165

Linuxで単一プロセスのCPUとメモリの使用量を取得したいのですが、PIDはわかっています。うまくいけば、毎秒それを取得し、「watch」コマンドを使用してCSVに書き込むことができます。Linuxコマンドラインからこの情報を取得するには、どのコマンドを使用できますか?


11
SuperUserに属します。
リチャード

gdbを使用してgetpidおよびtop -p <that pid>を呼び出すことはできますか?
mja

回答:


226
ps -p <pid> -o %cpu,%mem,cmd

(「cmd」は省略できますが、デバッグに役立つ場合があります)。

これにより、プロセスが実行されている時間の平均CPU使用率が得られることに注意してください。


6
このように監視するのに十分な単一のプロセスのメモリ使用量を気にする場合は、大量のメモリを使用しているため、共有マッピングによる余分な数メガバイトは問題にならないと想定されます。
カフェ

5
@Chaitanya:経由のパイプを| tail -n +2
カフェ

11
それとも、--noheader使用することができます
ヘキサシアニド

45
%cpuは、「使用されたCPU時間をプロセスが実行されている時間で割った値(cputime / realtime比)であり、パーセンテージで表される」(のマンページを参照)であることに注意してくださいps。これは実際のCPU使用量ではありませんtopたとえば、表示されているものとは大きく異なる場合もあります。
xebeche 2013年

12
上記のXebecheから述べたようps -e -o pcpu,argsに、プロセスの存続期間中のCPU平均を表示します。これは、長時間実行プロセスの場合は明らかに望ましいものではありません
Alex F


37

あなたは使用してプロセスの名前で結果を得ることができます

ps -C chrome -o %cpu,%mem,cmd

この-Cオプションを使用すると、pidを知らなくてもプロセス名を使用できます。


de pidも含める方法は?ihaveは%pid $ PID pid、PIDを運なしで試しました
Arnold Roa

@ArnoldRoa pidのみが機能します。ps -C chrome -o pid,%cpu,%mem,cmd
ムハンマドタハ

28

pidstatを使用します(sysstatから- リンクを参照)。

たとえば、これら2つのプロセスID(12345および11223)を5秒ごとに監視するには

$ pidstat -h -r -u -v -p 12345,11223 5

2
これpidstatはすばらしいコマンドだと指摘してくれてありがとう、スクリプト作成にも便利です。
fduff

pidstatまた、良い平均を与えます。ただ残念なことですが、よりエレガントな方法を見つけられませんでしたpidstat -u 1 10 | grep ^Average | sort -r -n -b -k 8,8
残念なことにノーザンブラッドリー

24

ps コマンド(使用しないでください):

top コマンド(使用する必要があります):

topCPU使用率をリアルタイムで取得するために使用します(現在の短い間隔):

top -b -n 2 -d 0.2 -p 6962 | tail -1 | awk '{print $9}'

次のようにエコーされます: 78.6


これは、現在のCPU使用率を取得するための最も正確な回答であり、プロセスの存続期間全体の平均ではありません。
Ted Feng、

15

プログラムを起動して監視する

このフォームは、実行可能ファイルを簡単にベンチマークする場合に便利です。

topp() (
  $* &>/dev/null &
  pid="$!"
  trap ':' INT
  echo 'CPU  MEM'
  while sleep 1; do ps --no-headers -o '%cpu,%mem' -p "$pid"; done
  kill "$pid"
)
topp ./myprog arg1 arg2

Ctrl + Cを押すと、プログラムが終了し、監視が停止します。出力例:

CPU  MEM
20.0  1.3
35.0  1.3
40.0  1.3

関連: https //unix.stackexchange.com/questions/554/how-to-monitor-cpu-memory-usage-of-a-single-process

Ubuntu 16.04でテスト済み。


5

使用top -bするpidを使用してgrepで出力するか(-bフラグtop runをバッチモードで実行)、または-pフラグを使用してgrepを使用せずにpidを指定することもできます。


5

上記のcaf の回答でコメントしたように、psと場合によってはpidstatは、pCPUのライフタイム平均を提供します。より正確な結果を得るには、topを使用します。実行できたらtopを実行する必要がある場合:

top -b -n 1 -p <PID>

または、データとヘッダーのみを処理する場合:

top -b -n 1 -p <PID> | tail -3 | head -2

ヘッダーなし:

top -b -n 1 -p <PID> | tail -2 | head -1

3
ps aux | awk '{print $4"\t"$11}' | sort | uniq -c | awk '{print $2" "$1" "$3}' | sort -nr

またはプロセスごと

ps aux | awk '{print $4"\t"$11}' | sort | uniq -c | awk '{print $2" "$1" "$3}' | sort -nr |grep mysql


1
ps aux|awk  '{print $2,$3,$4}'|grep PID

ここで、最初の列はPID、2番目の列はCPU使用率、3番目の列はメモリ使用率です。


1
ps axo pid,etime,%cpu,%mem,cmd | grep 'processname' | grep -v grep

PID-プロセスID

etime-プロセスの実行/ライブ期間

%cpu-CPU使用率

%mem-メモリ使用量

cmd-コマンド

プロセス名を追跡したいプロセス、mysql nginx php-fpmなどに置き換えます...


1

ここでのすべての回答は、PIDのメモリの割合のみを示しています。

すべてのapacheプロセスのrssメモリ使用量をKB単位で取得する方法の例を以下に示します。特定のPIDだけを見たい場合は、「grep apache」を「grep PID」に置き換えます。

watch -n5 "ps aux -y | grep apache | awk '{print \$2,\$6}'"

これは印刷します:

Every 5.0s: ps aux -y | grep apache | awk '{print $2,$6}'                                                                                                                                                                                                          
Thu Jan 25 15:44:13 2018

12588 9328
12589 8700
12590 9392
12591 9340
12592 8700
12811 15200
15453 9340
15693 3800
15694 2352
15695 1352
15697 948
22896 9360

CPU%の場合:

watch -n5 "ps aux -y | grep apache | awk '{print \$2,\$3,\$6}'"

出力:

Every 5.0s: ps aux -y | grep apache | awk '{print $2,$3,$6}'                                                                                                                                                                                                       
Thu Jan 25 15:46:00 2018

12588 0.0 9328
12589 0.0 8700
12590 0.0 9392
12591 0.0 9340
12592 0.0 8700
12811 0.0 15200
15453 0.0 9340
15778 0.0 3800
15779 0.0 2352
15780 0.0 1348
15782 0.0 948
22896 0.0 9360

1

なぜ選択した答えがうまくいかないのかと思ってしばらく苦労した人のために:

ps -p <pid> -o %cpu,%mem

スペースなしのibetweenない%cpu,%mem


1

これは、1つ以上のプログラムをリアルタイムでフォローしながら、他のツールの出力を監視するのに便利な方法です。 watch "top -bn1 -p$(pidof foo),$(pidof bar); tool"


1

次のコマンドは、特定のプロセス(pid)の40秒ごとのCPUおよびメモリ使用量の平均を取得します

pidstat 40 -ru -p <pid>

私のケースの出力(CPU使用率の最初の2行、メモリの2行目):

02:15:07 PM       PID    %usr %system  %guest    %CPU   CPU  Command
02:15:47 PM     24563    0.65    0.07    0.00    0.73     3  java

02:15:07 PM       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
02:15:47 PM     24563      6.95      0.00 13047972 2123268   6.52  java

0

(MacOS 10.10を使用している場合は、topの累積-cオプションを試してください:

top -c a -pid PID

(このオプションは、Scientific Linux el6およびRHEL6で試した他のLinuxでは使用できません)


0

上記のCPUとメモリを消費するプロセスのリスト

        ps axo %cpu,%mem,command | sort -nr | head

0

@cafの答えに基づいて、これは私にとってうまくいきます。

指定されたPIDの平均を計算します。

measure.sh

times=100
total=0
for i in $(seq 1 $times)
do
   OUTPUT=$(top -b -n 1 -d 0.1 -p $1 | tail -1 | awk '{print $9}')
   echo -n "$i time: ${OUTPUT}"\\r
   total=`echo "$total + $OUTPUT" | bc -l`
done
#echo "Average: $total / $times" | bc

average=`echo "scale=2; $total / $times" | bc`
echo "Average: $average"

使用法:

# send PID as argument
sh measure.sh 3282

-2

Linuxでの単一プロセスのCPUとメモリの使用、または以下のコマンドを使用してCPU使用率上位10プロセスを取得できます。

ps -aux --sort -pcpu | 頭-n 11

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.