Re: Lastspitzen [SOLVED]
Hallo,
Thus spoketh Martin Steigerwald <Martin@lichtvoll.de>
unto us on Fri, 2 Sep 2011 22:15:37 +0200:
> > Also das wäre dann mal erledigt.
>
> Wie hast Du den Prozess jetzt ermittelt? Mit atop oder anderweitig?
>
falls jemand interessiert ist, ich hab mir wegen eines ähnlichen Problems
mal ein kleines Pythonskript gebastelt, das (hoffentlich) die Auswertung
der Prozesslastdaten erleichtert. Es ruft einfach nur in einem definierten
Intervall top -b -n 1 auf und entfernt alle Einträge, deren CPU-Last
unterhalb eines festgelegten Levels ist. Die übrigbleibenden Lastspitzen werden
dann protokolliert. Weil's nicht so lang ist, hänge ich es unten einfach
mal an, ich hoffe das ist ok. Oben sind vier Zeilen mit (hoffentlich
selbsterklärenden) User-Settings; sauber beenden kann man das Skript mit
Signal 2, 3, 6 od. 15. Es ist natürlich etwas "quick-and-dirty", man
sollte auf jeden Fall besser immer nur eine Instanz des Skripts auf
einmal laufen lassen, sonst geschehen u.U. seltsame Dinge mit dem Logfile ;)
Gruss
Michael
########## Datei poll_top.py ################################################
#!/usr/bin/python
# -*- encoding: utf-8 -*-
log = "~/Desktop/poll_top.log"
cpuload_cutoff = 50.0# Prozesse mit geringerer CPU-Last ignorieren, in %
interval = 1.0# Polling-Intervall in sec.
clear_log = True# Logfile beim Programmstart leeren, True oder False
###############################################################################
import commands, time, signal, os, sys
# die Quick-and-dirty-Lösung um mehrere Instanzen zu verhindern:
# achtung: funkt nur, wenn das Skript direkt aufgerufen wird,
# nicht mit $ python <skript> !
if len(commands.getoutput('pgrep %s' % os.path.basename(__file__)).split()) > 1:
print '%s läuft schon, Ende.' % os.path.basename(__file__)
sys.exit(1)
run = True
log = os.path.abspath(os.path.expanduser(log))
stop_signal = '?'
def poll():
if run:
# top -b -n 1 gibt aus:
#top - 18:29:41 up 29 min, 1 user, load average: 2.48, 1.52, 0.81
#Tasks: 115 total, 2 running, 113 sleeping, 0 stopped, 0 zombie
#Cpu(s): 32.5%us, 9.6%sy, 0.0%ni, 52.7%id, 4.1%wa, 0.3%hi, 0.9%si, 0.0%st
#Mem: 1542992k total, 881468k used, 661524k free, 18976k buffers
#Swap: 1349452k total, 0k used, 1349452k free, 369568k cached
#
# PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
# 2459 ich 20 0 849m 250m 47m R 88.2 16.6 9:38.53 firefox-bin
# 2360 root 20 0 81108 52m 11m S 5.9 3.5 0:43.95 Xorg
out = [x.split() for x in commands.getoutput('top -b -n 1').splitlines()[7:]]
# jetzt isses:
# [['2459', 'ich', '20', '0', '619m', '237m', '47m', 'R', '92.8', '15.7', '11:02.24', 'firefox-bin'],...]
out = [(x[8], x[11]) for x in out]
# jetzt isses:
# [(89.299999999999997, 'firefox-bin'), ...]
# jetzt alle unauffaelligen Prozesse ausblenden:
out = [x for x in out if float(x[0]) > cpuload_cutoff]
if out:
s = ''
t = time.ctime()
for x in out:
s += t + ' CPU-Last: ' + x[0] + '% ' + 'Prozess: ' + x[1] + '\n'
f = open(log, 'a')
f.write(s)
f.close()
def stop(*args):
global run, stop_signal
run = False
stop_signal = args[0]
print "Signal", args[0], "erhalten, Ende."
for signum in (2, 3, 6, 15):
signal.signal(signum, stop)
if clear_log:
f = open(log, 'w')
f.close()
f = open(log, 'a')
f.write(time.ctime() + ' Programm gestartet.\n\n')
f.close()
while run:
try:
poll()
except IOError:
# passiert, wenn commands.getoutput() durch ein Signal unterbrochen wird
print 'Oooops, IOError, never mind.'
time.sleep(interval)
f = open(log, 'a')
f.write('\n' + time.ctime() + ' Programm mit Signal ' + str(stop_signal) + ' beendet.\n\n\n')
f.close()
############ EOF #######################################################
.-.. .. ...- . .-.. --- -. --. .- -. -.. .--. .-. --- ... .--. . .-.
Another dream that failed. There's nothing sadder.
-- Kirk, "This side of Paradise", stardate 3417.3
Reply to: