Einstellen eines uWSGI

Django, Flask, Bottle, WSGI, CGI…
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Hallo,

gibt es eine Möglichkeit seinen uWSGI noch zu tunen, was Performance angeht?

Ich habe bislang das:

Code: Alles auswählen

[uwsgi]
module = run:app
master = true
processes = 1
workers = 4
http-socket = :1024
chmod-socket = 660
vacuum = true
Auf der Seite von Uberspace habe ich das gefunden:
Die darauf laufenden Hosting-Systeme sind Xen-/KVM-Instanzen, die wir zwischen den Knoten verschieben können, auch um z.B. bei Hardware-Reparaturen Downtimes zu minimieren. Je nach Ausstattung betreiben wir hier dann 1-2 Xen-/KVM-Instanzen auf einem Host bei älterer Hardware, die nur 16-48 GB RAM aufweist (da mustern wir die letzten Geräte derzeit aus); bei neuerer Hardware, die 96-128 GB RAM bereitstellt, in der Regel 3-4 Xen-/KVM-Instanzen. Virtualisierung dient hier vor allem als Mittel zur »Kapselung« der Systeme, um sie leichter auf andere physische Hardware migrieren zu können.
Multithreaded? Mehr Prozesse? Mehr Worker?

LG und danke.
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

was definierst du genau als "Performance"? uwsgi (bzw. WSGI-Server im allgemeinen) sind ja "nur" der Applikationsserver - die eigentliche Arbeit macht deine App.

Hast du ein konkretes Problem, dass du nicht genug pro Requests pro Sekunden beantwortet bekommst? Wenn ja, wie viele Requests pro Sekunde brauchst du, wie viele schaffst du aktuell?
Und wie lange braucht deine App für den Code, der zwischen Requests und Response liegt? Machst du irgendwas, was potentiell länger dauert wie DB-Abfrage, aufwendige Berechnung, API-Call einer andere webbasierten API?

Gruß, noisefloor
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Ich liefere glaube ich zu große Bilder aus. Bei einem request werden 75MB Bilder geliefert. Das dauert beim ersten Aufruf gefühlt ewig :D
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

75 MB Bilder? Das ist ziemlich heftig. Das dauert auch bei einer schnelle Anbindung ein paar Sekunden. Hat aber nichts mit uwsgi zu tun, sondern einer mit ... sagen wir mal ... einer Unzulänglichkeit im Design deiner Seite.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@naheliegend: Wie lieferst die Du denn aus? Daten ausliefern überlässt man üblicherweise dem Webserver.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

__blackjack__ hat geschrieben: Dienstag 19. Januar 2021, 19:22 @naheliegend: Wie lieferst die Du denn aus? Daten ausliefern überlässt man üblicherweise dem Webserver.
Das verstehe ich nicht. Die Bilder liegen im static folder und rendere sie dynamisch on the fly im template. Wollte nämlich einfach Bilder in den Ordner schieben und sie angezeigt bekommen.
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Und wer liefert den static-Ordner aus? Ist der Webserver so konfiguriert, dass das _nicht_ über deine App läuft?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@naheliegend: zur Erklärung - WSGI sieht nicht vor, dass „static content“ vom Applikationsserver mit ausgeliefert wird. Die Entwicklungsserver von Flask, Django und Co machen das, weil es beim Entwickeln einfacher ist. Produktiv nutzt man dafür aber (eigentlich) den Webserver, der Bilder, CSS, JS etc ausliefert.

Was man alternativ auch nutzen kann, ist White Noise. Das liefert dann statischen Content aus. Ich nutze das in Kombination mit Django (weil es auch richtig einfach ist, dass zu nutzen), aber das geht AFAIK auch mit Flask.

Gruß, noisefloor
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Ich verstehe das nicht. Ich habe meine files inklusive static folder und templates auf den Webserver geladen, dann uwsgi angeschmissen und nun läuft das so vor sich hin. Da muss ich erstmal google fragen, wie ich den Webserver dazu bringe die statics auszuliefern.
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Code: Alles auswählen

from app import app
from whitenoise import WhiteNoise

if __name__ == "__main__":
    WhiteNoise(app.run(host='0.0.0.0', debug=False), root='static/')
Reicht das, oder muss ich jeden Unterordner von static/ angeben?

Ordnerstruktur:

Code: Alles auswählen

app/
	static/
		images/
		templates/
		style.css
venv/
run.py			
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Nochmal eine Frage für das / mein Verständnis: wurden in deiner ursprünglichen Konfiguration bei Uberspace die Bilder angezeigt und es hat nur lange gedauert, die zu laden? Oder wurden die nicht angezeigt?

Gruß, noisefloor
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Als ich den uwsgi angeschmissen habe, wurden auch Bilder geladen. Aber halt langsam.

