Ankündigung

Einklappen
Keine Ankündigung bisher.

Systemressourcen auslesen

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

    Systemressourcen auslesen

    Hallo Marcus,

    du hattest doch mal ne Logik oder sowas, um die Systemressourcen mitzuloggen. Ich find den Post leider nicht mehr. Könntest du das kurz Posten?

    Danke & Gruss
    Mit freundlichen Grüßen
    Niko Will

    Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
    - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

    #2
    Hi Niko,

    da hast Du aber Glück. Ich habe es gerade auf die smartVISU config umgezogen.

    Code:
    # items/system.conf
    [smarthome]
        name = SmartHome
        sv_page = room
        sv_img = it_server.png
        [[runtime]]
            name = Laufzeit
            type = str
            visu = yes
            sv_widget = "{{ basic.value('item', 'item') }}"
        [[memory]]
            name = Speicher
            type = num
            sqlite = yes
            visu = yes
            sv_widget = "{{ plot.period('item-plot1', 'item', 'avg', '1h') }}", "{{ plot.period('item-plot12', 'item', 'avg', '12h') }}", "{{ plot.period('item-plot48', 'item', 'avg', '48h') }}", "{{ plot.period('item-plot14', 'item', 'avg', '14d') }}"
        [[threads]]
            name = Threads
            type = num
            sqlite = yes
            visu = yes
            sv_widget = "{{ plot.period('item-plot', 'item', 'avg') }}"
    
    [system]
        name = System
        sv_page = room
        [[load]]
            name = Last
            type = num
            sqlite = yes
            visu = yes
            sv_widget = "{{ plot.period('item-plot', 'item', 'avg') }}"
        [[memory]]
            type = num
            name = Speicherverbrauch
            sqlite = yes
            visu = yes
            sv_widget = "{{ plot.period('item-plot', 'item', 'avg') }}"
        [[uptime]]
            name = Laufzeit
            type = str
            visu = yes
            sv_widget = "{{ basic.value('item', 'item') }}"
    Code:
    # logics/system.py
    
    def td2str(td):
        hours, seconds = divmod(td.seconds, 3600)
        minutes, seconds = divmod(seconds, 60)
        if td.days:
            return "{0}d {1}h {2}m".format(td.days, hours, minutes)
        else:
            return "{0}h {1}m".format(hours, minutes)
    
    # Runtime
    runtime = sh.tools.runtime()
    sh.smarthome.runtime(td2str(runtime))
    
    # Threads
    tn = {}
    tc = threading.activeCount()
    for t in threading.enumerate():
        tn[t.name] = tn.get(t.name, 0) + 1
    logger.info('Threads ({0}): '.format(tc) + ', '.join("{0}: {1}".format(k, v) for (k, v) in tn.items()))
    sh.smarthome.threads(tc)
    
    # Object Counter
    d = {}
    sys.modules
    # collect all classes
    for m in sys.modules.values():
        for sym in dir(m):
            o = getattr (m, sym)
            if type(o) is types.ClassType:
                d[o] = sys.getrefcount (o)
    # sort by refcount
    pairs = map (lambda x: (x[1],x[0]), d.items())
    pairs.sort()
    pairs.reverse()
    obj = ''
    for n, c in pairs[:10]:
        obj += "{0}: {1}, ".format(c.__name__, n)
    obj = obj.strip(', ')
    logger.info("Objects (Top 10): {0}".format(obj))
    
    # Garbage
    import gc
    gc.set_debug(gc.DEBUG_LEAK)
    gc.collect()
    if gc.garbage != []:
        logger.warning("Garbage: {0}".format(gc.garbage))
        del gc.garbage[:]
    
    # Load
    l1, l5, l15 = os.getloadavg()
    logger.debug("Load: {0}, {1}, {2}".format(l1, l5, l15))
    sh.system.load(round(l5, 2))
    
    # Memory
    statusfile = "/proc/{0}/status".format(os.getpid())
    units = {'kB': 1024, 'mB': 1048576}
    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(' ')
    mem = int(size) * units[unit]
    sh.smarthome.memory(mem)
    
    # System Memory
    statusfile = "/proc/meminfo"
    units = {'kB': 1024, 'mB': 1048576}
    with open(statusfile, 'r') as f:
        data = f.read()
    for line in data.splitlines():
        key, sep, value = line.partition(':')
        if key.startswith('Mem'):
            size, unit = value.strip().split(' ')
            mem = int(size) * units[unit]
            if key == 'MemTotal':
                total = mem
            elif key == 'MemFree':
                free = mem
    sh.system.memory(100-int(free/(total/100)))
    
    # System Uptime
    statusfile = "/proc/uptime"
    with open(statusfile, 'r') as f:
        data = f.read()
    uptime = int(float(data.split()[0]))
    uptime = datetime.timedelta(seconds=uptime)
    sh.system.uptime(td2str(uptime))
    Code:
    # etc/logic.conf
    [System]
        filename = system.py
        cycle = 300
    Viel Spaß damit.

    Bis bald

    Marcus

    Kommentar


      #3
      Systemressourcen auslesen

      Super, Danke dir!
      Mit freundlichen Grüßen
      Niko Will

      Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
      - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

      Kommentar


        #4
        Hi,
        nur so als Frage warum logt ihr die nochmal mit? Ist es nicht einfacher das mit SAR aufzuzeichnen und dann einfach auszugeben?
        Viele Grüsse
        Jürgen

        Kommentar


          #5
          Hi Jürgen,

          was meinst Du mit 'die'?

          Ich logge die Informationen mit um Fehler in der Programmierung zu erkennen.
          Manche Informationen würden sich über Sar gar nicht erfassen lassen.

          Bis bald

          Marcus

          Kommentar


            #6
            Systemressourcen auslesen

            Außerdem will ich es in der smartVISU haben...
            Mit freundlichen Grüßen
            Niko Will

            Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
            - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

            Kommentar


              #7
              Die KPIs die nicht im SAR schon drin sind machen ja sinn diese wegzuschreiben. Aber die welche schon durch das System gespeichert werden könnte man doch thoretisch auch live holen ohne diese doppelt zu speichern.

              Kommentar


                #8
                Systemressourcen auslesen

                Es gibt aber keine Integration von SAR in sh.py und da ich die sysstats ohnehin nicht laufen habe, wird da auch nichts doppelt gespeichert
                Mit freundlichen Grüßen
                Niko Will

                Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
                - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

                Kommentar


                  #9
                  Hi,
                  auf systat würde ich nicht verzichten wollen. Weil es sich bewährt hat.
                  Viele Grüsse
                  Jürgen

                  Kommentar


                    #10
                    Hi,

                    ein Hinweis für Entwickler:
                    Neben dem Speicherverbrauch an sich sind zwei Outputs besonders interessant:

                    Code:
                    logger.warning("Garbage: {0}".format(gc.garbage))
                    logger.info("Objects (Top 10): {0}".format(obj))
                    Wenn Objekte im 'Garbage' sind, so können diese nicht sicher gelöscht werden und verbrauchen Speicherplatz => Memleak. Das sieht man z.B. bei der Benutzung der urllib. (httplib ist nicht betroffen)

                    Die Top 10 der Objekte sind die Instanzen der Klassen und sie sollten über einen langen Zeitraum stabil sein.
                    Dadurch konnte ich z.B. das Problem mit den Websockets identifizieren, da alte Websocket Instanzen nicht entfernt wurden.

                    Bis bald

                    Marcus

                    Kommentar


                      #11
                      Ich muss das noch mal raufholen, da ich versucht habe die Logic und die Items zu verwenden, aber in der Logic wird ein Fehler geworfen:

                      Code:
                      system.py - line 30 - "AttributeError: 'module' object has no attribute 'ClassType'"
                      Ich habe den Code 1:1 übernommen, hat jemand eine Idee woher das stammen kann?

                      Danke.

                      Kommentar


                        #12
                        Hi Lars,

                        die Logik war mit Python2 geschrieben.
                        Seit der Migration auf Python 3 sieht sie anders aus, sie ist aber auch Bestandteil von SH.py und der SV.
                        Und kann im Config-Bereich einfach über die SmartHome.py-Seite ausgewertet werden.

                        Bis bald

                        Marcus

                        Kommentar


                          #13
                          Moep... danke.
                          An die neue Python Version hab ich natürlich nicht gedacht, aber auch immer geschickt übersehen das es die Seite unter Config gibt.

                          Kommentar

                          Lädt...
                          X