回答:
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
ps ef -o command,vsize,rss,%mem,size
共有メモリのオプションは見つかりませんでしたが、合計物理メモリの%とプロセスのスワップアウトに必要なスワップスペースの量のオプションは見つかりました。これおよびその他の詳細は、psのmanページに記載されています。
top、ps、および同様のプログラムは、すべて同じようにこの影響を受けています。
@ 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
更新:
次のワンライナーは、現在のユーザーによる総メモリ消費量に関する情報も提供します。
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=を使用して、フルパスプロセスを表示できます。
=ちょうど列のタイトルを削除します。
同じプロセスにforkサブプロセスが何度もあり、そのプロセスで使用される合計メモリに興味があることがわかりました。たとえば、google chromeは複数のプロセスを開始し、chromeが消費した合計メモリを知りたいと考えています。以下の1行のコマンドが非常に便利だとわかりました
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をグループ化しています。ユーザーフレンドリーな形式でデータを表示しています。
このコマンドはこの答えからインスピレーションを得たもので、どのプロセスがリソースを消費しているかを知るのに大いに役立ちました。