prozessor auslastung DRINGEND hilfe !

foexle

foexle

Kaiser
ich mal wieder -.-
mir raucht der kopf ich bekomms einfach nicht hin und ich muss das heute noch fertig machen bevor ich feierabend habe :(

kurz ich will ein paar daten vom server dokumentieren ... das klappt auch alles soweit, bis auf die CPU auslastung !!!!

der code:
Code:
#!/bin/sh
secounds="$1"
secounds=`expr $secounds \* 60`
zaehler=1


while [ $zaehler -le $secounds ]
do
        if [ `cat test.csv | wc -l` == 0 ]
        then
                echo "date;mem;cpu;user;">>test.csv
        fi

        date="`date +%H:%M:%S`"
        mem="`top -n 1 |head -n 5 | grep Mem|awk {'print $5'}|awk -Fk '{print $1}'`"


        cpu_il="`top -n 1 |head -n 5 | grep Cpu|awk {'print $5'}| awk -F% '{print $1}'`"
        cpu_us1="`cat /proc/stat | head -n 1 | awk {'print $2'}`"
        cpu_ni1="`cat /proc/stat | head -n 1 | awk {'print $3'}`"
        cpu_sys1="`cat /proc/stat | head -n 1 | awk {'print $4'}`"
        cpu_idle1="`cat /proc/stat | head -n 1 | awk {'print $5'}`"
        cpu_all1="`expr $cpu_us1 + $cpu_ni1 + $cpu_sys1 + $cpu_idle1`"
        sleep 2
        cpu_us2="`cat /proc/stat | head -n 1 | awk {'print $2'}`"
        cpu_ni2="`cat /proc/stat | head -n 1 | awk {'print $3'}`"
        cpu_sys2="`cat /proc/stat | head -n 1 | awk {'print $4'}`"
        cpu_idle2="`cat /proc/stat | head -n 1 | awk {'print $5'}`"
        cpu_all2="`expr $cpu_us2 + $cpu_ni2 + $cpu_sys2 + $cpu_idle2`"

        cpu_all="`expr $cpu_all2 - $cpu_all1`"
        cpu_us="`expr $cpu_us2 - $cpu_us1`"
        cpu_us="`echo $cp_us / $cpu_all \* 100.0| bc -l`"
        echo $cpu_us
        cpu="0`echo 100 - $cpu_il | bc -l `"
        user="`apache2ctl status | grep workers|awk {'print $6'}`"

        mem=`expr $mem / 1024`
        test="$date;$mem;$cpu;$user;"
        echo -e "$date\nMemory used: $mem Mb\nCpu used: $cpu\nIdle workers: $user\n---------------$
        echo $test >> test.csv
        zaehler=`expr $zaehler + 1`
        sleep 1

done

ich hoffe ihr könnt mir schnell helfen und sieht den fehler :( ich weis nimma weiter ....


mit top --> das geht nicht kommt immer 0.2% raus
dann mit /proc/stat weis ich nicht ob ich das richtig mache

hoffe auf schnelle antwort

mfg foexle
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

ok das problem habe ich gefunden ... und zwar ist der integer wert zu gross den ich bekomme von cpu_all1 und cpu_all2
da fehlt dann eine stelle in der berechnung .. aus dem grund kommt da auch nur mist raus

es fehlt genau eine stelle ... wie kann ich das prob lösen ?
 
Zuletzt bearbeitet:
hey leute :> ... also ich hab nun wenig rumprobiert und bin nun swoeit, dass das problem ein rundungsfehler war, da ich mit expr gerechnet habe. Die int-werte waren aber zu gross aus dem grund habe ich bc -l genommen .

Aber komischerweise weicht mein wert, den ich ausrechne direkt aus der Proc, wesentlich von dem `top ` wert ab. Weis einer woran das liegen kann ?

hier nun der neue code
Code:
#!/bin/sh
secounds="$1" 
secounds=`expr $secounds \* 60`
zaehler=1


while [ $zaehler -le $secounds ]
do
	if [ `cat test.csv | wc -l` == 0 ]
	then
		echo "date;mem;cpu;user;">>test.csv
	fi
	
	date="`date +%H:%M:%S`"
	mem="`top -n 1 |head -n 5 | grep Mem|awk {'print $5'}|awk -Fk '{print $1}'`"
		

	
	cpu_us1="`cat /proc/stat | head -n 1 | awk {'print $2'}`"
	cpu_ni1="`cat /proc/stat | head -n 1 | awk {'print $3'}`"
	cpu_sys1="`cat /proc/stat | head -n 1 | awk {'print $4'}`"
	cpu_idle1="`cat /proc/stat | head -n 1 | awk {'print $5'}`"
	cpu_all1="`echo "$cpu_us1 + $cpu_ni1 + $cpu_sys1 + $cpu_idle1"| bc -l`"
	sleep 2
	cpu_us2="`cat /proc/stat | head -n 1 | awk {'print $2'}`"
	cpu_ni2="`cat /proc/stat | head -n 1 | awk {'print $3'}`"
	cpu_sys2="`cat /proc/stat | head -n 1 | awk {'print $4'}`"
	cpu_idle2="`cat /proc/stat | head -n 1 | awk {'print $5'}`"
	cpu_all2="`echo "$cpu_us2 + $cpu_ni2 + $cpu_sys2 + $cpu_idle2" | bc -l`"
	
	cpu_all="`echo "$cpu_all2 - $cpu_all1" |bc -l`"
	cpu_us="`echo "$cpu_us2 - $cpu_us1"| bc -l`"
	if [ $cpu_us -ne 0 ]
	then
		cpu_us="`echo "$cpu_us / $cpu_all"| bc -l`"
		cpu_us="`echo "cpu_us * 100.0" | bc -l`"
	fi
	cpu_sys="`echo "$cpu_sys2 - $cpu_sys1"| bc -l`"
	if [ $cpu_sys -ne 0 ]
	then
		cpu_sys="`echo "$cpu_sys / $cpu_all"| bc -l`"
		cpu_sys="`echo "$cpu_sys * 100.0" | bc -l `"
	fi
        cpu_ni="`echo "$cpu_ni2 - $cpu_ni1"| bc -l`"
        if [ $cpu_ni -ne 0 ]
        then
                cpu_ni="`echo "$cpu_ni / $cpu_all"| bc -l`"
                cpu_ni="`echo "$cpu_ni * 100.0" | bc -l `"
        fi
        cpu_idle="`echo "$cpu_idle2 - $cpu_idle1"| bc -l`"
        if [ $cpu_idle -ne 0 ]
        then
                cpu_idle="`echo "$cpu_idle / $cpu_all"| bc -l`"
                cpu_idle="`echo "$cpu_idle * 100.0" | bc -l `"
        fi
	
	cpu_ges="`echo "$cpu_ni + $cpu_sys + $cpu_us  "| bc -l|awk {'substr($1,0,4)'}`"
	user="`apache2ctl status | grep workers|awk {'print $6'}`"
		
	mem=`expr $mem / 1024`
	test="$date;$mem;$cpu_ges;$user;" 
	echo -e "$date\nMemory used: $mem Mb\nCpu used: $cpu_ges %\nIdle workers: $user\n-----------------------"
	echo $test >> test.csv
	zaehler=`expr $zaehler + 1`
	

done
 
mit top | viel grep | viel awk erhaeltst du die daten, die vmstat(8) liefert, und das liefert als erstes nur "The first report produced gives averages since the last reboot.".

was mit /proc/stat ist, k.a.
 
jo habs nun ...

hab nu was zusammengebaut
zum Auslesen von

Cpu:
Mem:
Curr. Uhrezeit:
Curr: Requests Apache:

Code:
 trap 'trap 0;exit' 1
        N=`tput lines`
        EL=`tput el` ED=`tput ed` CL=`tput clear` HO=`tput home`
        CF=`tput civis` CN=`tput cnorm` F="%12.2f%3d$ED$HO"
        
        HDR="`ps -p1 -opid -opcpu -oc -oargs | head -1`"
        echo "Zeit;Mem;Cpu;User " >> serverStat.csv
	while :
        do
          date=`date +%H:%M`
	  mem="`top -n 1|head -n 5 |grep Mem |awk {'print $5'}|awk -Fk '{print $1}'`"
	  cpu=`ps -e -opid= -opcpu= -oc= -oargs= |
          sort -rnk +1 |
          mawk -v H="$HDR" -v N="$N" -v E="$EL" -v F="$F" '
            BEGIN{N-=2}
            $2>0||$3{P+=$2;C+=$3}
            NR>=N{exit}
            END{print P}'`
	  user=`apache2ctl status|grep workers|awk {'print $1'}`
	  echo "$date;$mem;$cpu;$user" >> serverStat.csv
          echo -e "Zeit: $date\nMem: $mem\nCpu: $cpu\nUser: $user\n========================="
	  sleep ${1-1}  # sleep time on script's command line (default 1 sec.)
        done
 

Ähnliche Themen

Queue für copy Script

Escaping-Problem

Shellskript - Fehler in Cron

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Sehr große Datei in Teilschritten auslesen.

Zurück
Oben