Ich habe ein Forum mit vielen Besuchern, an manchen Tagen steigt die Last auf 40 ohne Erhöhung der Besucherzahl. Wie Sie der folgenden Ausgabe entnehmen können, ist die Wartezeit hoch (57%). wie finde ich den grund dafür?
Die Serversoftware ist Apache, MySQL und PHP.
root@server:~# top
top - 13:22:08 up 283 days, 22:06, 1 user, load average: 13.84, 24.75, 22.79
Tasks: 333 total, 1 running, 331 sleeping, 0 stopped, 1 zombie
Cpu(s): 20.6%us, 7.9%sy, 0.0%ni, 13.4%id, 57.1%wa, 0.1%hi, 0.9%si, 0.0%st
Mem: 4053180k total, 3868680k used, 184500k free, 136380k buffers
Swap: 9936160k total, 12144k used, 9924016k free, 2166552k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
23930 mysql 20 0 549m 122m 6580 S 90 3.1 4449:04 mysqld
17422 www-data 20 0 223m 20m 10m S 2 0.5 0:00.21 apache2
17555 www-data 20 0 222m 19m 9968 S 2 0.5 0:00.13 apache2
17264 www-data 20 0 225m 19m 8972 S 1 0.5 0:00.17 apache2
17251 www-data 20 0 220m 12m 4912 S 1 0.3 0:00.12 apache2
.
root@server:~# top
top - 13:39:59 up 283 days, 22:24, 1 user, load average: 6.66, 10.39, 13.95
Tasks: 318 total, 1 running, 317 sleeping, 0 stopped, 0 zombie
Cpu(s): 13.6%us, 4.2%sy, 0.0%ni, 40.5%id, 40.6%wa, 0.2%hi, 0.8%si, 0.0%st
Mem: 4053180k total, 4010992k used, 42188k free, 119544k buffers
Swap: 9936160k total, 12160k used, 9924000k free, 2290716k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
23930 mysql 20 0 549m 122m 6580 S 44 3.1 4457:30 mysqld
19946 www-data 20 0 223m 21m 10m S 5 0.6 0:00.77 apache2
17316 www-data 20 0 226m 23m 11m S 1 0.6 0:01.76 apache2
17333 www-data 20 0 222m 21m 11m S 1 0.5 0:01.55 apache2
18212 www-data 20 0 225m 22m 11m S 1 0.6 0:01.58 apache2
19528 www-data 20 0 220m 13m 5480 S 1 0.3 0:00.63 apache2
19600 www-data 20 0 224m 20m 11m S 1 0.5 0:00.73 apache2
19942 www-data 20 0 225m 21m 10m S 1 0.5 0:00.82 apache2
20232 www-data 20 0 222m 16m 8760 S 1 0.4 0:00.65 apache2
20243 www-data 20 0 223m 21m 11m S 1 0.5 0:00.57 apache2
20299 www-data 20 0 225m 20m 9m S 1 0.5 0:00.67 apache2
20441 www-data 20 0 225m 21m 10m S 1 0.5 0:00.57 apache2
21201 www-data 20 0 220m 12m 5148 S 1 0.3 0:00.19 apache2
21362 www-data 20 0 220m 12m 5032 S 1 0.3 0:00.17 apache2
21364 www-data 20 0 220m 12m 4916 S 1 0.3 0:00.14 apache2
21366 www-data 20 0 220m 12m 5124 S 1 0.3 0:00.22 apache2
21373 www-data 20 0 222m 14m 7060 S 1 0.4 0:00.26 apache2
Antworten:
Hier sind einige Tools zum Ermitteln der Festplattenaktivität:
iotop
vmstat 1
iostat 1
lsof
strace -e trace=open <application>
strace -e trace=open -p <pid>
In sehen
ps auxf
Sie auch, welche Prozesse sich im nicht interpretierbaren Disk Sleep (D
) befinden, da sie auf I / O warten.Sie können auch ein Backup erstellen und prüfen, ob die Festplatte langsam ausfällt. Eine Festplatte wird in der Regel langsamer, bevor sie verkommt. Dies könnte auch die hohe Belastung erklären.
quelle
Die Ausgabe von oben deutet darauf hin, dass das DBMS die meisten E / A-Wartezeiten durchläuft. Daher sind Datenbankoptimierungsprobleme ein naheliegender Untersuchungsgegenstand.
Das Warten von E / A auf einem Datenbankserver - insbesondere bei Lastspitzen - ist ein Hinweis darauf, dass Ihr DBMS entweder festplattengebunden ist (dh Sie benötigen ein schnelleres Festplattensubsystem) oder ein Optimierungsproblem aufweist. Sie sollten sich wahrscheinlich auch mit der Profilerstellung Ihres Datenbankservers befassen - dh Sie sollten einen Überblick darüber erhalten, was der Server tut und welche Abfragen die Zeit in Anspruch nehmen.
Einige Einstiegspunkte zur Diagnose von Datenbank-Optimierungsproblemen:
Suchen Sie die Abfragen, die die meiste Zeit in Anspruch nehmen, und sehen Sie sich die Abfragepläne an. Überprüfen Sie, ob ungewöhnliche Abfragepläne vorhanden sind, z. B. ein Tabellenscan, bei dem dies nicht der Fall sein sollte. Möglicherweise muss der Datenbank ein Index hinzugefügt werden.
Lange Wartezeiten für Ressourcen können bedeuten, dass einige Schlüsselressourcenpools erweitert werden müssen.
Lange E / A-Wartezeiten können bedeuten, dass Sie ein schnelleres Festplattensubsystem benötigen.
Befinden sich Ihre Protokoll- und Datenmengen auf separaten Laufwerken? Datenbankprotokolle weisen viele kleine sequenzielle Schreibvorgänge auf (im Wesentlichen verhalten sie sich wie ein Ringpuffer). Wenn Sie über eine ausgelastete Arbeitsauslastung mit wahlfreiem Zugriff verfügen, die dieselben Datenträger wie Ihre Protokolle gemeinsam nutzt, wirkt sich dies in erheblichem Maße auf den Durchsatz der Protokollierung aus. Damit eine Datenbanktransaktion ein Commit ausführt, müssen die Protokolleinträge auf die Festplatte geschrieben werden. Dies führt zu einem Engpass auf dem gesamten System.
Beachten Sie, dass einige MySQL-Speicher-Engines keine Protokolle verwenden, sodass dies in Ihrem Fall möglicherweise kein Problem darstellt.
Fußnote: Warteschlangensysteme
Warteschlangensysteme (ein statistisches Modell für den Durchsatz) werden hyperbolisch langsamer, wenn sich das System der Sättigung nähert. Für eine Annäherung auf hoher Ebene hat ein System, das zu 50% gesättigt ist, eine durchschnittliche Warteschlangenlänge von 2. Ein System, das zu 90% gesättigt ist, hat eine Warteschlangenlänge von 10, ein System, das zu 99% gesättigt ist, hat eine Warteschlangenlänge von 100.
Auf einem System, das der Sättigung nahe ist, können kleine Änderungen der Auslastung zu großen Änderungen der Wartezeiten führen, was sich in diesem Fall als Wartezeit für E / A manifestiert. Wenn die E / A-Kapazität Ihres Festplattensubsystems fast voll ist, können geringfügige Änderungen der Auslastung zu erheblichen Änderungen der Antwortzeiten führen.
quelle
Führen Sie
iotop
oder ausatop -dD
, um zu sehen, welche Prozesse io ausführen. Verwendenstrace
Sie, wenn Sie genauer hinsehen müssen.quelle
Auf beiden Bildschirmen sieht es sicher so aus, als ob "mysqld" dafür verantwortlich ist.
Sie müssen sehen, was dieser Daemon tut ... welche Abfragen laufen.
quelle
Was die Benutzer tun, kann genauso wichtig sein wie die Anzahl der tatsächlich vorhandenen Benutzer. Vorgänge wie das Durchsuchen des Forums sind anspruchsvoller als das bloße Laden und Anzeigen einzelner Threads oder Thread-Listen.
Außerdem: Laufen Sie auf einem dedizierten Server oder einem VPS? Befindet sich Ihr Dienst nicht auf einem dedizierten Server, haben die Aktionen von Apps, die auf demselben Host ausgeführt werden, Auswirkungen darauf, dass die VMs, mit denen Ihre VM einen Host teilt, um einen Anteil der E / A-Ressource konkurrieren.
Wie bereits erwähnt, können
iotop
Sie mithilfe von Tools wie genauer untersuchen, welche Aufgaben auf E / A-Antworten warten und auf welche Dateien gerade zugegriffen wird.quelle
Wie Flip sagt, scheint das Problem darin zu liegen, was mysql tut.
Etwa die Hälfte Ihres physischen Speichers wird derzeit für die E / A-Zwischenspeicherung verwendet. Die Forensoftware generiert in der Regel viele schnelle Abfragen, die eine geringe Anzahl von Zeilen mit stark verzerrten Festplattenbereichen zurückgeben So viel Wartezeit.
Ich sehe immer nur eine solche CPU- / Festplattenauslastung, wenn ich Abfragen ausführe, mit denen Millionen von Zeilen aktualisiert werden.
Der hohe Lastdurchschnitt ist eine direkte Folge der E / A.
Erhöhen Sie Ihre Mysql-Protokollierung, um festzustellen, ob fehlerhafter Code darin enthalten ist. Das Ändern von Indizes würde helfen. Das Analysieren Ihrer Tabellen kann hilfreich sein (aber wahrscheinlich nicht viel).
C.
quelle