Zużycie pamięci na użytkownika w systemie Linux?

20

Powiedzmy, że mam 20 użytkowników zalogowanych na moim Linux-ie. Skąd mam wiedzieć, ile pamięci zużywa każde z nich?

Jakub Troszok
źródło

Odpowiedzi:

19

Możesz spróbować użyć smem ( więcej informacji znajdziesz w ELC2009: Wizualizacja użycia pamięci za pomocą smem ). W szczególności sudo smem -upowinien dać ci potrzebne informacje.

CesarB
źródło
1
Zgadzam się, że to prawdopodobnie najlepszy sposób na to. Jednak smem potrzebuje naprawdę nowoczesnego jądra, którego nie zapewnia żadna z uznanych dystrybucji dla przedsiębiorstw. Więc jeśli nie prowadzisz dystrybucji dla społeczności, takiej jak Fedora, OpenSUSE lub Ubuntu inny niż LTS, nie masz szczęścia.
wzzrd
To jest świetne. Wielkie dzięki. Nie wiedziałem o smemie. Wygląda na to, że wykona zadanie.
Jakub Troszok
4
Do Twojej wiadomości, smem wymaga jądra> = 2.6.27
xebeche 10.09.10
smem wymaga tutaj również wielu rzeczy takich jak gtk, a nie opcji.
anarcat
@anarcat: Nieprawda (przynajmniej dla Debiana jessie). Jedyną zależnością jest python, python-matplotlib to tylko zalecany pakiet, z którym można pominąć --no-install-recommends.
Léo Lam
9

Ignorując problemy z pamięcią współużytkowaną, oto krótki skrypt, który udostępnia RSS i VMEM wszystkim zalogowanym użytkownikom, posortowane według vmem i uporządkowane w urocze kolumny:

