Fragen bezüglich Performance von Firebird in einer Anwendung

Themen rund um den praktischen Einsatz von Firebird. Fragen zu SQL, Performance, Datenbankstrukturen, etc.

Moderator: thorben.braun

Antworten
TK8782
Beiträge: 1
Registriert: Mi 7. Aug 2019, 07:29

Mi 7. Aug 2019, 09:14

Guten Tag,

ich bin neu hier im Forum und möchte zunächst mal alle Experten hier begrüßen.

Ich habe nun aktuell bereits eine Frage, die mich seit einiger Zeit beschäftigt.

Wir nutzen intern eine Businesssoftware (ERP) die im Hintergrund eine Firebird 2.5 bzw. Firebird 3.0 Datenbank verwendet.
Da wir die Performance der Anwendung verbessern wollten, haben wir den bestehenden Server auf dem die Firebird Datenbank bisher lief aktualisiert.
Der alte Server hatte folgende Hardware:

Intel XEON E5-2630 v4 2.10 GHz

64 GB RAM
HP SSD Drive für die Datenbank mit folgenden Werten:
RANDOM READS : 64000 IOPS
RANDOM WRITES : 26000 IOPS
SEQUENTIAL READS : 535 MBPS
SEQUENTIAL WRITES : 380 MBPS
Gigabit Netzwerkkarte

Um mehr Performance zu erhalten haben wir den Server ersetzt und anstelle einer normalen SSD die Datenbank auf eine NVMe Festplatte gelegt.

Der neue Server hat folgende Daten:
Intel XEON Silver 4215 2.5GHz
32 GB RAM (hier wurde weniger verwendet, da der RAM sowieso nie voll belegt war)
Intel DC P4510 NVMe Drive mit folgenden Werten:
Sequenzielle Lesezugriffe (bis zu) 3200 MB/s
Sequenzielle Schreibzugriffe (bis zu) 2000 MB/s
Zufällige Lesezugriffe (Bereich: 100 %) 637000 IOPS
Zufällige Schreibzugriffe (Bereich: 100 %) 81500 IOPS
Gigabit Netzwerkkarte

Beide Server sind am selben Netzwerkswitch angeschlossen und nicht virtualisiert.

Nachdem die Datenbank umgezogen war, habe ich entsprechende Performancetests ausgeführt.
Wenn ich z.B. den Test von IB-AID https://ib-aid.com/en/simple-insert-upd ... -firebird/ ausführe, dann ist mein neuer Server auch deutlich schneller als der alte.

Leider, und das ist das Problem, merken wir das in der Anwendung nicht. Diese ist, wenn überhaupt, nur minimal schneller.
Ich vermute ja dass es an der Anwendung liegt. Daher habe ich parallel zur Arbeit in der Anwendung mal einen Test mit procmon durchgeführt und die Log-Datei von procmon überprüft.
Es ist auffällig dass sehr viele TCP-Requests bei Aufruf von DAtensätzen in der Anwendung stattfinden. Ist das für Anwendungen, die Firebird als Datenbank verwenden normal oder liegt dies in der Art und Weise der Programmierung?
Da innerhalb der Datenbank relativ wenig mit StoredProcedures, Triggern etc. gearbeitet wird und die SQLs rein aus der Anwendung heraus passieren, stellt sich mir in der IT die Frage ob ich durch bessere Hardware überhaupt noch Geschwindigkeitsverbesserungen in der Anwendung erreichen kann.

Hat hier jemand Erfahrung oder ähnliches schon erlebt?

Vielen Dank.
bfuerchau
Beiträge: 134
Registriert: Mo 7. Mai 2018, 18:09

Do 8. Aug 2019, 09:38

Dieses hatte ich auch in einem ähnlichen Fall für SQL-Server (in einem anderen Forum) bereits erklärt.
Da kann die Hardware und die Datenbank noch so schnell sein, wenn der Client doof programmiert ist, hilft das einfach nicht.
Ursache ist häufig die Verwendeung von Frameworks und die angebliche Vereinfachung von Datenbankprogrammierung in der Unkenntnis, was denn da so im Hintergrund abläuft.
Da werden dann komplexe Objektbeziehungen definiert, die unweigerlich in viele SQL's aufgelöst werden müssen. Zusätzlich erfolgt das Laden von vielen Informationen in z.B. Dropdownlisten, wo dann viele unnötige Informationen intern geladen werden müssen, tatsächlich aber nicht benötigt werden.
Wenn also der Client 100 SQL's hintereinander absetzt, jeder SQL in 10ms von der Firebird beantwortet wird, dauert die Abfrage halt 1000ms = 1 Sekunde.
Wenn also z.B. ein Dropdown dann 1000 Einträge enthält, der über eine ungünstige Objektbeziehung zu 1000 SQL's führt, dauert das Laden eben 10 Sekunden.

Um dies also mal zu analysieren bedarf es eines Traces der SQL's:
https://firebirdsql.org/rlsnotesh/rnfb25-trace.html
Dann kann man z.B. per IBExpert die einzelenen SQL's analysieren um eine Indexoptimierung zu erreichen. Dies führt zur Beschleunigung des einzelnen Zugriffes.
Das ändert allerdings nichts an der Häufigkeit von Zugriffen, die ein Trace dann aber aufzeigt.
Ich habe das schon häufiger erlebt, dass bei der Entwicklung mit wenigen Daten alles schön schnell ist, bei dann mehr Daten wirds plötzlich langsamer.
Aktuell habe ich eine Web-Anwendung bekommen, die mit 100 Zeilen ganz gut zurechtkam, nach dem Laden der Daten aus einem Hostsystem mit 10.000 Zeilen hatte ich Antwortzeiten bei der Anzeige von 3-4 Sekunden und beim Buchen von 8-10 Sekunden!
Antwort des Lieferanten: das muss an der Firebird liegen.
Ich selber habe eine BI-Anwendung, die mit mehreren 100.000 Zeilen Abfragen in z.T. unter 1 Sekunde bringt. Also an der Firebird liegt es definitiv nicht.
sroland
Beiträge: 5
Registriert: Fr 27. Jul 2018, 08:38

Fr 20. Sep 2019, 10:23

Erst hätte ich noch mal ein paar Fragen bezüglich eures Servers.
Welches Betriebssystem.
Konfiguration der Festplatte c: Raidlevel welche Festplatten

Dann kann ich nur zusätzlich zu den Empfehlungen meines Vorgängers folgendes vorschlagen.
Kaufe eine Lizenz von Ibexpert
oder
HQbird von https://ib-aid.com/en/start/

In IBexpert gibt es unter "Systemdienste" den Benchmark von Holger Klemt. Der testet im Vergleich zum Script von
ib-aid Mehrbenutzerzugriffe und ähnliches.
lg Roland Siegel
s-plus GmbH
schreiner-plus.de
Benutzeravatar
martin.koeditz
Beiträge: 140
Registriert: Sa 31. Mär 2018, 14:35

Fr 20. Sep 2019, 11:27

Hi TK8782,

wie meine beiden Vorredner schon geschrieben haben, liegt das Problem üblicherweise am Design der Anwendung.

Ich nutze die Trace-Funktion (fbtrace), um die Art der Verarbeitung einer Anwendung zu verfolgen. Dabei kann man genau sehen, welche Aktionen (SQL-Abfragen, etc.) zum Beispiel bei Klick auf einen Kunden abgefeuert werden. IBExpert und Co. bieten jedoch grafische Auswertungen.

Gruß
Martin
Martin Köditz
it & synergy GmbH
Antworten