Resourcenauslastung lesen

Hi,

ich versuche mir ein Script zu basteln, das mit System Resourcen ausließt und abspeichert. Für die RAM Auslastung hab ich schon Lösungen gefunden:

Code:
used_ram=$(free -mto | grep Mem: | awk '{ print $3 }')
free_ram=$(free -mto | grep Mem: | awk '{ print $4 }')
total_ram=$(free -mto | grep Mem: | awk '{ print $2 }')

Mir fehlt jetzt eigentlich nur noch CPU Auslastung und Traffic. CPU kann ich mir ja prinzipiell aus top holen, allerdings hätte ich gerne für jeden Kern Werte. Und wo bekomm ich Infos über den Traffic her??

cu
serow
 
Infos für den Traffic bekommst du aus /proc/net/dev. Die Auslastung der CPU müsstest du theoretisch aus den CPU-Lasten der einzelnen Prozesse berechnen. Einfacher dürfte es sein atop zu verwenden.
 
Danke .

Dieser Doppelpunkt nach dem eth0 macht mir grad zu schaffen :D

Code:
cat /proc/net/dev | grep eth0 | awk '{ print $1 }'

Krieg ich das "eth0:" da noch irgendwie weg?


ciao
serow
 
Ah danke das hat geklappt.

Nun zur Prozessorlast. Ich versuche das momentan aus top -b -n 1 aufzuaddieren. An die einzelnen Werte komm ich ran nur mit dem addieren tu ich mir schwer:

Code:
CPU_LOAD=0.0
$(ps -eo pcpu,pid -o comm= | tail -n +2 | awk '{ print $1 }'

Ich dachte ich könnte das awk irgendwie dazu bringen den aktuellen Wert von CPU_LOAD und den geparsten Wert mit einem "+" verbunden auszugeben um das ganze anschließend durch bs zu schicken. Aber das käuft sie irgendwie nicht - jedenfalls schaff ichs nicht.


ciao
serow
 
Auf diese Weise würde es zumindest so funktionieren:
Code:
#!/bin/bash
sum=0
for n in $(ps -eo pcpu,pid -o comm= | tail -n +2 | awk '{print $1}')
do
    sum=$(echo $sum + $n | bc)
done
echo $sum
Eleganter wäre natürlich:
Code:
ps -eao pcpu | tail -n +2 | awk '{a+=$1} END {print a}'
Ansonsten könntest du auch noch Werte aus der /proc/loadavg lesen...

Mfg, Eydeet
 
Danke - klappt.

Aus /proc/loadavg kann ich nicht lesen, denn so wie ich das sehe sind das Werte, die sich über die gesamte Uptime erstrecken richtig?


Dennoch will ich Durchschnittswerte berechnen und zwar jeweils über die letzten 30min:

Code:
used_ram_values=""
cpu_load_values=""
rx_values=""
tx_values=""


rx_old=$(cat /proc/net/dev | grep eth0 | awk '{ print $1 }' | sed 's/eth0://g')
tx_old=$(cat /proc/net/dev | grep eth0 | awk '{ print $9 }')

while [ 1 ]
do
        sleep 1

        rx=$(cat /proc/net/dev | grep eth0 | awk '{ print $1 }' | sed 's/eth0://g')
        tx=$(cat /proc/net/dev | grep eth0 | awk '{ print $9 }')
        rx_traffic=$[ rx - rx_old ]
        tx_traffic=$[ tx - tx_old ]
        rx_old=$rx;
        tx_old=$tx;

        rx_values="$rx_values $rx_traffic"
        tx_values="$tx_values $tx_traffic"
        used_ram_values="$used_ram_values $(free -mto | grep Mem: | awk '{ print $3 }')"
        cpu_load_values="$cpu_load_values $(ps -eao pcpu | tail -n +2 | awk '{a+=$1} END {print a}')"

        rx_avrg=$(calculate_average $rx_values)
        tx_avrg=$(calculate_average $tx_values)
        ram_avrg=$(calculate_average $used_ram_values)
        cpu_avrg=$(calculate_average $cpu_load_values)

        echo "RX Average:  $rx_avrg"
        echo "TX Average:  $tx_avrg"
        echo "RAM Average: $ram_avrg"
        echo "CPU Average: $cpu_avrg"

done;

Meine Funktion calculate_average hab ich noch nicht :D Hab schon etwas rumprobiert aber bash ist mir irgendwie noch nicht so richtig im Blut :S Die Serie an Werten, die z.B. in "rx_values" ist sieht z.B so aus:

2 3 1 5 3 4 2 3 4 5 6

Daraus müsste ich jetzt den Durchschnitt berechnen. Aber wie? Mit
Code:
function calculate_average {
        sum=0
        count=0
        for n in $1
        do
                sum=$( echo "$sum + $n" | bc )
                count=$[ count + 1 ]
        done;
        echo $[ sum / count ]
}
jedenfalls nicht :S

cu
serow
 
/proc/loadavg gibt dir die Durchschnittsauslastung über 1, 5, und 15 Minuten (in dieser Reihenfolge).
 
Zurück
Oben