(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
jhclark
źródło
Cóż, niestety „ignorowanie problemów z pamięcią współużytkowaną” ten skrypt również generuje fałszywe fałszywe informacje.
fgysin przywraca Monikę
podrobiony? nieprawdziwe co? jak dokładnie jest fałszywy wynik?
anarcat
o / p jest w rss i vmem, co to jest rss & vmem?
vidur punj
5

Aby uzyskać sumę RSS, myślę, że następujące prace. Byłoby to uzyskać sumę RSS dla użytkowników kbrandt i root.

ps -U kbrandt,root --no-headers  -o rss | (tr '\n' +; echo 0) | bc
Kyle Brandt
źródło
Powinienem dodać, że ukradłem kolumnę dodawania części liczb z: pixelbeat.org/cmdline.html
Kyle Brandt
3

To trudne pytanie. Możesz z łatwością zsumować całkowite kwoty wymiany + swap na wyjściu „ps”, ale co z pamięcią współdzieloną? Różni użytkownicy mogą łatwo udostępniać tę samą stronę kodową, jeśli uruchamiają ten sam proces. Komu to rozliczasz? Co z buforami i pamięcią podręczną? To zależy od dokładności wyników. Im dokładniej chcesz, tym trudniej będzie.

David Pashley
źródło
Myślę, że twoje właściwe PS jest odpowiedzią, ale prawdopodobnie musisz zignorować pamięć współdzieloną.
Jason Tan
smem (wspomniany w mojej odpowiedzi) rozwiązuje problem pamięci współdzielonej dzięki pomiarom PSS i USS (PSS proporcjonalnie dzieli pamięć współdzieloną między procesy, które ją współużytkują).
CesarB
2

Nie jestem pewien, jak zgłosić zużycie pamięci przez użytkownika, ale jeśli martwisz się kontrolowaniem ich wykorzystania, powinieneś poszukać ulimit. Umożliwi to ustawienie twardych i miękkich limitów dla pamięci użytkownika i grupy w systemie.

3dinfluence
źródło
2

Możesz spróbować czegoś takiego:

ps auxU maxwell | awk '{memory + = 4 $}; END {pamięć drukowania} ”

Maxwell
źródło
Dzięki! Dla bieżącego użytkownika można to również zrobić np. Za pomocą ps -o user, rss --no-headers | awk '{mem + = 2 $}; END {print mem} '
xebeche
Zredagowałem to nieco jako ps aux | grep mysql | awk '{memory +=$4}; END {print memory }', gdzie mysql można zastąpić nazwą użytkownika lub procesu.
jeshurun
2

Szukając tego samego, doszedłem do tego

ps aux | awk '{arr[$1]+=$4}; END {for (i in arr) {print i,arr[i]}}' | sort -k2

aby wydrukować procesy uporządkowane według mem, pogrupowane według użytkownika (kolumna 1, 1 $), możesz grupować według innych rzeczy i sumować inne rzeczy, zmieniając 1 i 4 $

  • 1 USD to pierwsza kolumna: nazwa użytkownika (grupowane według tego)
  • 4 USD to czwarta kolumna:% mem (sumuje to)

Z przyjemnością znalazłem rozwiązanie, chciałem się tylko podzielić.

jperelli
źródło
1
Dzięki! Zrobiłem kilka modyfikacji i używam to: ps --no-headers -eo user,rss | awk '{arr[$1]+=$2}; END {for (i in arr) {print i,arr[i]}}' | sort -nk2. Polecenie sortowania wymaga -nflagi, aby parsować pamięć jako liczbę. Również w ten sposób możesz zastąpić słowo „użytkownik” słowem „polecenie”, aby zamiast tego pogrupować według nazwy aplikacji.
Tim
Właściwie powinno to być $ NF zamiast 2 $ w moim komentarzu powyżej, aby uzyskać ostatnią kolumnę z awk (ponieważ 2 $ nie działa z poleceniami, które zawierają spacje). Wygląda na to, że nie mogę już edytować komentarza.
Tim
2

Ten skrypt bashowy jest prawdopodobnie brzydki jak diabli, ale dziękuję za ćwiczenie, mój bash był zardzewiały!

#!/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

Wynik:

[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

Proszę skomentować / poprawić, a ja zaktualizuję odpowiedź. Używam również wyjścia pamięci rss z PS, ponieważ inni mówili, że używanie tej wartości ma zalety / wady.

Dave Drager
źródło
Ma mały problem - nie wydrukuje „Drukowanie całkowitej pamięci dla $ ou: $ tempsum” dla ostatniego użytkownika na wyjściu ps. Pętla po prostu doda ostatni program do kwoty używanej przez użytkownika, a następnie zakończy działanie.
Jakub Troszok
Łał. Twój skrypt był więcej niż pomocny !!!! Nie możesz sobie wyobrazić! Czy mogę prosić o coś, jeśli nie jest to zbyt wiele? Czy możesz sprawić, by pokazywał także całkowite użycie procesora? A być może może być w stanie pokazać wykorzystanie pamięci, jeśli jest większe niż 100 MB?
1

smem nie był dostępny w moim systemie, a skrypt Dave'a z jakiegoś powodu nie działał, więc napisałem ten brzydki oneliner Perla do przetwarzania danych wyjściowych ps:

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

Pamiętaj, że niektórzy użytkownicy zostali zidentyfikowani przy użyciu swojego identyfikatora UID zamiast nazwy użytkownika. Można sobie z tym poradzić, analizując nazwy użytkowników z / etc / passwd, używając narzędzia brzydszego:

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
Jeff
źródło
0

Korzystanie ze skryptu Bash

#!/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

WYNIK

User      MemUsage(%)
apache    4.8
dbus      0.0
mysql     3.8
nagios    3.1
Rahul Patil
źródło
0
pmap `pgrep -u 503` | grep total | awk '{print $2}' | awk '{s+=$1}END{print s}'

503 - UID

Możesz uzyskać identyfikatory UID, /etc/passwdaby zrobić to dla wszystkich użytkowników

Juri
źródło
0

Cóż, w tym stanie jądra Linuksa mogę wymyślić tylko jeden właściwy sposób na wykonanie tego zadania - użycie grup pamięci. Będziesz musiał umieścić użytkownika podczas logowania we własnej grupie, a to może wymagać opracowania własnego modułu pam lub (raczej) modyfikacji do tego celu istniejącego modułu.

Przydatnym dokumentem do przeczytania na ten temat jest: Przewodnik zarządzania zasobami firmy RedHat®.

poige
źródło