Como posso representar graficamente o uso de memória por usuário?

3

Basicamente, quero representar graficamente o uso de memória com cada nome de usuário como título, à medida que o tempo passa. Eu definiria esse script como um cron job, para criar um gráfico que mostre o uso de memória de certos nomes de usuários.

Como posso representar graficamente o consumo de memória com base no usuário?

O eixo Y deve ser% MEM, o eixo X deve ser hora / data

Eu tentei fazer isso com o gnuplot, mas falhei.

Os dados que quero representar são:

for USER in $(ps haux | awk '{print $1}' | sort -u); do ps haux | awk -v user=$USER '$1 ~ user { sum += $4} END { print user, sum; }'; done

Exemplo de saída:

102 0
avahi 0
colord 0
daemon 0
savvas 16.6
miredo 0
nobody 0
postfix 0
root 1.3
rtkit 0
syslog 0
whoopsie 0

O último script do gnuplot que usei:

set term png small size 800,600
set output "mem-graph.png"

set ylabel "%MEM"
set xlabel "Time"

set xtics nomirror
set ytics nomirror

set xrange [0:*]

set key autotitle columnheader

plot "mem.log" using 2 title columnhead(1) with lines

O script que uso para representar graficamente:

#!/bin/bash
rm mem.log
while true
do
    for USER in $(ps haux | awk '{print $1}' | sort -u); do ps haux | awk -v user=$USER '$1 ~ user { sum += $4} END { print user, sum; }'; done >> mem.log
    gnuplot gnuplot.script
    sleep 10
done
    
por Savvas Radevic 29.09.2013 / 14:50

1 resposta

2

Eu experimentei um pouco mais e finalmente criei algo que mais ou menos se ajusta às minhas necessidades!

graphmem.sh

#!/bin/bash
cwd="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd "$cwd"
for iuser in $(ps haxo user | sort -u); do
    [[ $iuser == "root" ]] && continue
    ps haxo user:64,pmem | awk -v tnow="'date -u +'%H:%M:%S''" -v user="$iuser" -v uid="$((id -u $iuser || echo $iuser) 2>/dev/null)" '$1 ~ user { sum += $2} END { if (sum) print tnow,sum,user,uid; else print tnow,0,user,uid; }'
done | sort -nk +2 >> mem.log
gnuplot "gnuplot.script"
cp mem-graph.png /path/to/www-destination/
echo "Done"

Observação: [[ $iuser == "root" ]] && continue remove as informações do usuário "raiz".

gnuplot.script

reset
set key left top
set xtics nomirror
set ytics nomirror

set term png size 5000,1000

set output "mem-graph.png"

set ylabel "% Memory usage"
set xlabel " "
set auto xy
set xtics out offset 1,0 scale 25,0 rotate by 90
set yrange [0:100]
set xrange [0:*]
set style fill solid 1.0 border -1
set boxwidth 1
set multiplot
set title "Memory usage per user"

plot 'mem.log' using ($0):(($2 > 0.5) ? $2 : 1/0):4:xticlabels(stringcolumn(1)." ".stringcolumn(3)." ".stringcolumn(2)."%") with boxes lc variable notitle, \
    '' using ($0):(($2 > 0.5) ? $2 : 1/0):(sprintf("%.1f%%",$2)) with labels offset 0,1 notitle
unset border
unset multiplot

Adicionar em / etc / crontab

@hourly root /path/to/graphmem.sh

Nota: Você precisa remover o mem.log manualmente todos os dias, mas pelo menos ele fornece um bom gráfico por 24 horas.

    
por 30.09.2013 / 19:52