Langsame Flask-SQLAlchemy-Verbindung

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
PythonCodingFun
User
Beiträge: 67
Registriert: Mittwoch 22. September 2021, 14:01

Hallo Python-Freunde,

ich habe folgendes Problem. Ich habe eine Flask-Anwendung Programmiert die soweit auch funktioniert, Als ORM nutze ich Flask-SQLAlchemy, die Datenbank ist eine PostgreSQL (Version 13.16) wenn ich diese unter localhost teste werden alle Abfragen sehr schnell (=<1 Sekunde) von der Datenbank bearbeitet. Aber wenn ich diese auf dem Server (Apache mit FreeBSD 13.2 Stable) deployed habe, habe ich folgende Sache, die ersten Abfragen dauern mehrere Sekunde (teilweise zweistelliger Bereich), die nachfolgenden teilweise unter einer Sekunde (wie beim Testen unter localhost).

Ich denke es liegt am Connection-Pool. Wie kann ich es bewerkstelligen das bereits ab der ersten Anfrage es so schnell abgearbeitet werden wie bei den weiteren ?

Was meint ihr ? Wie kann man die Zugriffzeiten tunen ? Habe den Poolsize vergrößert.

config.py:

Code: Alles auswählen

SQLALCHEMY_ENGINE_OPTIONS = {
        'pool_size': 20,
        'max_overflow': 10
    }
Über konstruktives (und nettes) Feedback wäre ich sehr froh :)
Benutzeravatar
sparrow
User
Beiträge: 4526
Registriert: Freitag 17. April 2009, 10:28

Messen statt vermuten, was das Problem ist.
Benutzeravatar
noisefloor
User
Beiträge: 4173
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

die Frage ist viel zu unspezifisch, weil da jede Menge angaben fehlen. Z.B. zur Hardware des Server, ob es ein dedizierter oder shared server ist, ob bei der realen Anwendungen wirklich mehrere Zugriffe gleichzeitig sind usw.

Gruß, noisefloor
PythonCodingFun
User
Beiträge: 67
Registriert: Mittwoch 22. September 2021, 14:01

sparrow hat geschrieben: Donnerstag 19. September 2024, 05:31 Messen statt vermuten, was das Problem ist.
Und was soll messen ? Zeit ?! Es dauert ja länger^^

Kannst Du das bitte weiter ausführen
PythonCodingFun
User
Beiträge: 67
Registriert: Mittwoch 22. September 2021, 14:01

noisefloor hat geschrieben: Donnerstag 19. September 2024, 10:00 Hallo,

die Frage ist viel zu unspezifisch, weil da jede Menge angaben fehlen. Z.B. zur Hardware des Server, ob es ein dedizierter oder shared server ist, ob bei der realen Anwendungen wirklich mehrere Zugriffe gleichzeitig sind usw.

Gruß, noisefloor
Das Problem habe ich auch mit einem RaspberryPI 4 der erste Zugriff dauert länger der zweite / dritte .. geht dann um so schneller
Sirius3
User
Beiträge: 18251
Registriert: Sonntag 21. Oktober 2012, 17:20

@PythonCodingFun: Du behauptest, Du hast ein System A, bei dem Abfragen schnell sind, und ein System B, bei dem sie langsam sind.
Dann mußt Du als erstes das Problem soweit zu reduzieren, dass Du ein minimales Programm hast, das auf System A schnell und auf B langsam ist.

Meine Kristallkugel sagt, dass Du auf Deinem Test-System mit einer warmen Datenbank arbeitest, in der alle Daten bereits in Caches liegen, und bei B mit einer kalten Datenbank startest, bei der erst alles geladen werden muß.
PythonCodingFun
User
Beiträge: 67
Registriert: Mittwoch 22. September 2021, 14:01

Sirius3 hat geschrieben: Donnerstag 19. September 2024, 15:10 @PythonCodingFun: Du behauptest, Du hast ein System A, bei dem Abfragen schnell sind, und ein System B, bei dem sie langsam sind.
Dann mußt Du als erstes das Problem soweit zu reduzieren, dass Du ein minimales Programm hast, das auf System A schnell und auf B langsam ist.

