Frage Speicherverbrauch pro Benutzer in Linux?


Nehmen wir an, ich habe 20 Benutzer auf meiner Linux-Box angemeldet. Wie kann ich wissen, wie viel Speicher jeder von ihnen verwendet?


19
2018-06-24 14:07


Ursprung




Antworten:


Du könntest es versuchen schmelzen (sehen ELC2009: Visualisierung der Speichernutzung mit smem für mehr Informationen). Im Speziellen, sudo smem -u sollte Ihnen die Informationen geben, die Sie wollen.


19
2018-06-24 14:55



Ich stimme zu, dass dies wahrscheinlich der beste Weg ist. Allerdings benötigt Sme m Ja wirklich moderner Kernel, den keiner der etablierten Unternehmensdistros liefert. Wenn Sie also keine Community-Distribution wie Fedora, OpenSUSE oder ein Nicht-LTS-Ubuntu betreiben, haben Sie kein Glück. - wzzrd
Das ist toll. Danke vielmals. Ich wusste nichts von dem Smeam. Es sieht so aus, als würde es den Job machen. - Jakub Troszok
FYI, smem benötigt einen Kernel> = 2.6.27 - xebeche
Smem benötigt auch eine Menge Zeug wie gtk hier, keine Option. - anarcat
@anarcat: Nicht wahr (zumindest für Debian Jessie). Die einzige Abhängigkeit ist Python, Python-Matplotlib ist nur ein empfohlenes Paket, mit dem Sie überspringen können --no-install-recommends. - Léo Lam


Ignorieren Shared Memory-Probleme, hier ist ein schnelles Skript, RSS-und VMEM für alle angemeldeten Benutzer, nach Vmem sortiert und in niedlichen Spalten organisiert:

(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

8
2018-06-28 13:34



Nun, leider "ignoriert Shared Memory-Probleme" dieses Skript auch komplett gefälscht. - fgysin
falsch? gefälscht was? Wie ist die Ausgabe genau falsch? - anarcat
o / p ist in rss und vmem, was ist rss & vmem? - vidur punj


Um die Summe von RSS zu erhalten, denke ich, dass das folgende funktioniert. Dies wäre, um die Summe von RSS für die Benutzer kbrandt und root zu erhalten.

ps -U kbrandt,root --no-headers  -o rss | (tr '\n' +; echo 0) | bc

5
2018-06-24 14:25



Ich sollte hinzufügen, dass ich die Add Spalte von Zahlen aus gestohlen habe: pixelbeat.org/cmdline.html - Kyle Brandt♦


Das ist eine knifflige Frage. Sie könnten einfach die gesamten RSS + Swap-Beträge in der "ps" -Ausgabe zusammenfassen, aber was ist mit Shared Memory? Unterschiedliche Benutzer können problemlos die gleiche Codepage verwenden, wenn sie denselben Prozess ausführen. Wem verdanken Sie das? Was ist mit Puffern und Cache? Es hängt wirklich davon ab, wie genau Ihre Ergebnisse aussehen sollen. Je genauer du willst, desto schwieriger wird es.


3
2018-06-24 14:13



Ich denke, deine richtige PS ist die Antwort, aber du musst wahrscheinlich Shared Memory ignorieren. - Jason Tan
smem (in meiner Antwort erwähnt) löst das Shared-Memory-Problem mit seinen PSS- und USS-Messungen (PSS verteilt proportional den gemeinsamen Speicher zwischen den Prozessen, die es teilen). - CesarB


Ich bin mir nicht sicher, wie die Speichernutzung von Benutzern gemeldet werden soll. Wenn Sie jedoch Bedenken haben, deren Verwendung zu kontrollieren, sollten Sie ulimit nachschlagen. Es ermöglicht Ihnen, feste und weiche Grenzen für Speicher und andere Ressourcen auf Ihrem System pro Benutzer / Gruppe festzulegen.


2
2018-06-24 14:11





Sie können versuchen, etwas wie:

ps auxU maxwell | awk '{Speicher + = $ 4}; END {Druckspeicher} '


2
2018-06-24 14:55



Vielen Dank! Für den gegenwärtigen Benutzer könnte dies auch z.B. mit ps -o Benutzer, rss --no-Header | awk '{mem + = $ 2}; ENDE {print mem} ' - xebeche
Ich habe das leicht bearbeitet als ps aux | grep mysql | awk '{memory +=$4}; END {print memory }', wobei mysql durch den Namen eines Benutzers oder Prozesses ersetzt werden könnte. - jeshurun


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 gruppierte Prozesse zu drucken, gruppiert nach Benutzer (Spalte1, die $ 1), können Sie nach anderen Dingen gruppieren und andere Dinge summieren, indem Sie $ 1 und $ 4 ändern

  • $ 1 ist die erste Spalte: Benutzername (Gruppen davon)
  • $ 4 ist die vierte Spalte:% mem (summiert dies)

Ich war glücklich, die Lösung zu finden, wollte nur teilen.


2
2018-06-04 22:17



Vielen Dank! Ich habe ein paar Änderungen vorgenommen und benutze dies: ps --no-headers -eo user,rss | awk '{arr[$1]+=$2}; END {for (i in arr) {print i,arr[i]}}' | sort -nk2. Der Befehl sort benötigt die -n Flag, um den Speicher als Zahl zu analysieren. Auf diese Weise können Sie das Wort "Benutzer" durch "Befehl" ersetzen, um stattdessen nach Anwendungsname zu gruppieren. - Tim
Eigentlich sollte das $ NF anstatt $ 2 in meinem obigen Kommentar sein, um die letzte Spalte von awk zu bekommen (da $ 2 nicht mit Befehlen funktioniert, die Leerzeichen in ihnen haben). Scheint, ich kann den Kommentar nicht mehr bearbeiten. - Tim


Dieses Bash-Skript ist wahrscheinlich hässlich, aber danke für die Übung, mein 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. Ich benutze auch die rss-Speicherausgabe von PS, wie andere besprochen haben, gibt es Vorteile / Nachteile, diesen Wert zu verwenden.


2
2018-06-24 15:40



Es hat ein kleines Problem - es druckt nicht den "Gesamtspeicher für $ ou drucken: $ Bimsstein" für den letzten Benutzer in der PS-Ausgabe. Die Schleife fügt nur das letzte Programm zu der Menge hinzu, die von einem Benutzer verwendet wird, und dann wird es beendet. - Jakub Troszok
Beeindruckend. Dein Skript war mehr als hilfreich !!!! Das kannst du dir nicht vorstellen! Kann ich etwas fragen, wenn es nicht zu viel ist? Kannst du es auch zeigen, dass die CPU insgesamt genutzt wird? Und vielleicht kann es vielleicht gemacht werden, Speicherverbrauch zu zeigen, wenn es mehr als 100mb ist?