Ce one-liner a fonctionné pour moi sur au moins quatre systèmes Linux différents avec différentes distributions et versions. Cela a également fonctionné sur 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
À propos de l'implémentation, il n'y a pas de construction de boucle shell ici ; ceci utilise un tableau associatif dans awk
pour faire le regroupement et la sommation.
Voici un exemple de sortie d'un de mes serveurs qui exécute MySQL, Tomcat et Apache de taille décente. Les chiffres sont en Mo.
mysql 1566
joshua 1186
tomcat 353
root 28
wwwrun 12
vbox 1
messagebus 1
avahi 1
statd 0
nagios 0
Mise en garde :comme la plupart des solutions similaires, cela ne prend en compte que l'ensemble résident (RSS), de sorte qu'il ne compte aucun segment de mémoire partagée.
MODIFIER :Une version plus lisible par l'homme.
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
Et le résultat :
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
Utilisation de la mémoire par utilisateur en pourcentage à l'aide d'outils standard :
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
ou pour plus de précision :
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
La première version résume simplement le pourcentage de mémoire pour chaque processus tel que rapporté par ps
. La deuxième version résume la mémoire en octets à la place et calcule ensuite le pourcentage total, ce qui conduit à une plus grande précision.
Si votre système le prend en charge, essayez d'installer et d'utiliser 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
ou
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
Dans Ubuntu, smem peut être installé en tapant
sudo apt install smem