
Ich habe eine PHP-Datei, die sehr oft für eine Sitzungsprüfung einer externen Anwendung aufgerufen wird. Ich weiß nicht, wie viele Aufrufe es pro Sekunde gibt, aber ich schätze, es könnten 20-100 Aufrufe pro Sekunde sein.
Diese .php-Datei enthält jedoch eine SQL-Abfrage, die eine einzelne Zeile aktualisiert. Wenn ich diese Zeilen nicht auskommentiere, wird die gesamte Datenbank sehr langsam und mein Forum ist letztendlich nicht mehr erreichbar. Ich denke, es liegt an einem Serverproblem (zum Beispiel zu viele IOPS?). Leider weiß ich weder, wie ich den genauen Grund für die Verlangsamung herausfinden kann, noch wie ich feststellen kann, wie viele Aufrufe ich pro Sekunde für die PHP-Datei bekomme.
Dies ist die sehr einfache SQL-Abfrage (die Where-Klausel enthält nur den Primärschlüssel):
UPDATE bot_sessions SET ip_address = :ip_address, renewal_count = renewal_count + 1
WHERE username = :username AND session_token = :session_token
Also zwei Fragen:
- Wie kann ich herausfinden, wie oft meine spezielle PHP-Datei pro Sekunde aufgerufen wird?
- Wie kann ich den Grund dafür herausfinden, dass meine gesamte Datenbank langsamer wird, wenn ich diese Aktualisierungsabfrage verwende?
Antwort1
Sie sollten herausfinden können, wie oft eine bestimmte PHP-Datei aufgerufen wird, indem Sie die Webserver-Protokolle durchsuchen. Es gibt noch ein paar andere Hacks – zum Beispiel die Verwendung von Google Analytics (was weniger genau ist) oder das Aktualisieren einer Datei/eines Zählers (ressourcenintensiver).
Wie @ma.tome sagte, ist die Überwachung Ihrer Auslastung ein guter Ausgangspunkt und im Allgemeinen nützlich. Ein MySQL-Prozess, der zu 135 % ausgelastet ist, bedeutet, dass er mehr als 1 CPU nutzt. (Wenn Sie 4 CPUs haben, beträgt die Gesamtzahl 400 %). Wenn Sie vmstat ausführen, erhalten Sie IO-Informationen.
Eine weitere Möglichkeit wäre, die Abfragezeiten in Ihrer Datenbank zu protokollieren. Überprüfen Sie auch Ihre Indizes. Abhängig von Ihrer Anwendung können Sie die Leistung erheblich steigern, wenn Sie einen Index für den Benutzernamen in bot_sessions erstellen, falls dieser noch nicht indiziert ist. (Sie sind nicht sicher, ob der Benutzername oder das Sitzungstoken der von Ihnen angegebene Primärschlüssel ist. Vielleicht möchten Sie einen Index für den Schlüssel erstellen, der kein Primärschlüssel ist.) In jedem Fall enthält die Where-Klausel mehr als nur den Primärschlüssel.
Es kann auch sein, dass Ihrem System einfach der Arbeitsspeicher ausgeht. Überprüfen Sie, wie viel Swap Sie verwenden, und beheben Sie das Problem bei Bedarf mit mehr Arbeitsspeicher oder verringern Sie die vm.swappiness.