このワンライナーは、ディストリビューションとバージョンが異なる少なくとも 4 つの異なる Linux システムで機能しました。 FreeBSD 10 でも動作しました。
ps hax -o rss,user | awk '{a[$2]+=$1;}END{for(i in a)print i" "int(a[i]/1024+0.5);}' | sort -rnk2
実装については、ここにはシェル ループ構造はありません。これは awk
で連想配列を使用します グループ化と集計を行います。
これは、適切なサイズの MySQL、Tomcat、および Apache を実行しているサーバーの 1 つからのサンプル出力です。数値は MB 単位です。
mysql 1566
joshua 1186
tomcat 353
root 28
wwwrun 12
vbox 1
messagebus 1
avahi 1
statd 0
nagios 0
警告:ほとんどの同様のソリューションと同様に、これは常駐セット (RSS) のみを考慮しているため、共有メモリ セグメントはカウントされません。
編集 :より読みやすいバージョン。
echo "USER RSS PROCS" ; echo "-------------------- -------- -----" ; ps hax -o rss,user | awk '{rss[$2]+=$1;procs[$2]+=1;}END{for(user in rss) printf "%-20s %8.0f %5.0f\n", user, rss[user]/1024, procs[user];}' | sort -rnk2
そして出力:
USER RSS PROCS
-------------------- -------- -----
mysql 1521 1
joshua 1120 28
tomcat 379 1
root 19 107
wwwrun 10 10
vbox 1 3
statd 1 1
nagios 1 1
messagebus 1 1
avahi 1 1
標準ツールを使用したユーザーごとのメモリ使用率 (%):
for _user in $(ps haux | awk '{print $1}' | sort -u)
do
ps haux | awk -v user=${_user} '$1 ~ user { sum += $4} END { print user, sum; }'
done
またはより正確に:
TOTAL=$(free | awk '/Mem:/ { print $2 }')
for _user in $(ps haux | awk '{print $1}' | sort -u)
do
ps hux -U ${_user} | awk -v user=${_user} -v total=$TOTAL '{ sum += $6 } END { printf "%s %.2f\n", user, sum / total * 100; }'
done
最初のバージョンは、ps
によって報告された各プロセスのメモリ パーセンテージを合計するだけです。 . 2 番目のバージョンでは、代わりにメモリをバイト単位で合計し、後で合計パーセンテージを計算するため、精度が高くなります。
お使いのシステムがサポートしている場合は、smem をインストールして使用してみてください:
smem -u
User Count Swap USS PSS RSS
gdm 1 0 308 323 820
nobody 1 0 912 932 2240
root 76 0 969016 1010829 1347768
または
smem -u -t -k
User Count Swap USS PSS RSS
gdm 1 0 308.0K 323.0K 820.0K
nobody 1 0 892.0K 912.0K 2.2M
root 76 0 937.6M 978.5M 1.3G
ameskaas 46 0 1.2G 1.2G 1.5G
124 0 2.1G 2.2G 2.8G
Ubuntu では、次のように入力して smem をインストールできます
sudo apt install smem