ps -ef'を実行した場合、各プロセスのメモリ使用量を表示するにはどうすればいいですか?
Linuxでps -ef
をした場合、各プロセスのメモリ使用量を表示するにはどうすればいいのでしょうか?各プログレスの「仮想メモリ」「resメモリ」「共有メモリ」を見たいのですが、top
で取得できますが、同じ情報がps -ef
で欲しいのです。grep
で取得できますが、同じ情報を0x6&で取得して、自分のプロセス名で0x6&に出力できるようにしたいです。
Linuxでps -ef
をした場合、各プロセスのメモリ使用量を表示するにはどうすればいいのでしょうか?各プログレスの「仮想メモリ」「resメモリ」「共有メモリ」を見たいのですが、top
で取得できますが、同じ情報がps -ef
で欲しいのです。grep
で取得できますが、同じ情報を0x6&で取得して、自分のプロセス名で0x6&に出力できるようにしたいです。
user26528さんの回答では、メモリを正しく計算していません - トップのものだけでなく、smaps内のマッピングの合計が必要です。このスクリプトで計算してみましょう。
#!/bin/bash
for pid in $(ps -ef | awk '{print $2}'); do
if [-f /proc/$pid/smaps]; then
echo "* Mem usage for PID $pid"
rss=$(awk 'BEGIN {i=0} /^Rss/ {i = i + $2} END {print i}' /proc/$pid/smaps)
pss=$(awk 'BEGIN {i=0} /^Pss/ {i = i + $2 + 0.5} END {print i}' /proc/$pid/smaps)
sc=$(awk 'BEGIN {i=0} /^Shared_Clean/ {i = i + $2} END {print i}' /proc/$pid/smaps)
sd=$(awk 'BEGIN {i=0} /^Shared_Dirty/ {i = i + $2} END {print i}' /proc/$pid/smaps)
pc=$(awk 'BEGIN {i=0} /^Private_Clean/ {i = i + $2} END {print i}' /proc/$pid/smaps)
pd=$(awk 'BEGIN {i=0} /^Private_Dirty/ {i = i + $2} END {print i}' /proc/$pid/smaps)
echo "-- Rss: $rss kB"
echo "-- Pss: $pss kB"
echo "Shared Clean $sc kB"
echo "Shared Dirty $sd kB"
echo "Private $(($pd + $pc)) kB"
fi
done
ps ef -o command,vsize,rss,%mem,size
共有メモリのオプションは見つかりませんでしたが、総物理メモリの%とプロセスをスワップアウトするのに必要なスワップスペースの量のオプションは見つかりました。この他にも多くのことが ps の man ページに記載されています。
ps を使ってメモリ使用量を取得するのはかなり信頼性が低いです。新しいカーネルを使用している場合は、/proc/pid#/smaps をサポートしている必要があり、各プロセスのメモリ使用量に関する詳細な情報を得ることができます。以下は、開いている各プロセスをループして、サイズ、Rss、Pss、共有クリーン/サーティの使用量を取得するための、かなり汚くて素早いスクリプトです。何らかの形で役に立つことを願っています。
#!/bin/bash
for pid in $(ps -ef | awk '{print $2}'); do
if [-f /proc/$pid/smaps]; then
echo "* Mem usage for PID $pid"
echo "-- Size:"
cat /proc/$pid/smaps | grep -m 1 -e ^Size: | awk '{print $2}'
echo "-- Rss:"
cat /proc/$pid/smaps | grep -m 1 -e ^Rss: | awk '{print $2}'
echo "-- Pss:"
cat /proc/$pid/smaps | grep -m 1 -e ^Pss: | awk '{print $2}'
echo "Shared Clean"
cat /proc/$pid/smaps | grep -m 1 -e '^Shared_Clean:' | awk '{print $2}'
echo "Shared Dirty"
cat /proc/$pid/smaps | grep -m 1 -e '^Shared Dirty:' | awk '{print $2}'
fi
done
更新:
以下のワンライナーでも、現在のユーザーの総メモリ消費量の情報が表示されます。
echo "------------------------------------" && mem=0 && while read -r rss comm ; do mbs=$((rss/1024)); mem=$((mbs + mem)); echo $mbs"MB - $comm"; done <<< "$(ps -u $USER -wo rss=,comm= --sort -rss)" && echo "------------------------------------" && echo $mem"MB: Memory used by user '$USER'"
こんな感じで、メモリ使用量の多いMB順に並べた全ユーザープロセスを一覧にしてみました。
ps -u $USER -wo rss=,comm= --sort -rss | while read -r rss comm ; do echo $((rss/1024))"MB -" $comm; done
フルパスプロセスを表示するには、command=
の代わりに comm=
を使用することができます。
=
はカラムのタイトルを削除するだけです。
例えば、google chromeが複数のプロセスを起動していて、そのプロセスが使用しているメモリの総量を知りたいとします。以下の一行コマンドがとても便利です。
echo "%CPU %MEM MEM PROCESS"
ps aux | awk '{mem[$11]+=int($6/1024)}; {cpuper[$11]+=$3};{memper[$11]+=$4}; END {for (i in mem) {print cpuper[i]"% ",memper[i]"% ",mem[i]" MB ",i}}' | sort -k3nr | head -n 5
これはメモリをMB単位で表示したり、メモリをソートしたり、主にコマンドでグループ化したりと色々なことをしてくれます。また、%CPUと%memoryをグループ化しています。これは、ユーザ・フレンドリーな形式でデータを表示しています。
このコマンドは この の回答からヒントを得たもので、どのプロセスがリソースを消費しているかを知るのに非常に役立ちました。