Meine Kristallkugel sagt, dass Du auf Deinem Test-System mit einer warmen Datenbank arbeitest, in der alle Daten bereits in Caches liegen, und bei B mit einer kalten Datenbank startest, bei der erst alles geladen werden muß.
Erst nach diversen weiteren Aufrufen wird es schneller, aber der erste aufruf nach Start der Webapp dauert ziemlich lange sowohl auf dem Server als auch RespberryPI. ich suche nach einer Lösung wie ich auch die erste aufrufe schneller machen kann so wie den 2,3,4,5 . Daher vermute ich das es vllt. am Connection-Pool liegt aber bin mir nicht sicher.

Nur halt nicht auf meiner System auf dem ich die Anwendung schriebe da geht es schneller und da spreche ich die Selbe Datenbank an.
Benutzeravatar
sparrow
User
Beiträge: 4526
Registriert: Freitag 17. April 2009, 10:28

Wie gesagt, dann musst du messen.
Es nützt ja nichts, wenn du wild am Connection Pool Parameter rum werkelst und nicht verstehst, was der macht.

PostgreSQL bietet Möglichkeiten, zu ermitteln, warum Abfragen lange dauern

Läuft did Datenbank dauerhaft oder ist das so ein Docker Compose Konstrukt, das die Datenbank beim deploy neu startet? Dann ist es der kalte Cache.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1222
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Hoffentlich ist die Datenbank nicht auf der SD-Karte. Es kann durchaus sein, dass die DB eine Ewigkeit benötigt, bis sie mal gestartet worden ist. Das könnte die Verzögerung verursachen.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
geraldfo
User
Beiträge: 73
Registriert: Samstag 28. Januar 2023, 20:19
Wohnort: Nähe Wien
Kontaktdaten:

Andere Möglichkeit: MySQL
Benutzeravatar
sparrow
User
Beiträge: 4526
Registriert: Freitag 17. April 2009, 10:28

@geraldfo: Ich sehe nicht, wie das helfen soll.
PythonCodingFun
User
Beiträge: 67
Registriert: Mittwoch 22. September 2021, 14:01

geraldfo hat geschrieben: Donnerstag 19. September 2024, 17:26 Andere Möglichkeit: MySQL
ähh nein
PythonCodingFun
User
Beiträge: 67
Registriert: Mittwoch 22. September 2021, 14:01

sparrow hat geschrieben: Donnerstag 19. September 2024, 16:45 Wie gesagt, dann musst du messen.
Es nützt ja nichts, wenn du wild am Connection Pool Parameter rum werkelst und nicht verstehst, was der macht.

PostgreSQL bietet Möglichkeiten, zu ermitteln, warum Abfragen lange dauern

Läuft did Datenbank dauerhaft oder ist das so ein Docker Compose Konstrukt, das die Datenbank beim deploy neu startet? Dann ist es der kalte Cache.
Ich nutze kein Docker o.ä Die Datenbank ist ganz klassich installiert auf einem FreeBSD

Ich weiß wofür der Connection Pool ist , nur ich suche Ansätze wie man sowas misst gibt es tools z.B ? Wenn ich keine Hilfe bräuchte würde ich nicht fragen, wenn das Problem (für mich) trivial wäre könnte ich eine KI fragen. :lol:

DeaD_EyE hat geschrieben: Donnerstag 19. September 2024, 17:00 Hoffentlich ist die Datenbank nicht auf der SD-Karte. Es kann durchaus sein, dass die DB eine Ewigkeit benötigt, bis sie mal gestartet worden ist. Das könnte die Verzögerung verursachen.
ne keine Sorge die DB ist auf einer SSD die keine drei Jahre alt ist. Aber ich habe eine Test DB auf einer SD-Karte und wenn ich diese anspreche dauert es auch nicht für länger wenn ich mit einer Person drauf zugreife aber der Effekt den ich lösen will ist in etwa der gleiche von der Dauer
Benutzeravatar
__blackjack__
User
Beiträge: 14000
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@PythonCodingFun: Simpelste Möglichkeit wäre es mal eine direkte Datenbankverbindung zu versuchen, ob das dann auch so lange dauert. Falls ja, liegt es nicht am Connection Pool.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
PythonCodingFun
User
Beiträge: 67
Registriert: Mittwoch 22. September 2021, 14:01

