Ankündigung

Einklappen
Keine Ankündigung bisher.

Systemverhalten beobachten

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [Codebeispiel] Systemverhalten beobachten

    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
Lädt...
X