2016-06-07 2 views
3

Also ich habe diese Website mit Symfony3 und Doctrine entwickelt. Ich habe ein Hauptproblem hinsichtlich der Leistung mit MySQL und insbesondere der Anzahl der gleichzeitigen offenen Verbindungen.Öffnet Symfony3/Doctrine pro Besucher eine MySQL-Verbindung?

Zur Zeit sind ein bis fünf Benutzer online auf der Website. Was passiert, wenn, sagen wir, 1,500 Benutzer innerhalb von einer Minute verbinden? Behandelt Symfony3 oder Doctrine diese Art von Situationen? Wie kann ich sicher sein, dass die Website nicht mit dem Too many connections MySQL Fehler untergeht?

Und wenn ich gehe zu 5,000? Und 10,000? Der Server verfügt überRAM und einen 2.40Ghz Mono-Core-Prozessor, aber ich würde mir keine Sorgen um die Hardware machen, da ich mir mehr Sorgen um MySQL mache.

Diese Situationen sind bereits in der Vergangenheit passiert, aber ich habe die Website mit Wordpress und W3 Total Cache Plugin ausgeführt. Sollte ich überlegen, einen Cache-Manager wie memcached oder sonst?

Kurz gesagt, ich bin besorgt über die Website nicht verfügbar im Falle von plötzlichen hohen Verkehr (und dachte an die MysQL Too many connections Fehler in der ersten, aber ich könnte etwas noch wichtiger fehlt).

Vielen Dank, dass Sie mich auf dieser Seite ausgeleuchtet haben, da ich mir über Leistungsprobleme mit Symfony nicht im Klaren bin.

Antwort

5

Ich glaube, es öffnet eine Verbindung pro Besucher. Unabhängig davon, ob dies der Fall ist oder nicht, hat weder Symfony noch Doctrine ein Wundermittel, um jedes Last-/Verbindungsszenario zu bewältigen.

Warum verwenden Sie nicht ein Lasttest-Tool (es gibt viele) und sehen, wie es tatsächlich ausgeht? Nach meiner Erfahrung ist die Vorhersage eines Engpasses nutzlos, da sie immer dort auftauchen, wo Sie es am wenigsten erwarten.

Zum Beispiel ist das MySQL-Verbindungslimit nur ein Teil des Optimierungspuzzles. Es ist nicht gut, sich nur um Verbindungsbeschränkungen zu kümmern. Sie müssen so schnell und effizient wie möglich auf Webanfragen reagieren, um MySQL-Verbindungsressourcen (und andere Ressourcen, die Ihre App verwendet) freizugeben. Wenn Ihr Server also langsam ist, werden Ihnen die Verbindungen (oder eine andere Ressource) fast sofort unter erheblicher Last ausgehen, unabhängig von den Beschränkungen der MySQL-Verbindung.

Das gesagt, scheinen diese Server-Spezifikationen für 5-10k Benutzer pro Minute ein wenig niedrig. Ich würde nicht erwarten, dass eine solche Maschine mit dieser Art von Last ohne eine ernsthafte Optimierung/Caching/etc.

Die symfony performance page ist ein guter Starter, und es gibt auch eine gute article on caching - es gibt eine ton of available material zum Thema. Viel Glück! :)

+0

Nach Ihren Empfehlungen habe ich auf PHP7.0 aktualisiert und OpCache verwendet. Glaubst du, das wird genug sein? – D4V1D

+0

@ D4V1D - Ich kann das nicht für dich beantworten. Sie kennen die Anforderungen Ihrer Website am besten, sodass Sie sie mit einem geeigneten Lasttest-Tool testen müssen. Wenn es die Anforderungen nicht erfüllt, ist mehr Optimierung erforderlich. – Richard

+0

In der Tat, ich habe gerade ein paar Tests mit [HTTPerf] (https://github.com/httperf/httperf) ausgeführt. Ich habe 5.000 HTTP Anfragen simuliert, hier sind die Ergebnisse: 'Verbindungsrate: 8.9 conn/s (112.0 ms/conn, <= 1 gleichzeitige Verbindungen)'/'Verbindungszeit [ms]: min 96.4 durchschnittlich 112.0 max 324.7 median 111.5 stddev 6.8 '/' Antwortstatus: 1xx = 0 2xx = 5000 3xx = 0 4xx = 0 5xx = 0'. Die Tests dauerten "560.190 s". Ich denke, das sind gute Neuigkeiten. – D4V1D

0

Wenn Sie php-fpm verwenden, hängt es von pm.max_children in fpm/pool.d/www.conf ab.

pm.max_children bezieht sich auf die maximale Anzahl gleichzeitiger PHP-FPM-Prozesse, die in einem solchen Pool zulässig sind. Wenn das Volumen eingehender Anforderungen die Erstellung von mehr PHP-FPM-Prozessen erfordert als die Anzahl, die durch das Limit max_children zulässig ist, werden diese zusätzlichen Anforderungen in einer Warteschlange zurückgestellt, um auf den Dienst zu warten.

Also wenn pm.max_children> max_connections (my.cnf) und aktive Benutzer> max_connections erhalten Sie "Zu viele Verbindungen".