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.
Digamos que eu tenha 20 usuários logados na minha caixa linux. Como posso saber quanta memória cada um deles está usando?
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.
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
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
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á.
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.
Você pode tentar algo como:
ps auxU maxwell | awk '{memory +=$4}; END {print memory }'
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
Fiquei feliz em encontrar a solução, só queria compartilhar.
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.
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
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
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
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®.