Aktuell habe ich noch nichts weiter geändert, weil ich Whitenoise nicht kenne.
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Wenn du 75MB an Bildern auf einer Seite hast ist das zwangsläufig langsam. Das sind halt mindestens 70MB zu viel. Wenn du darüberhinaus auch viele Bilder (>6 bei Chrome) hast, werden die nicht alle parallel geladen weil der Browser nur eine begrenzte Anzahl an Verbindungen zu einer einzelnen Domain hat.
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Ja, das habe ich ja auch schon eingesehen und bin dankbar für die Information, aber trotzdem würde mich die Geschichte mit dem Ausliefern von static files interessieren und wie man das konkret umsetzt. Ich bin mir unsicher im Umgang mit whitenoise und habe oben mein Beispiel gepostet, bzw. ob es so richtig ist?
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

du kannst Whitenoise nutzen - musst du aber nicht. In deinem Fall - daran hatte ich gestern auch nicht mehr gedacht - liegt die Sache ja bei Uberspace, d.h. du hast einen fertig konfigurieren Webspace, der statischen Content ausliefern kann. Du musst halt nur a) den Content dahin kopieren und b) deinen Templates den richtigen Pfad dahin geben.

Da Beispiel mit WhiteNoise kann via uwsgi so nicht funktionieren, weil uwsgi (bzw. jeder WSGI-Applikationsserver) ja "nur" das `app` Objekt importiert, d.h. der `if __name__ == 'main'` Zweig wird nie betreten. Das würde wenn nur funktionieren, wenn es lokal ohne Applikationsserver läuft. Aber die Doku zu WhiteNoise macht das etwas anders: http://whitenoise.evans.io/en/stable/flask.html

Gruß, noisefloor
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Okey, prima. Wo die static files hinmüssen habe ich in den docs nicht gefunden. Frage mal den Support.
Danke.
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Hallo,

mir ist noch nicht ganz klar, woher der Webserver weiß, welcher Teil von der Antwort auf einem request "dynamisch" und was "statisch" ist?

Also wenn ich in meinem Template ein paar Bilder in einer Schleife "dynamisch" rendere. Werden dann die Bilder statisch oder dynamisch ausgeliefert?

static liegt auf dem Webserver.

Code: Alles auswählen

        
 {% for image in images: %}
        <img src="{{ url_for('static', filename=image)}}"/>
 {% endfor %}
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du renderst keine Bilder. Du renderst HTML. Das URLs enthält. Und deren Pfad entscheidet, ob statisch oder dynamisch. Denn von dem hängt es doch ab, welcher Server die ausliefert.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
mir ist noch nicht ganz klar, woher der Webserver weiß, welcher Teil von der Antwort auf einem request "dynamisch" und was "statisch" ist?
Du hast immer noch ein Verständnisproblem mit WSGI bzw. wie das abläuft.

Der Server sieht nichts von der "Dynamik". Der Server liefert die Daten, die er bekommt. Ob die Daten von einer Template-Engine kommen, die die Dynamik enthält oder aus einer HTML / CSS / JS / PNG / JPG Datei, ist (dem Server) gleich. Dem Browser ist das auch gleich, solange das valides HTML/CSS/JavaScript ist bzw. valide Bild-Daten sind.

Der "Trick" bei WSGI ist ja, dass du eine Python-Funktion an eine URL bindest. Diese Funktion liefert dann die Daten. Statisch Inhalte sind nichts anderes als Dateien, die auf dem Server liegen und aus HTML heraus abgerufen werden, halt über die URL zur Datei.

Du könntest auch Bilder dynamisch liefern. Z.B. kann du eine URL an eine Funktion bindet, die dynamisch ein Diagramm mit z.B. Matplotlib zeichnet, dass dann als PNG zurück geliefert wird. Die Funktion muss "nur" sicherstellen, dass das eine valide PNG-Datei ist und du musst dich noch drum kümmern, dass die Header richtig gesetzt werden, damit der Browser das auch als PNG-Daten erkennt. Ein Beispiel hast du z.B. hier: https://stackoverflow.com/questions/507 ... b-in-flask.

Das heißt nicht, dass du deine Bilder so ausliefern sollst (wäre nämlich unnötig kompliziert!), sondern das _du_ als Programmierer der Applikation entscheidest, was dynamisch und was statisch ausgeliefert wird. Wo die statischen Dateien auf dem Server liegen kannst auch du entscheiden, du musst halt in den HTML-Dateien bzw. deinen Templates die URL richtig setzen.

Gruß, noisefloor
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Okey, danke.

Und in welchem Ordner die statics liegen konfiguriert dann der Admin?
Weil sonst könnte man ja auch einfach auf die App von draußen zugreifen, weil die ja physisch auch auf dem Webserver liegt, oder?
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Antworten