Angenommen, ich habe 20 Benutzer auf meiner Linux-Box angemeldet. Woher weiß ich, wie viel Speicher jeder von ihnen verwendet?
Angenommen, ich habe 20 Benutzer auf meiner Linux-Box angemeldet. Woher weiß ich, wie viel Speicher jeder von ihnen verwendet?
Antworten:
Sie können versuchen, smem zu verwenden ( weitere Informationen finden Sie in ELC2009: Visualisieren der Speichernutzung mit smem ). Insbesondere sudo smem -u
sollten Sie die gewünschten Informationen geben.
--no-install-recommends
.
Wenn Sie Probleme mit dem gemeinsamen Speicher ignorieren, finden Sie hier ein schnelles Skript, mit dem Sie RSS und VMEM für alle angemeldeten Benutzer anzeigen können, die nach VMEM sortiert und in hübsche Spalten unterteilt sind:
(echo "user rss(KiB) vmem(KiB)";
for user in $(users | tr ' ' '\n' | sort -u); do
echo $user $(ps -U $user --no-headers -o rss,vsz \
| awk '{rss+=$1; vmem+=$2} END{print rss" "vmem}')
done | sort -k3
) | column -t
Um die Summe der RSS zu bekommen, denke ich, dass die folgenden Arbeiten. Dies wäre, um die Summe der RSS für die Benutzer kbrandt und root zu erhalten.
ps -U kbrandt,root --no-headers -o rss | (tr '\n' +; echo 0) | bc
Das ist eine knifflige Frage. Sie könnten leicht die gesamten RSS + Swap-Beträge in der "ps" -Ausgabe zusammenfassen, aber was ist mit Shared Memory? Verschiedene Benutzer können problemlos dieselbe Codepage verwenden, wenn sie denselben Prozess ausführen. Wem erklären Sie das? Was ist mit Puffern und Cache? Es hängt wirklich davon ab, wie genau Ihre Ergebnisse sein sollen. Je genauer Sie wollen, desto schwieriger wird es.
Ich bin mir nicht sicher, wie ich die Speichernutzung durch Benutzer melden soll. Wenn Sie jedoch Bedenken haben, die Speichernutzung zu kontrollieren, sollten Sie ulimit nachschlagen. Hiermit können Sie pro Benutzer / Gruppe Hard- und Soft-Limits für den Arbeitsspeicher und andere Ressourcen auf Ihrem System festlegen.
Sie können versuchen, etwas wie:
ps auxU maxwell | awk '{memory + = $ 4}; ENDE {Druckspeicher} '
ps aux | grep mysql | awk '{memory +=$4}; END {print memory }'
, wobei mysql durch den Namen eines Benutzers oder Prozesses ersetzt werden könnte.
Auf der Suche nach dem Gleichen habe ich das herausgefunden
ps aux | awk '{arr[$1]+=$4}; END {for (i in arr) {print i,arr[i]}}' | sort -k2
Um nach mem geordnete Prozesse zu drucken, die nach Benutzer gruppiert sind (Spalte 1, $ 1), können Sie nach anderen Dingen gruppieren und andere Dinge summieren, indem Sie $ 1 und $ 4 ändern
Ich war froh, die Lösung zu finden, wollte nur teilen.
ps --no-headers -eo user,rss | awk '{arr[$1]+=$2}; END {for (i in arr) {print i,arr[i]}}' | sort -nk2
. Der Sortierbefehl benötigt das -n
Flag, damit der Speicher als Zahl analysiert wird. Auch auf diese Weise können Sie das Wort "Benutzer" durch "Befehl" ersetzen, um stattdessen nach Anwendungsnamen zu gruppieren.
Dieses Bash-Skript ist wahrscheinlich höllisch hässlich, aber danke für die Übung, meine Bash wurde (wird) rostig!
#!/bin/sh
OLDIFS=$IFS
IFS=$'\n'
tempsum=0
totalmem=0
for m in `ps -eo user,rss --sort user | sed -e 's/ */ /g' | awk -F'[ ]' {'print $0'}`; do
nu=`echo $m|cut -d" " -f1`
nm=`echo $m|cut -d" " -f2`
# echo "$nu $nm $nu"
if [ "$nu" != "$ou" ] && [ $(echo "$nm"|grep -E "^[0-9]+$") ]
then
if [ "$tempsum" -ne 0 ]; then echo "Printing total mem for $ou: $tempsum"; fi
ou=$nu
tempsum=$nm
let "totalmem += $nm"
else
let "tempsum += $nm"
let "totalmem += $nm"
fi
done
echo "Total Memory in Use: $totalmem/$(free | grep Mem: | awk '{print $2}')"
IFS=$OLDIFS
Ergebnis:
[20:34][root@server2:~]$ ./memorybyuser.sh
Printing total mem for admin: 1387288
Printing total mem for apache: 227792
Printing total mem for avahi: 1788
Printing total mem for dbus: 980
Printing total mem for 68: 3892
Printing total mem for root: 55880
Printing total mem for rpc: 292
Printing total mem for rpcuser: 740
Printing total mem for smmsp: 720
Printing total mem for xfs: 680
Total Memory in Use: 1682360/4152144
Bitte kommentieren / korrigieren und ich werde die Antwort aktualisieren. Außerdem verwende ich die RSS-Speicherausgabe von PS, da andere diskutiert haben, dass es Vor- / Nachteile gibt, diesen Wert zu verwenden.
smem war auf meinem System nicht verfügbar und Daves Skript funktionierte aus irgendeinem Grund nicht. Deshalb habe ich diesen hässlichen Perl-Oneliner geschrieben, um die ps-Ausgabe zu verarbeiten:
ps -eo user,rss | perl -e 'foreach (<>) { m/(\w+)\s+(\d+)/; $mem{$1} += $2; }; foreach $u (keys %mem) { if ($mem{$u}) { print "$u - $mem{$u}\n" }}' | sort
Beachten Sie, dass einige Benutzer anhand ihrer UID und nicht anhand ihres Benutzernamens identifiziert wurden. Sie könnten damit umgehen, indem Sie Benutzernamen aus / etc / passwd mit dem folgenden Befehl analysieren:
ps -eo user,rss | perl -e 'open(F, "/etc/passwd"); foreach $l (<F>) { if ($l=~/(.*?):.*?:(\d+)/) { $users{$2}=$1; }}; foreach (<>) { m/(\w+)\s+(\d+)/; $mem{$1} += $2; }; foreach $u (keys (%mem)) { $UN = $u; if ($UN=~/^\d+$/) { $UN = $users{$UN};}; if ($mem{$u}) { print "$UN - $mem{$u}\n" }}' | sort
Verwenden von Bash Script
#!/bin/bash
total_mem=0
printf "%-10s%-10s\n" User MemUsage'(%)'
while read u m
do
[[ $old_user != $u ]] && { printf "%-10s%-0.1f\n" $old_user $total_mem;
total_mem=0; }
total_mem="$(echo $m + $total_mem | bc)"
old_user=$u
done < <(ps --no-headers -eo user,%mem| sort -k1)
#EOF
AUSGABE
User MemUsage(%)
apache 4.8
dbus 0.0
mysql 3.8
nagios 3.1
Nun, in diesem Zustand des Linux-Kernels fällt mir nur einer ein richtigen Weg vorstellen, um diese Aufgabe zu erfüllen - die Verwendung von Speicher-Cgroups. Sie müssten einen Benutzer bei der Anmeldung in eine eigene C-Gruppe einbinden, was möglicherweise die Entwicklung eines eigenen Pam-Moduls oder (eher) die Änderung eines vorhandenen Moduls erfordert.
Ein nützliches Dokument zum Lesen ist: Resource Management Guide von RedHat®.