Hallo,

vllt. hilft es ja Dem einen oder anderen. Auf meinen SmartHome.py Instanzen monitore ich das System- bzw. Prozessverhalten.

Der Garbage Collector dürfte eher für Entwickler interessant sein. (Ich bin dadurch auf ein Speicherleck der urllib2 aufmerksam geworden => deswegen gibt es z.B. ein sh.tools.fetch_url(url) in dem das gefixt ist)

Die Logik sieht so aus:

Code:
# logic/system.py
# Load
l1, l5, l15 = os.getloadavg()
logger.debug("Load: {0}, {1}, {2}".format(l1, l5, l15))
sh.system.load(round(l5, 2))

# Thread
tn = []
for t in threading.enumerate():
    tn.append(t.name)
tn = ', '.join(tn)
tc = threading.activeCount()
logger.debug("Threads ({0}): {1}".format(tc, tn.strip(', ')))
sh.system.threads(tc)

# Garbage Collector
import gc
gc.set_debug(gc.DEBUG_LEAK)
gc.collect()
if gc.garbage != []:
    logger.warning("Garbage: {0}".format(gc.garbage))
    del gc.garbage[:]

# Memory
statusfile = "/proc/{0}/status".format(os.getpid())
units = {'kB': 1, 'mB': 1024}
with open(statusfile, 'r') as f:
    data = f.read()
status = {}
for line in data.splitlines():
    key, sep, value = line.partition(':')
    status[key] = value.strip()
size, unit = status['VmRSS'].split(' ')
threads = status['Threads']
mem = int(size) * units[unit]
sh.system.memory(mem)

# Objects
objects = ''
for count, obj in sh.object_refcount()[:10]:
    objects += "{0}: {1}, ".format(obj.__name__, count)
objects.strip(', ')
logger.debug("Objects (Top 10): {0}".format(objects))

runtime = sh.tools.runtime()
hours, seconds = divmod(runtime.seconds, 3600)
minutes, seconds = divmod(seconds, 60)
if runtime.days:
    sh.system.runtime("{0}d {1}h {2}m".format(runtime.days, hours, minutes))
else:
    sh.system.runtime("{0}h {1}m".format(hours, minutes))
Ich lasse das ganze alle fünf Minuten laufen:
Code:
#etc/logic.conf
[System]
    filename = system.py
    cycle = 300
Die Items dazu sehen so aus:
Code:
[system]
    name = System
    [[memory]]
        name = Memory (kilobytes)
        type = num
        visu = rrd
        rrd = yes
    [[load]]
        name = Load (5m)
        type = num
        visu = rrd
        rrd = yes
    [[threads]]
        name = Threads
        type = num
        visu = rrd
        rrd = yes
    [[runtime]]
        visu = div
        name = Laufzeit
        type = str
Im Anhange findet Ihr dann die Visu. Dort habe ich noch ein Feature aus 0.8 aktiviert um mir die letzten fünf Logeinträge (mit Warnings oder Error) anzeigen zu lassen.

Code:
<ul data-log="SmartHome.py" data-max="5" data-filter="true" data-role="listview" data-inset="true"></ul>
Bis bald

Marcus
Angehängte Dateien