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


20

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

Respostas:


19

Você pode tentar usar o smem (consulte ELC2009: Visualizando o Uso da Memória com o Smem para obter mais informações). Em particular, sudo smem -udeve fornecer as informações que você deseja.


1
Concordo que este é provavelmente o melhor caminho para isso. No entanto, o smem precisa de um kernel realmente moderno, que nenhuma das distribuições corporativas estabelecidas fornece. Portanto, a menos que você esteja executando uma distribuição da comunidade como o Fedora, o OpenSUSE ou um Ubuntu que não seja LTS, não terá sorte.
Wzzrd 24/06/2009

Isso é ótimo. Muito obrigado. Eu não sabia sobre o smem. Parece que fará o trabalho.
21411 Jakub Troszok

4
FYI, smem requer um kernel> = 2.6.27
Xebeche

O smem também requer um monte de coisas como o gtk aqui, não uma opção.
anarcat

@anarcat: Não é verdade (pelo menos para o Debian Jessie). A única dependência é python, python-matplotlib é apenas um pacote recomendado que você pode pular --no-install-recommends.
Léo Lam

9

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

Bem, infelizmente, 'ignorando problemas de memória compartilhada', esse script também gera falsos completos.
fgysin restabelece Monica

falso? falso o que? como é exatamente a saída falsa?
Anarcat 20/03/2015

o / p está em rss e vmem, o que é rss & vmem?
Vidur Punj

5

Para obter a soma do RSS, acho que o seguinte funciona. Seria 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

Devo acrescentar que eu roubei a coluna add de números parte de: pixelbeat.org/cmdline.html
Kyle Brandt

3

Essa é uma pergunta complicada. Você poderia facilmente resumir os valores totais de troca de RSS + na saída "ps", mas e a memória compartilhada? Usuários diferentes podem compartilhar facilmente a mesma página de código se estiverem executando o mesmo processo. Para quem você considera isso? E os buffers e cache? Realmente depende da precisão que você deseja que seus resultados sejam. Quanto mais preciso você quiser, mais difícil será.


Acho que seu PS certo é a resposta, mas você provavelmente precisará ignorar a memória compartilhada.
Jason Tan

O smem (mencionado na minha resposta) resolve o problema de memória compartilhada com suas medidas PSS e USS (o PSS distribui proporcionalmente a memória compartilhada entre os processos que a compartilham).
CesarB

2

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


2

Você pode tentar algo como:

ps auxU maxwell | awk '{memória + = $ 4}; END {print memory} '


Obrigado! Para o usuário atual, isso também pode ser feito, por exemplo, com ps -o user, rss --no-headers | awk '{mem + = $ 2}; END {print mem} '
xebeche

Eu editei isso um pouco como ps aux | grep mysql | awk '{memory +=$4}; END {print memory }', onde o mysql poderia ser substituído pelo nome de um usuário ou processo.
Jesurum

2

Procurando o mesmo, 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 (coluna1, $ 1), você pode agrupar por outras coisas e somar outras, alterando $ 1 e $ 4

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

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


1
Obrigado! Fiz algumas modificações e estou usando o seguinte: ps --no-headers -eo user,rss | awk '{arr[$1]+=$2}; END {for (i in arr) {print i,arr[i]}}' | sort -nk2. O comando de classificação precisa do -nsinalizador para analisar a memória como um número. Dessa forma, você também pode substituir a palavra "usuário" por "comando" para agrupar pelo nome do aplicativo.
Tim

Na verdade, deve ser $ NF em vez de $ 2 no meu comentário acima para obter a última coluna do awk (como $ 2 não funciona com comandos que possuem espaços). Parece que não posso mais editar o comentário.
Tim

2

Esse script do bash provavelmente é feio como o inferno, mas obrigado pelo exercício, meu bash estava (está) ficando enferrujado!

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

Comente / corrija e atualizarei a resposta. Também uso a saída de memória rss do PS, como outros discutiram, há prós / contras no uso desse valor.


Ele tem um pequeno problema - não imprimirá "Imprimindo memória total por $ ou: $ tempsum" para o último usuário na saída ps. O loop adicionará apenas o último programa à quantidade usada por um usuário e, em seguida, será encerrado.
21411 Jakub Troszok

Uau. Seu script foi mais do que útil !!!! Você não pode imaginar! Posso pedir uma coisa, se não for demais? Você pode mostrar também o uso total da CPU? E possivelmente pode ser feito para mostrar o uso de memória se for maior que 100mb?

1

O smem não estava disponível no meu sistema, e o script de Dave não funcionou por algum motivo, então escrevi este feio onliner do Perl 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 o UID em vez do nome de usuário. Você pode lidar com isso analisando nomes de usuários em / 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

0

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

SAÍDA

User      MemUsage(%)
apache    4.8
dbus      0.0
mysql     3.8
nagios    3.1

0
pmap `pgrep -u 503` | grep total | awk '{print $2}' | awk '{s+=$1}END{print s}'

503 - UID

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


0

Bem, neste estado do kernel Linux, posso pensar em apenas uma maneira adequada de realizar essa 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 (melhor) modificar o módulo existente para isso.

Um documento útil para ler sobre isso é: Guia de Gerenciamento de Recursos da RedHat®.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.