__blackjack__ hat geschrieben: Donnerstag 19. September 2024, 18:08 @PythonCodingFun: Simpelste Möglichkeit wäre es mal eine direkte Datenbankverbindung zu versuchen, ob das dann auch so lange dauert. Falls ja, liegt es nicht am Connection Pool.

ja stimmt via localhost meinst Du bestimmt, oder ?!

Code: Alles auswählen

app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://username:password@localhost/dbname'
BTW: Ein Phänomen ist mir eingefallen, wenn die Web-App dann "normal" schnell läuft, ist es so wenn es lange also ein paar Tage keine Anfrage getätigt wurde dauert es wieder länger und das "Problem" geht wieder von vorne los. Daher meine Vermutung. :?
Benutzeravatar
__blackjack__
User
Beiträge: 14000
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@PythonCodingFun: Nein, ich meine schon zu der gleichen Datenbank.

Die Beschreibung klingt entweder nach dem was schon beschrieben wurde, oder einem Netzwerkproblem, das da irgendwas in einen Timeout läuft.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
PythonCodingFun
User
Beiträge: 67
Registriert: Mittwoch 22. September 2021, 14:01

__blackjack__ hat geschrieben: Donnerstag 19. September 2024, 18:29 @PythonCodingFun: Nein, ich meine schon zu der gleichen Datenbank.

jetzt bin ich verwirrt :? , wie soll ich denn anders die DB (mit Flask-SQLAlchemy) ansprechen ? Also so ich ersetze die IP Adresse der DB mit localhost, denn sowohl die DB als auch die Web-App laufen auf dem gleichen Server.
Ist den der Initiale aufbau der Adresse nicht so ?

Code: Alles auswählen

postgresql://username:password@host:port/database_name
:?:
Benutzeravatar
sparrow
User
Beiträge: 4526
Registriert: Freitag 17. April 2009, 10:28

@PythonCodingFun: 'localhost' meint oft den lokalen Rechner. __blackjack__ wollte nur klar stellen, dass du dich schon zu der Datenbank verbinden musst, die du messen willst.

Bisher glaubst du aus irgend einem Grund, dass der Connection Pool Schuld an deinem Problem ist. Das kannst du aber nicht begründen, sondern "vermutest". Vermuten hat aber im Betrieb von Systemen nichts zu suchen. Man kann messen.

Also erster Schritt: Verbindung ohne Connection Pool um festzustellen, dass es daran nicht liegt.
Dann die Python-Welt verlassen und mit anderem Programm zur Datenbank verbinden (psql). Query absetzen. Verhalten messen (EXPLAIN ANALYZE). Überrascht sein, dass wahrscheinlich die Vermutung richtig ist, dass der Cache kalt ist.
Benutzeravatar
noisefloor
User
Beiträge: 4173
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Das Problem habe ich auch mit einem RaspberryPI 4 der erste Zugriff dauert länger der zweite / dritte .. geht dann um so schneller
Eigene Erfahrung: ich hatte mal eine (einfach) Django-Applikation im lokalen Netzwerk auf einem Raspi 1B laufen, woraus nur ab und an zugegriffen wurde. Der erste Aufruf einer Seite dauerte viel länger als die folgenden. Der Grund dafür wurde schon mehrfach hier im Thread genannte.

Und: mach' dich mal vom Connection Pooling frei. Es hat den Anschein, dass dein Fokus darauf dir den Blick auf's Gesamte verbaut und du dir dadurch selber im Weg stehst. Du hast auch immer noch nicht verraten, ob du wirklich so viele (parallele) Verbindungen aufbaust, dass das Connection Pooling überhaupt relevant wird.

Gruß, noisefloor
Benutzeravatar
DeaD_EyE
User
Beiträge: 1222
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Was pqsql betrifft, habe ich keine Ahnung. Ich weiß nur, dass ich bei Problemen mit MySQL/MariaDB die Tools mysql und mysqldump nutzen würde, um zumindest die Verbindung zu testen und queries abzusetzen.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten