[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: