Seit Update auf 5.4 jeden Tag Datenbankfehler

  • Affected Version
    WoltLab Suite 5.4

    Hallo,

    seit dem Update auf 5.4 bekommen wir jeden Tag den Fehler, dass angeblich zu viele Benutzer gleichzeitig Datenbankverbindungen haben. Immer ist das gleiche Plugin der Auslöser der Fehlermeldungen. Wir haben einen eigenen Dedicated Server L-16 SSD

    Server bei Ionos, welcher vorher noch nie Probleme gemacht hat.


    Requested URL
    GET /easymedia/image-include/4918-raven/?random=0&maxWidth=0&embedded=0&thumbnail=tiny
    Referrer
    https://www.das-schaeferhund-forum.de/easymedia/album-list/
    Error Message
    Connecting to MySQL server 'db500xxxxx.hosting-data.io' failed
    Type
    wcf\system\database\exception\DatabaseException
    File (Line)
    /homepages/20/d92226146/htdocs/dsh/wcf/lib/system/database/MySQLDatabase.class.php (67)
    Stacktrace
    1. /homepages/20/d92226146/htdocs/dsh/wcf/lib/system/database/Database.class.php (142): wcf\system\database\MySQLDatabase->connect(…)
    2. /homepages/20/d92226146/htdocs/dsh/wcf/lib/system/WCF.class.php (360): wcf\system\database\Database->__construct(…)
    3. /homepages/20/d92226146/htdocs/dsh/wcf/lib/system/WCF.class.php (181): wcf\system\WCF->initDB(…)
    4. /homepages/20/d92226146/htdocs/dsh/wcf/global.php (15): wcf\system\WCF->__construct(…)
    5. /homepages/20/d92226146/htdocs/dsh/easymedia/global.php (13): require_once(…)
    6. /homepages/20/d92226146/htdocs/dsh/easymedia/index.php (9): require_once(…)
    Error Message
    SQLSTATE[HY000] [1203] User o2xxxxx already has more than 'max_user_connections' active connections
    Type
    PDOException
    File (Line)
    /homepages/20/d92226146/htdocs/dsh/wcf/lib/system/database/MySQLDatabase.class.php (50)
    Stacktrace
    1. /homepages/20/d92226146/htdocs/dsh/wcf/lib/system/database/MySQLDatabase.class.php (50): PDO->__construct(…)
    2. /homepages/20/d92226146/htdocs/dsh/wcf/lib/system/database/Database.class.php (142): wcf\system\database\MySQLDatabase->connect(…)
    3. /homepages/20/d92226146/htdocs/dsh/wcf/lib/system/WCF.class.php (360): wcf\system\database\Database->__construct(…)
    4. /homepages/20/d92226146/htdocs/dsh/wcf/lib/system/WCF.class.php (181): wcf\system\WCF->initDB(…)
    5. /homepages/20/d92226146/htdocs/dsh/wcf/global.php (15): wcf\system\WCF->__construct(…)
    6. /homepages/20/d92226146/htdocs/dsh/easymedia/global.php (13): require_once(…)
    7. /homepages/20/d92226146/htdocs/dsh/easymedia/index.php (9): require_once(…)
  • Aber bei beiden Foren kommt der Fehler erst seit dem Update. Eventuell werden manche Verbindungen nicht mehr geschlossen? Das kann kein Zufall sein.

  • Ich denke ich habe den Fehler jetzt. Vor dem Update hatte ich MysQl 5.5 mit 200 max_user_connections. Jetzt mit Mysql 5.7 sind es nur noch 18, welche IONOS zulässt.

    • Official Post

    Es gibt allgemein ein ziemliches Missverständnis darüber, wie max_user_connections funktioniert und wie es skaliert.


    Jede Anfrage an das Forum verwendet eine Datenbank-Verbindung. Am Ende der Anfrage wird die Verbindung immer getrennt. Das "zu vergessen" ist technisch unmöglich, weil PHP selbst die Verbindung trennt.


    Wenn eine Anfrage innerhalb von z. B. 100ms von PHP verarbeitet wird, dann wird nur für diesen Zeitraum auch die MySQL-Verbindung genutzt und dann wieder freigegeben. Je mehr PHP-Prozesse parallel laufen, desto mehr Anfragen kann PHP zum gleichen Zeitpunkt verarbeiten. Daraus ergibt sich eine 1:1 Relation zwischen der Anzahl an PHP-Prozessen (genauer den PHP-Workern) und der theoretisch maximalen Anzahl an gleichzeitigen Datenbankverbindungen.


    Wenn also maximal 10 PHP-Worker verfügbar sind, dann kann PHP (bei 1 Datenbankverbindung pro Anfrage wie bei unserer Software) maximal 10 Datenbankverbindungen gleichzeitig öffnen. Wenn man also maximal 18 gleichzeitige Datenbankverbindungen (max_user_connections) erlaubt, aber zum Beispiel 20 parallele PHP-Anfragen erlaubt, dann ist das Chaos bereits vorprogrammiert.


    Das Problem kann man als Anbieter ganz einfach lösen, in dem man nicht mehr parallele PHP-Anfragen erlaubt, als das Limit der Datenbank hergibt.



    Nachtrag:

    Was passiert, wenn man mehr parallele Anfragen hat, als von PHP verarbeitet werden können? Üblicherweise konfiguriert man den Webserver so, dass diese Anfragen in einer Warteschlange landen, so dass auf den nächsten freien "Platz" gewartet wird.


    Wenn wir also die obigen 100ms pro Anfrage als Beispiel verwenden, so können bei 10 PHP-Workern insgesamt 100 Anfragen pro Sekunde verarbeitet werden.

  • Aber den Sprung von 200 bei Mysql 5.5 und 18 bei Mysql 5.7. finde ich dann schon recht groß. Scheint ja trotzdem Probleme zu geben, sonst hätten wir im Forum seit Mysql 5.7. nicht diese Fehlermeldungen. Oder kann es sein, dass eventuell ein fehlerhafter Code die Anfragen nicht ordnungsgemäß trennt?

  • Aber den Sprung von 200 bei Mysql 5.5 und 18 bei Mysql 5.7. finde ich dann schon recht groß. Scheint ja trotzdem Probleme zu geben, sonst hätten wir im Forum seit Mysql 5.7. nicht diese Fehlermeldungen. Oder kann es sein, dass eventuell ein fehlerhafter Code die Anfragen nicht ordnungsgemäß trennt?

    Wie Alexander schon schrieb, trennt PHP von sich aus die Verbindung ja, außer man "hält" diese mit Absicht offen.

    Projekte:

    XIVDATA - Eorzea Database


    A red dragon falls from the heavens... Ah, that memory has been lost. A shame. It was a favorite of mine...


    • Official Post

    Oder kann es sein, dass eventuell ein fehlerhafter Code die Anfragen nicht ordnungsgemäß trennt?

    Ich verweise auf diesen Teil in meiner Erklärung:

    Jede Anfrage an das Forum verwendet eine Datenbank-Verbindung. Am Ende der Anfrage wird die Verbindung immer getrennt. Das "zu vergessen" ist technisch unmöglich, weil PHP selbst die Verbindung trennt.


    Edit:

    Wie Alexander schon schrieb, trennt PHP von sich aus die Verbindung ja, außer man "hält" diese mit Absicht offen.

    Das ist nur bei persistenten Verbindungen der Fall und die funktionieren (a) anders und (b) nutzten wir die grundsätzlich nicht.

  • Ok, weil der vom IONOS Support so etwas meinte, dass eventuell Plugins fehlerhaft wären. Also liegt der Fehler bei der Konfiguration von IONOS, wenn es keine Warteschlange gibt, sondern der Server die Fehlermeldungen raushaut?

  • Bis jetzt sind es heute 12 Fehlermeldungen, welche aber wie immer alle von der Galerie ausgelöst werden.


    Requested URL
    GET /easymedia/image-include/4864-django/?random=0&maxWidth=0&embedded=0&thumbnail=tiny
    Referrer
    https://www.das-schaeferhund-forum.de/easymedia/album-list/
    Error Message
    Connecting to MySQL server 'db5xxxx.hosting-data.io' failed
    Type
    wcf\system\database\exception\DatabaseException
    File (Line)
    /homepages/20/d9xxxx/htdocs/dsh/wcf/lib/system/database/MySQLDatabase.class.php (67)
    Stacktrace
    1. /homepages/20/d92226146/htdocs/dsh/wcf/lib/system/database/Database.class.php (142): wcf\system\database\MySQLDatabase->connect(…)
    2. /homepages/20/d92226146/htdocs/dsh/wcf/lib/system/WCF.class.php (360): wcf\system\database\Database->__construct(…)
    3. /homepages/20/d92226146/htdocs/dsh/wcf/lib/system/WCF.class.php (181): wcf\system\WCF->initDB(…)
    4. /homepages/20/d92226146/htdocs/dsh/wcf/global.php (15): wcf\system\WCF->__construct(…)
    5. /homepages/20/d92226146/htdocs/dsh/easymedia/global.php (13): require_once(…)
    6. /homepages/20/d92226146/htdocs/dsh/easymedia/index.php (9): require_once(…)
    Error Message
    SQLSTATE[HY000] [1203] User oxxxx already has more than 'max_user_connections' active connections
    Type
    PDOException
    File (Line)
    /homepages/20/d92226146/htdocs/dsh/wcf/lib/system/database/MySQLDatabase.class.php (50)
    Stacktrace
    1. /homepages/20/d92226146/htdocs/dsh/wcf/lib/system/database/MySQLDatabase.class.php (50): PDO->__construct(…)
    2. /homepages/20/d92226146/htdocs/dsh/wcf/lib/system/database/Database.class.php (142): wcf\system\database\MySQLDatabase->connect(…)
    3. /homepages/20/d92226146/htdocs/dsh/wcf/lib/system/WCF.class.php (360): wcf\system\database\Database->__construct(…)
    4. /homepages/20/d92226146/htdocs/dsh/wcf/lib/system/WCF.class.php (181): wcf\system\WCF->initDB(…)
    5. /homepages/20/d92226146/htdocs/dsh/wcf/global.php (15): wcf\system\WCF->__construct(…)
    6. /homepages/20/d92226146/htdocs/dsh/easymedia/global.php (13): require_once(…)
    7. /homepages/20/d92226146/htdocs/dsh/easymedia/index.php (9): require_once(…)