wa (Warten auf E / A) vom obersten Befehl ist groß

27

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
usef_ksa
quelle
2
Ist dies ein physischer Server (dediziert) oder ein VPS- oder Shared Hosting-Server? Das macht einen großen Unterschied.
Tom O'Connor
1
das ist gewidmet. Dieses Problem ist gelöst. Der Server hatte eine Menge Leseanforderungen für Bilder.
usef_ksa

Antworten:

33

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 auxfSie auch, welche Prozesse sich im nicht interpretierbaren Disk Sleep ( D) befinden, da sie auf I / O warten.

An manchen Tagen steigt die Last auf 40, ohne die Anzahl der Besucher zu erhöhen.

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.

vdboor
quelle
4

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.

Betroffen vonTunbridgeWells
quelle
2

Führen Sie iotopoder aus atop -dD, um zu sehen, welche Prozesse io ausführen. Verwenden straceSie, wenn Sie genauer hinsehen müssen.

Tobu
quelle
1

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.

Flip
quelle
1

An manchen Tagen steigt die Last auf 40, ohne die Anzahl der Besucher zu erhöhen.

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 iotopSie mithilfe von Tools wie genauer untersuchen, welche Aufgaben auf E / A-Antworten warten und auf welche Dateien gerade zugegriffen wird.

David Spillett
quelle
2
Es ist ein dedizierter Server. Ich beschließe, MySQL auf einem separaten Server laufen zu lassen. Die Serverauslastung ist jetzt in Ordnung. Ich werde die Tools wie iotop verwenden, um das Problem in Zukunft zu erkennen. Vielen Dank für euch alle.
usef_ksa
0

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.

symcbean
quelle