Uso de memória por usuário no Linux?

19

Digamos que eu tenha 20 usuários logados na minha caixa linux. Como posso saber quanta memória cada um deles está usando?

    
por Jakub Troszok 24.06.2009 / 16:07

12 respostas

19

Você poderia tentar usar smem (veja ELC2009: Visualizando o uso da memória com o smem para mais informações). Em particular, sudo smem -u deve fornecer as informações desejadas.

    
por 24.06.2009 / 16:55
8

Ignorando problemas de memória compartilhada, aqui está um script rápido que fornece RSS e VMEM para todos os usuários conectados, classificados por vmem e organizados em colunas atraentes:

(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
    
por 28.06.2012 / 15:34
5

Para obter a soma do RSS, acho que os seguintes trabalhos. Isso seria para obter a soma do RSS para os usuários kbrandt e root.

ps -U kbrandt,root --no-headers  -o rss | (tr '\n' +; echo 0) | bc
    
por 24.06.2009 / 16:25
3

Essa é uma pergunta complicada. Você pode facilmente resumir os valores totais de RSS + swap na saída "ps", mas e a memória compartilhada? Usuários diferentes poderiam facilmente compartilhar a mesma página de código se estivessem executando o mesmo processo. Quem você conta isso para? E quanto a buffers e cache? Isso realmente depende de quão preciso você quer que seus resultados sejam. Quanto mais preciso você quiser, mais difícil será.

    
por 24.06.2009 / 16:13
2

Não sei como relatar o uso da memória pelo usuário, mas se você estiver preocupado em controlar o uso deles, procure ulimit. Ele permitirá que você defina limites rígidos e flexíveis por usuário / grupo para memória e outros recursos em seu sistema.

    
por 24.06.2009 / 16:11
2

Você pode tentar algo como:

ps auxU maxwell | awk '{memory +=$4}; END {print memory }'
    
por 24.06.2009 / 16:55
2

Olhando para o mesmo, eu descobri isso

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

para imprimir processos ordenados por mem, agrupados por usuário (column1, the $ 1), você pode agrupar por outras coisas e somar outras coisas, alterando $ 1 e $ 4

  • $ 1 é a primeira coluna: nome de usuário (grupos por isso)
  • $ 4 é a quarta coluna:% mem (soma isso)

Fiquei feliz em encontrar a solução, só queria compartilhar.

    
por 05.06.2012 / 00:17
2

Esse script bash provavelmente é feio pra caramba, mas obrigada pelo exercício, minha festa estava ficando enferrujada!

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

Resultado:

[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

Por favor, comente / corrija e atualizarei a resposta. Também uso a saída de memória rss do PS, como outros já discutiram, há vantagens / desvantagens em usar este valor.

    
por 24.06.2009 / 17:40
1

O smem não estava disponível no meu sistema, e o script do Dave não funcionou por algum motivo, então eu escrevi este oniiner Perl feio para processar a saída do 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

Observe que alguns usuários foram identificados usando seu UID, em vez de seu nome de usuário. Você poderia lidar com isso analisando nomes de usuários do / etc / passwd, usando o mais feio:

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
    
por 29.11.2010 / 16:31
0

Usando o 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

OUTPUT

User      MemUsage(%)
apache    4.8
dbus      0.0
mysql     3.8
nagios    3.1
    
por 29.04.2013 / 13:59
0
pmap 'pgrep -u 503' | grep total | awk '{print $2}' | awk '{s+=$1}END{print s}'

503 - UID

Você pode obter os UIDs de /etc/passwd para fazer isso para todos os usuários

    
por 15.07.2015 / 04:29
0

Bem, neste estado do kernel Linux eu posso pensar em apenas um modo apropriado para realizar esta tarefa - usando cgroups de memória. Você precisaria colocar um usuário no login no próprio cgroup, e isso pode exigir o desenvolvimento do próprio módulo pam ou (em vez disso) modificar o módulo existente para isso.

Um documento útil para ler sobre isso é: Guia de gerenciamento de recursos por RedHat®.

    
por 15.07.2015 / 08:03