Hallo zusammen,
weiß jemand, wo ich Informationen über das Laden/Entladen einer UDR-lib (dll oder .so) bekomme? Dh, wann eine UDR-lib geladen wird und wann sie wieder entladen wird?
Mein aktueller Stand ist, zusammengereimt aus einem Firebird-Bugticket https://github.com/FirebirdSQL/firebird/pull/8992,
dass eine UDR-lib lazy geladen wird, dh, nicht bei Serverstart und auch nicht beim connect, sondern erst, wenn in einer connection eine Prozedur/Funktion aus der UDR aufgerufen wird.
Und dass sie 60 Sekunden, nachdem keine Connection mehr aktiv ist, wieder entladen wird.
Konkret fiel mir bei einer Webanwendung (dh kurzlebige Connections) auf, dass die Ausführung einer UDR-SP reproduzierbar deutlich länger brauchte, wenn zwischen den Connections mehr als eine Minute Pause war. Nach etlichen Tests war klar, dass die Verzögerung durch das Neuladen der UDR-lib verursacht wurde. In Statistiken von DBA-Tools wird diese Zeit bei der prepare-Zeit ausgewiesen.
Ich habe beim Test eine relativ große UDR-lib verwendet (10 MB), der Firebird-Server braucht lokal ca 260 msek, sie zu laden. Bei kleinen UDR-libs sieht man den Effekt nicht bzw geht er im Rauschen unter.
Zusätzlich gab es folgenden schrägen Effekt: Jedes Neuladen der lib dauerte etwas länger, zwischen 30 und 50 msek. Nach 20 Ausführungen (immer mit mindestens einer Minute Pause dazwischen) dauerte es bereits 1.1 Sekunden, die lib zu laden. Und blieb dann auf dem hohen Wert bei weiteren Runden. Erst nachdem Firebird neugestartet wurde, dauerte das Laden wieder 260 msek - und stieg dann wieder an.
Das sind mehrere Probleme:
1. das UDR-Laden ist ein Performancefresser und passiert zu häufig
2. die Ladezeit sollte nicht anwachsen
3. bei gleichzeitigem UDR-Laden durch verschiedene Connections (also hohe Last) kommt es gelegentlich zu Konflikten, wenn es den Server beim lib-Laden auf dem falschen Fuß erwischt. Die Fehlermeldung ist dann bspw "Error while parsing procedure TEST_SP's BLR Zugriffsverletzung bei Adresse 4711 in Modul myudr.DLL". Je länger das Laden dauert, desto wahrscheinlicher wird ein solcher Konflikt, falls das Laden nicht 100% abgesichert ist.
Deshalb bitte ich diejenigen hier, die UDRs im Einsatz haben, zu versuchen, den Effekt zu reproduzieren. Wichtig wären mir die Punkte 1 und 2.
Testaufbau, zb in Flamerobin / dbeaver:
eine UDR-Funktion/UDR-SP aufrufen,
prepare-Zeit notieren, commit,
reconnect,
eine Minute warten
und das ganze 10-20 mal. Beim Test darf es keine weitere connection zum Server geben.
Danke! Gruß vr
Ladeverhalten einer UDR-lib
Moderator: thorben.braun