
Wenn ich mir die Ausgabe anschaue, top
stelle ich fest, dass zeitweise ein oder zwei Apache-Prozesse eine hohe CPU-Last verbrauchen - irgendwo zwischen 50% und 90%
Die Spitzen in der CPU-Auslastung kommen und gehen ziemlich schnell, etwa alle 10 Sekunden.
Es laufen verschiedene andere Apache-Prozesse, die zwischen 2% und 4% verbrauchen
Ich habe alle möglichen Möglichkeiten untersucht, um herauszufinden, welcher virtuelle Host/welche Website für diese Prozesse verantwortlich ist. Da sie jedoch schnell kommen und gehen, kann ich keine zuverlässige Methode dafür finden.
Ich habe es versucht lsof
und mir auch die Ausgabe angesehen, server-status
aber da die Prozesse nicht lange dauern, wird die Prozess-ID wiederverwendet und es ist nicht möglich, sie dem virtuellen Host zuzuordnen, der das Problem verursacht.
Wenn ich beispielsweise lsof
die fragliche Prozess-ID ausführe, werden ein Dutzend verschiedener Virtualhost-Protokolldateien aufgelistet, die diese Prozess-ID in den letzten Sekunden gemeinsam genutzt haben. Ich bin überzeugt, dass ein Virtualhost schuld ist, kann aber nicht herausfinden, welcher.
Ich habe auch das MySQL-Protokoll für langsame Abfragen geprüft und es hat nichts Interessantes ergeben.
Antwort1
Meine Empfehlung: Fügen Sie Ihren Protokollen eine Antwortzeit hinzu.
Dies ist nicht perfekt, da es keine Garantie dafür gibt, dass die Bearbeitung der Anfragen, die die Spitzen verursachen, länger dauert als die Bearbeitung anderer Anfragen. Es ist jedoch wahrscheinlich und bietet Ihnen einen Ausgangspunkt für die Untersuchung.
Dazu müssen Sie ein neues LogFormat und CustomLog definieren, das den Parameter %D enthält. Weitere Informationen finden Sie im Apachemod_log_config-Dokumentation.
Eine weitere Option, die wahrscheinlich etwas zu niedrig angesetzt ist, Ihnen aber einen Eindruck von der Art der Belastung vermitteln könnte, wäre, den übergeordneten Apache-Prozess mit -f zu überwachen, um untergeordnete Prozesse zu verfolgen, und mit -c, um die CPU-Zeit pro Aufruf anzuzeigen, z. B.strace -f -c -p <apache parent pid>
Sobald Sie wissen, welche Systemaufrufe am meisten Zeit beanspruchen, können Sie diese direkt verfolgen. Wenn der Server beispielsweise viel Zeit mit write() verbringt, können Sie dies tun strace -f -e trace=write -p <apache parent pid>
und sich diese Aufrufe genauer ansehen.