Welche Datei braucht für close() 5 Sekunden?

  • Hi,


    Zum Reproduzieren: Ich lege auf ARD HD und ZDF HD Timer für die aktuelle und die nächsten Sendungen an.

    Dann stoppe ich vdr, und starte vdr neu, und zwar ohne Patches und ohne Plugins. Im Syslog:

    09:20:55: executing '/usr/lib/vdr/vdr-recordingaction started

    Und dann passiert erst mal 5 Skunden nichts. Die braucht vdr zum Schließen der Dateien in thread.c,

    Code
         int MaxPossibleFileDescriptors = getdtablesize();
         for (int i = STDERR_FILENO + 1; i < MaxPossibleFileDescriptors; i++)
             close(i); //close all dup'ed filedescriptors

    Also ich vermute, es sind die Dateien vom DVB Treiber, die so lange zum Schließen brauchen. Sundtek , könnt ihr Euch das bitte mal anschauen/prüfen?

    Die Dateien mit den Aufzeichnungen sollten es nicht sein, bereits 2 Sekunden vorher (09:20:53) meldet vdr "video directory scanner thread ended".


    5 Sekunden später (09:21:00, nach dem Schließen der Dateien) wird dann "recordingaction: executing /usr/share/vdr/recording-hooks/R50.tvscraper" von "/usr/lib/vdr/vdr-recordingaction" aufgerufen, das gar nichts macht.

    Der thread wird so lange blockiert, was zu "i/o throttle activated, count = 1 (tid=355030)" führt. Es hat bei mir auch schon zum Pufferüberlauf / Datenverlust geführt. kls , kannst Du Dir das bitte mal anschauen? Eine Blockade des threads, der "recordingaction started" aufruft, sollte doch nicht zu einer Verzögerung beim Schreiben der Daten führen (?). Oder hat das eine andere Ursache, z.B. dass das System durch die Aufrufe von close() so blockiert wird, dass das System die Daten nicht mehr schreibt?


    Um zu verifizieren, dass die Verzögerung tatsächlich durch close() verursacht werden, habe ich einen Patch geschrieben, der die 3 oben zitierten Zeilen in thread.c auskommentiert.

    Ein Restart des vdr mit diesem Patch führt zu:

    Die Verzögerung ist weg, und auch "i/o throttle activated" taucht nicht mehr auf.

    Trotzdem ist diese Lösung vermutlich nicht für alle geeignet, in https://stackoverflow.com/ques…-fork-and-prior-to-callin wird beschrieben, wozu das close() benötigt wird.


    ~Markus

    Client1: ASUS P5QC, Dual Core 3G, Cine S2, Ext. Board von TBE, Xubuntu 20.04, VDR 2.6x

    Client2: RPI3

    Server: RPI4, Sundtek SkyTV Dual 2x

    Einmal editiert, zuletzt von MarkusE ()

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!