Session Handling via Datenbank defekt seit upgrade von 5.5.10 auf 5.6.4

Hallo shopware-Team,

 

wir haben seit dem upgrade von 5.5.10 auf 5.6.4 ein arges Problem mit den Sessions.

 

Die Datenbank blockiert für 50 Sekunden (default für lock-timeout), wenn die sessions aufgeräumt werden sollen (egal ob per cron oder per gc). Dann bricht es ab mit einem Fehler (siehe unten). Die Anzahl der Einträge scheint nicht relevant zu sein, hatte zum Schluss alles gelöscht aus der s_core_session was nicht in den letzten 10 Minuten editiert wurde (übrig blieben 1.800 Einträge) und es war dennoch nicht möglich die Sessions aufzuräumen. Selbst das umstellen via config.php auf aufräumen per cron scheint nicht einwandfrei zu gehen (session.gc_probability = 0). Trotz dieser Einstellung blockierte die Datenbank alle ~20 Sekunden um die Sessions zu löschen (via SHOW PROCESSLIST kontrolliert). Erst als ich gc_divisor auf 1.000.000 gestellt hatte, gab es keine Aufrufe mehr. Über eine lange Zeit habe ich heute in der Datenbank einfach per kill den Prozess „DELETE FROM s_core_session …“ nach spätestens 10 Sekunden Laufzeit gelöscht, um den shop zumindest einigermaßen am laufen zu halten. Mir schien es am Ende so, dass keine Transaktion offen sein darf (= aktiver Seitenaufruf auf der Webseite sein darf), da sonst es mit hoher Wahrscheinlichkeit zu einem dead-lock kommen kann. Sprich sw:session:cleanup bekommt kein lock, da eine andere Transaktion noch nicht beendet ist und ebenfalls ein INSERT INTO auf die s_core_session machen möchte (und dort ebenfalls wartet auf den lock). Was halt auffällt: mit 5.5.10 lief noch alle einwandfrei!

 

Uncaught PDOException: SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction in …

 

Randnotiz: Alle x male klappt das Aufräumen der Sessions allerdings innerhalb von 0,04 Sekunden.

 

Randnitiz 2: Selbst wenn keine Session gelöscht wird, (kontrolliert mit SELECT COUNT(*) FROM s_core_session) wird angezeigt, dass eine Session entfernt wurde (einfach mehrfach den cron hintereinander ausführen).

$ php bin/console sw:session:cleanup                                                                                                                
 [OK] Successfully removed 1 expired sessions                                                                           
                                          

 

SETUP:

Debian 9.12

PHP 7.3.15

MariaDB 10.3

Ich blicke nicht bei den Changelog durch, aber es gibt bereits 5.6.6. Welche SQL Server Version wird verwendet?

Ich habe das Setup nachgetragen.

 

Das Shopware 5.6.6 raus ist habe ich gesehen und die changelogs kontrolliert (ich habe nichts gefunden zu dem Thema session). Installieren werde ich das die Tage auch und dann auf Redis oder Memcache für die Session wechseln. Jetzt bestände noch die Möglichkeit diesen Bug zu tracen, sofern interesse daran seitens Shopware besteht.

Memcache würde ich nicht verwenden, nimm lieber Redis. Memcache führt häufig dazu, dass sporadisch die Sessions nur sehr langsam vergeben werden. Wurde hier damals als Issue dokumentiert bei Memcache: Session lock record with PHP 7.0.9 · Issue #269 · php-memcached-dev/php-memcached · GitHub

Glaube dein Problem wird aber nicht das Session-Handling sein. Shopware nutzt per Default ein Session Locking, wenn also mehrere Schreibzugriffe auf die Session stattfinden, kann das Locking greifen. Also scheinen bei dir die Zugriffe auf die Session ja zugenommen zu haben. Das kann verschiedenste Ursachen haben - natürlich auch im Core. Das Session Locking kannst du auch per config.php deaktivieren: config.php settings