Speicherverbrauch steigt mit der Zeit

  • Mir ist schon vor langer Zeit aufgefallen, dass der VDR (oder ein Plugin) Speicher verbraucht. Beim Start ligt der VDR noch bei 12% und steigt dann stetig an, bis sogar der Swap verwendet wird. Meistens nach 5 oder 6 Stunden.

    Hier mal 30 Minuten. ps_mem.py wird alle 10 Minuten gestartet:


    MP-Logos (Kanallogos für VDR) - MV_Backup (Backup mit RSync) - Skin FlatPlus (Fork)


    Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht. [StGB §328 Abs.: 2 Nr.: 3]

    ___

    Gen2VDR V7; VDR 2.4.6; Gehäuse: Antec Fusion V2 Black & iMon LCD (15c2:ffdc); Atric IR-Einschalter Rev. 4; Board: Intel DH77EB, Core i5-3550, NVidia GTX 750 Ti, 4 GB RAM; DVB: 1x Digital Devices CineS2 Quad V6.5 [VDR-User #1540]

  • Ich beobachte auch schon seit einiger Zeit einen stetig ansteigenden Speicherbedarf, allerdings "nur" in der Größenordnung von ca. 100MB pro Woche (wenn der VDR 24/7 läuft). Ich hatte in Version 2.3.5 mal was in der Richtung gefixt:


    - Fixed a memory leak in cSectionSyncerHash. The cSectionSyncerEntry objects put into

    the hash were never explicitly deleted. Now the cSectionSyncerHash takes ownership of

    these objects.


    aber anscheinend war das noch nicht alles. Wenn bei dir bereits nach einigen Stunden der Speicher aufgebraucht ist, hat das vermutlich eine andere Ursache.

    So ein Speicherleck mit 100MB/Woche zu finden ist mühsam, daher bin ich dem bisher noch nicht nachgegangen...

  • Etwas ähnliches hatte ich halt auch mit tvheadend. 100 MB pro Woche ist gefühlsmäßig sicher erstmal nicht viel aber wenn man sowas auf einem Raspberry fahren will dann sind 4GB RAM halt in endlicher Zeit voll. Man kann den VDR über systemd bei Überschreiten einer Speichergrenze hart restarten lassen, aber dann läuft man Gefahr eine Aufnahme zu killen.


    Ärgerlich für mich vor allem weil das eigentlich mein Hauptgrund war um von tvheadend auf VDR zu wechseln. Ich möchte einfach einen kleinen Mini-Server der wenig Strom braucht und einfach TV-Programm ins Haus-LAN streamt. Mit tvheadend wird das nix, denn da tut sich deutlich weniger wie aktuell im Bereich VDR.


    Gibt es nicht Hilfstools die "verlorenen" Speicher erkennen und die Stelle wo der verloren gegangen ist melden?


    Edit: https://www.cprogramming.com/debugging/valgrind.html


    Ich erinnere mich aber das für irgendwas schonmal genutzt zu haben und der Erfolg war begrenzt.

  • Johns hatte doch einige Jahre lang versucht, das Speicherleck in Softhddevice zu stopfen. Rofafor hatte dann 2017 dieses in seinem pesintta's github repo gefixt. Kann es sein, das es in den anderen Derivaten immer noch umherdümpelt?


    (valgrind hatte damals auch nichts gefunden)

  • Ich vermute eventuel markad, da sich der Verbrauch erhöht hat, seit dem Update auf die kfb77-Version. War aber vorher auch schon...

    Nichts ist unmöglich, aber eher unwahrscheinlich, da das Plugin fast nichts macht, sondern nur im VDR Recording Event Händler hängt und wenn da was ankommt, markad startet. markad wird für jede Aufnahme neu gestartet und somit räumt spätestens am Ende der Bearbeitung das Betriebssystem den Speicher vollständig auf.

    Ich habe (bis jetzt) am Plugin fast nichts geändert, sondern nur ein paar zusätzliche Parameter eingebaut. Die eigentliche Funktion ist ja außerhalb dem Plugin.

    Entferne doch zum Test einfach mal den Link /etc/vdr/conf.d/50-markad.conf, dann wird nach einem Neustart des VDRs das Plugin nicht mit gestartet. Interessant wäre, ob dann der Memory Leak immer noch da ist.

    Unter contrib im Source Code liegt ein Script, mit dem man markad auf vorhandene Aufnahmen starten kann ohne das Plugin.

  • ... in der Größenordnung von ca. 100MB pro Woche

    Das kann man vernachlässigen. Bei mir läuft der VDR nur bei Aufnahmen und wenn ich was schaue. In der Regel abends so 6 Stunden. Und da im Skinflatplus der Speicherverbrauch angezeigt wird, ist mir das aufgefallen. Aber letztens wurde dann sogar geswapped...


    Ich vermute dass es eher ein Plugin ist, oder was ganz anderes wie z.B vdradmind oder MySql...


    Die meisten werden das kaum bemerken, weil der VDR nur zum Schauen kurz läuft, oder mehr als 4GB verbaut sind. Woche 4GB ja eigentlich dicker reichen sollten

    MP-Logos (Kanallogos für VDR) - MV_Backup (Backup mit RSync) - Skin FlatPlus (Fork)


    Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht. [StGB §328 Abs.: 2 Nr.: 3]

    ___

    Gen2VDR V7; VDR 2.4.6; Gehäuse: Antec Fusion V2 Black & iMon LCD (15c2:ffdc); Atric IR-Einschalter Rev. 4; Board: Intel DH77EB, Core i5-3550, NVidia GTX 750 Ti, 4 GB RAM; DVB: 1x Digital Devices CineS2 Quad V6.5 [VDR-User #1540]

  • Ich verwende VDPAU. Daran liegt es dann wohl nicht.

    Wäre halt schön, wenn man erst mal raus finden könnte, wo (bei welchem Plugin) man ansetzen muss...

    MP-Logos (Kanallogos für VDR) - MV_Backup (Backup mit RSync) - Skin FlatPlus (Fork)


    Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht. [StGB §328 Abs.: 2 Nr.: 3]

    ___

    Gen2VDR V7; VDR 2.4.6; Gehäuse: Antec Fusion V2 Black & iMon LCD (15c2:ffdc); Atric IR-Einschalter Rev. 4; Board: Intel DH77EB, Core i5-3550, NVidia GTX 750 Ti, 4 GB RAM; DVB: 1x Digital Devices CineS2 Quad V6.5 [VDR-User #1540]

  • Würde es sich lohnen so ein Tool mal zu testen?
    https://github.com/WuBingzheng/libleak

    Ich bin gerade nicht da und kann nichts machen...


    Oder wie ist es damit:

    https://unix.stackexchange.com…leak-of-a-running-process

    Erste Antwort

    MP-Logos (Kanallogos für VDR) - MV_Backup (Backup mit RSync) - Skin FlatPlus (Fork)


    Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht. [StGB §328 Abs.: 2 Nr.: 3]

    ___

    Gen2VDR V7; VDR 2.4.6; Gehäuse: Antec Fusion V2 Black & iMon LCD (15c2:ffdc); Atric IR-Einschalter Rev. 4; Board: Intel DH77EB, Core i5-3550, NVidia GTX 750 Ti, 4 GB RAM; DVB: 1x Digital Devices CineS2 Quad V6.5 [VDR-User #1540]

  • Ein Versuch ist letztlich nie verkehrt. Schaut beides gut aus. Kenne ich beides nicht. Wäre aber für beide interessiert wie so deine Erfahrung damit ist.


    Wegen des 100MB-Problems muss ich dann wohl selber mal schauen. So grob überschlagen ist das deutlich weniger als TVHeadend bei mir "gefressen" hat und vielleicht habe ich ja auch das Glück das das Problem gar nicht auftritt wenn der VDR keine Ausgabe macht. Bei mir soll der eigentlich nämlich tatsächlich 24/7 als reiner Server laufen. Wenn es aber "nur" 100MB pro Woche sind ist durchaus möglich das in der Zwischenzeit sowieso geplante Reboots fällig werden wegen Sicherheitsupdates.

  • Wie kann ich denn den Speicherverbrauch vom VDR sinnvoll und dauerhaft (über Stunden, Tage) monitoren?

    Bzw. wie ist dir der steigende Verbrauch aufgefallen?

    Ich verwende zwar nur das alte softhddevice openglosd für ffmpeg 2.8, aber interessieren würds mich (und euch evtl.) auch.


    Aus den Zahlenwerten von ganz oben werd ich nicht schlau: der VDR verbraucht knapp unter 500 MB (leicht schwankend) und markad - das du erwähnst - braucht sogar weniger im Laufe der Zeit (von ca. 100 MB auf ca. 50MB im letzten Log). Oder sind die Logs von unten nach oben chronologisch zu lesen?


    Edit:

    Bei mir scheint der mysqld am meisten zu brauchen (eh klar, is ja auch so eingestellt) - VDR braucht so um die 550 MB:

    Code
    1. ps -e -orss=,args= | sort -rn | pr -TW$COLUMNS
    2. 1641220 /usr/sbin/mysqld
    3. 569920 /usr/bin/vdr
    4. 47708 /usr/lib/xorg/Xorg -noreset vt7
    5. ...

    Der Rest ist (einzeln betrachtet) vernachlässigbar.

    Ich nehm den Timeout mal raus und werde den Wert vom VDR beobachten ...

    MyVDR: yaVDR-Ansible (Ubuntu 18) - softhddevice-openglosd (ffmpeg 2.8) - epgd/epg2vdr - skindesigner estuary4vdr (adaptiert) - 1920x1080@50 Hz | kodi 18 - inputstream + amazon vod
    Aerocube M40 | 300W | ASRock H61M-GE | Intel G530 | Asus ENGT520 | 2 x TT-budget S2-3200 | ASRock Smart Remote (CIR) | 4 GB RAM | 120 GB SSD | 3 TB HDD

  • Wow, das ist ja eine Menge Speicherverbrauch. Hier:


    Code
    1. root@ubuntuwz:~# ps -e -orss=,args= | sort -rn | pr -TW$COLUMNS
    2. 243456 /usr/sbin/mysqld
    3. 171200 /usr/bin/vdr
    4. 92252 /lib/systemd/systemd-journald
    5. 63300 /usr/lib/xorg/Xorg -noreset vt7
    6. ...

    Intel NUC 10 NUC10i3FNH, Digital Devices Octopus NET V2 Max M4, 1000 GB Samsung 970 Evo M.2 2280 PCIe 3.0 x4 NVMe

  • markad - das du erwähnst - braucht sogar weniger im Laufe der Zeit (von ca. 100 MB auf ca. 50MB im letzten Log)

    markad verbraucht nur Speicher, wenn es gerade eine Aufnahme bearbeitet. Wieviel, hängt stark vom Codec der Aufnahme und ob es gerade versucht ein Logo in der Aufnahme zu finden. Dabei kann es auch kurzzeitig noch viel mehr sein. Auf jeden Fall wird am Ende der Bearbeitung das Programm beendet und vom Betriebssystem vollständig aus dem Speicher geworfen. markad läuft als eigenes Programm im eigenen Speicherbereich und kann nicht den Speicherverbrauch vom VDR erhöhen.

    Die libvdr-markad.so (also das Plugin, das markad startet) hat nur die Funktion markad zu starten und eine Konfigurationsoberfläche. Ich bin gerade dabei den Code zu prüfen. Da dauert noch, bei fremdem Code muss man sich zuerst zurechtfinden, aber auf den ersten Blick habe ich da schon ein paar memory leaks in der Konfigurationsoberfläche gefunden. Das sind nur ein paar kBytes und nur, wenn man an der Konfiguration was ändert. Kann nicht die Ursache für o.g. Leaks sein, aber schön ist das nicht. Ich werde mich drum kümmern.

  • kls

    Kann es sein, dass Speicher für Konfigurationsmenue Punkte, die über z.B. "new cMenuEditBoolItem" erzeugt werden, vom VDR selbst beim Schießen des Menues wieder freigegeben werden ? Ich kann keine Stelle finden, wo ich das wieder freigeben könnte.

  • Wow, das ist ja eine Menge Speicherverbrauch.

    Ja stimmt, jetzt wo ich deinen lese. mysqld ist egal, das ist absichtlich so eingestellt (cache).
    Aber dass mein VDR doppelt soviel RAM braucht wie deiner? Aber vermutlich schwankt das so stark, dass man das nicht vergleichen kann.


    Ich mache das mit rrdtool. Die Daten hole ich mit
    /usr/bin/top -b -n 1 | grep -w vdr | head -1 ...

    Danke dafür! rrdtool muss ich mir noch anschauen. Jetzt gerade sinds sogar schon über 600 MB!

    /usr/bin/top -b -n 1 | grep -w vdr | head -1

    1901 vdr 20 0 3122020 629452 61916 S 12,5 15,6 14:54.95 vdr
    Scheint (in dem kurzen Beobachtungszeitraum) tatsächlich zu steigen.


    Interessant bzw. komisch ist, dass der Befehl zwar meist den VDR ausspuckt, oft aber auch was anderes???

    Ist das normal?


    Und Klaus: du lässt den Befehl vermutlich alle paar Minuten in eine Datei ausgeben (anhängen) und wertest diese dann mit dem Tool aus, richtig?

    Oder filterst du die Nicht-VDR Prozesse (siehe oberhalb) dann vorher aus?


    markad verbraucht nur Speicher, wenn es gerade eine Aufnahme bearbeitet. ...

    Danke für die ausführliche Antwort! Wieder was gelernt.

    MyVDR: yaVDR-Ansible (Ubuntu 18) - softhddevice-openglosd (ffmpeg 2.8) - epgd/epg2vdr - skindesigner estuary4vdr (adaptiert) - 1920x1080@50 Hz | kodi 18 - inputstream + amazon vod
    Aerocube M40 | 300W | ASRock H61M-GE | Intel G530 | Asus ENGT520 | 2 x TT-budget S2-3200 | ASRock Smart Remote (CIR) | 4 GB RAM | 120 GB SSD | 3 TB HDD

  • Sorry, aber ich muss nochmal fragen: die 600 MB vom VDR - da sind aber auch alle Plugins miteingerechnet, oder?
    Ich denke da zB an skindesigner oder epg2vdr, die ich wirklich sehr viel cachen lasse.

    rkp : kann es sein, dass du nur sehr wenige Plugins laufen hast bzw. diese sehr speicherfreundlich eingestellt hast?

    MyVDR: yaVDR-Ansible (Ubuntu 18) - softhddevice-openglosd (ffmpeg 2.8) - epgd/epg2vdr - skindesigner estuary4vdr (adaptiert) - 1920x1080@50 Hz | kodi 18 - inputstream + amazon vod
    Aerocube M40 | 300W | ASRock H61M-GE | Intel G530 | Asus ENGT520 | 2 x TT-budget S2-3200 | ASRock Smart Remote (CIR) | 4 GB RAM | 120 GB SSD | 3 TB HDD

  • Und Klaus: du lässt den Befehl vermutlich alle paar Minuten in eine Datei ausgeben (anhängen) und wertest diese dann mit dem Tool aus, richtig?

    Oder filterst du die Nicht-VDR Prozesse (siehe oberhalb) dann vorher aus?

    Bei mir gibt es keinen User namens 'vdr', daher liefert mir die angegebene Zeile nur den Prozess des laufenden VDRs.

    Genau genommen müsste man grep wohl noch etwas genauer formulieren.


    Der Aufruf erfolgt alle 5 Minuten über rrdtool.

    Hier das gesamte Script um die Daten zu erzeugen (wird mit "vdr" als Parameter aufgerufen):