PHP max_user_connections probléma

PHP max_user_connections probléma
2021-04-27T15:40:26+02:00
2021-04-29T14:52:36+02:00
2022-08-12T02:20:31+02:00
adee
Sziasztok!

Elég sokszor előforduló hiba az oldalon, miszerint a mysql túllépte a max_user_connections limitjét, ami jelen esetben 30. Az oldalról azt kell tudni, hogy egy webshop, sokan látogatják, sokan vásárolnak. A boltban is 10+ gépen nyitva az oldal adminisztrálásra, egy nagyobb szinkron is gyakran szokott futni, plusz még az aktuális oldalt böngésző felhasználók. Írtunk a szervereseknek, akik azt mondják, hogy ez egy globálisan állítható érték és elégnek kell lennie/jobban kell megírni a PHP kódot. A kódban levannak zárogatva a mysql kapcsolatok. Az adatbázis osztályban van __destruct metódus is, ami szintén zárja az adatbázis kapcsolatot. Nem tudom mi tévő lehetnék, szerintetek nem kevés ez a 30-as max_user_connections érték?
Mutasd a teljes hozzászólást!
Feltételezem, hogy nem azt csinálod, hogy
- bejön a request, elindul a PHP alkalmazás
- kell adat a DB-ből, kapcsolódik, lekérdez, disconnect
- megint kell adat a DB-ből, kapcsolódik, lekérdez, disconnect
- visszaadjuk a response-t.
Hanem ehelyett egyszer kapcsolódsz a legelején, és az a kapcsolat addig él, amíg ki nem szolgálod a requestet.

Kiindulva a PHP működéséből, ha bejön 30 request elég közel egymáshoz, a PHP interpreter 30-szor fut le, ezáltal 30-szor is fog kapcsolódni az adatbázishoz. Nem tudom, hogy a PHP optimalizál-e úgy, hogyha van éppen kiépítve kapcsolat az egyik instance által, és egy másik instance ugyanazokkal a paraméterekkel kapcsolódna, akkor a PHP nem épít ki újabb kapcsolatot, hanem megosztja az instance-ok között a resource-t - ha van ilyenre lehetőség, érdemes bekapcsolni.

Érdemes gondolkodni az adatok cache-elésén is, például Redisben - ha kell valamilyen adat, akkor inkább ne az adatbázist zargassuk, főleg, ha az adott adat bonyolult számítási folyamat eredménye.

Egyébként a MySQL doksijában 151-et mondanak arra, hogy ennyi az ideális max_connections érték:


If clients encounter Too many connections errors when attempting to connect to the mysqld server, all available connections are in use by other clients.

The permitted number of connections is controlled by the max_connections system variable. The default value is 151 to improve performance when MySQL is used with the Apache Web server. To support more connections, set max_connections to a larger value.

De egy ideális világban egy alkalmazás csak egy kapcsolatot tart fenn az adatbázissal, és ezért (is) előnyösek azok a környezetek, amik a PHP-val szemben long-running folyamatokként üzemeltetik a szervert - pl. ASP.NET Core, Spring FW, Node.JS stb. Bár nyilván nem áll fenn az a lehetőség, hogy újraírjuk nulláról az alkalmazást.
Mutasd a teljes hozzászólást!

  • Szia!

    Üzleti szoftverről (webshop) van szó, tehát gondoljátok át, mi éri meg jobban:
    a) elkezdeni átírni az alkalmazást, hogy megfeleljetek a 30-as limitnek,
    b) tárhely szolgáltatást/szolgáltatót váltani, ahol nagyobbak a limitek.

    A b) után még mindig belefoghattok az a) projektbe.
    Mutasd a teljes hozzászólást!
  • Csak át kell írni a kódot, hogy a lehető legkevesebb adatbázis kapcsolatot használja. Az esetek többségében inkább támaszkodjon valamilyen más adattárolási formára. De az is előfordulhat, hogy rosszul lett megírva a rendszeretek és egy oldalbetöltés is több kapcsolatot használ egyetlen kapcsolat helyett.
    Mutasd a teljes hozzászólást!
  • Igen, egy kapcsolat él az oldal elejétől kezdve az oldal végéig. Jelenleg készül a webshop új változata a régi 10+ éves kód helyett, de sajnos nagyon nehezen tudunk átállni rá különböző okok miatt, addig megpróbálom optimalizálni a folyamatokat a régin. Köszönöm a tartalmas választ és a többieknek is!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd