Ich habe eine Situation, in der Folgendes stattfindet:
Wir sind auf Linode mit 8-Core, 8 GB RAM, 2,6 GHz - mit Nginx + PHP-Fpm - wir bekommen extrem hohe Diagramme der CPU-Auslastung (die wir nicht so ein schlechter VPS-Nachbar sein wollen) ...
Wir haben jeweils weniger als 100 Benutzer auf der Website - daher ist diese Situation auch unglaublich peinlich -, dass unsere CPU-Auslastung sehr hoch ist.
Wir verwenden ein sehr unbekanntes, möglicherweise CPU-intensives PHP-weises, fragwürdig schreckliches Framework anstelle von bekannten, gut dokumentierten, gut gestalteten anderen Frameworks wie WordPress oder Drupal, in denen es VIELE Dokumentation zum Caching (sowie Plugins) gibt die Caching behandeln) PHP auf einer Nginx + Php_Fpm-Plattform.
Wir haben also ungefähr 6 offene PHP-Fpm-Prozesse, die beim LAUFEN individuell GROSSE (30+ und oft fast 99%) Mengen an CPU verbrauchen - und ich habe nicht die geringste Ahnung, wie ich sie davon abhalten kann, so viel CPU zu verwenden . Ich kann nicht sagen, welche PHP-Skripte diese Spitzen verursachen, weil sie ständig auftreten ... normalerweise werden nur 1 oder 2 ausgeführt - aber wenn alle 6 ausgeführt werden, maximieren wir alle 8 CPUs.
Meine Datei pool.d / www.conf hat die folgenden Einstellungen:
pm = dynamic pm.max_children = 10 pm.start_servers = 4 pm.min_spare_servers = 2 pm.max_spare_servers = 6
Wir haben dieses Setup durchgeführt, weil unser Speicher in der Art und Weise, wie ich es interpretiere, tatsächlich erstaunlich ist (htop zeigt 472/7000 + mb verwendet, kein Tauschen usw.) und wir könnten viel mehr Prozesse handhaben und die Warteschlange abbrechen, die darauf wartet, sie zu bekommen verarbeitet - ABER leider, da jeder Prozess auf unserer CPU beim Ausführen zu intensiv ist, treiben wir am Ende unsere CPU durch das Dach - so dass wir nicht genug Prozesse verarbeiten können.
Die Frage - was um alles in der Welt können wir tun, um die CPU-Auslastung des Prozesses php-fpm zu reduzieren, damit wir die Einstellungen in dieser Pool-Conf-Datei für php-fpm erhöhen können - und auch ja, die Datei /var/log/php5-fpm.log schreit uns an, unsere Kinder zu vergrößern und unsere Min / Max / Start-Server anzupassen / zu erhöhen. Aber das macht unseren Lastdurchschnitt verrückt, wie bereits erwähnt. Wie können wir dies tun, ohne unbedingt einen Cache zu verwenden, oder welche Optionen haben wir?
Meine Idee? Ich habe Dinge über die Verwendung von cpulimit gelesen, um sicherzustellen, dass kein Prozess mehr als eine zugewiesene Menge an CPU benötigt - aber wird dies die Dinge verlangsamen, um unbrauchbar zu werden? Auf diese Weise könnten wir unsere Fähigkeit verbessern, mehr als ein paar Prozesse auszuführen - ich dachte auch, zwei Pools auszuführen - einen für unsere nach vorne gerichtete Website (was Kunden erleben) und einen für ein Backend (was sich auf unsere nach vorne gerichtete Website auswirkt, wenn es Zeit ist) -Verbrauchende Berichte werden ausgeführt).
Ich habe ein paar Tage damit verbracht, zu diesem Thema zu recherchieren, zu googeln usw. - und es ist schwierig, weil die Situation eines jeden so einzigartig für sein System ist - das Problem liegt in einem so spezifischen, unerhörten, möglicherweise schlecht geschriebenen Rahmen es ist schwer, eine Lösung zu finden. Wir können dieses Framework auch noch nicht einfach ausrangieren - ich muss eine Lösung finden.
UPDATE: Ich habe Memcache implementiert, um PHP-Sitzungen zu speichern. Da das Framework stark von Benutzersitzungen abhängt und die Art unseres Systems darin besteht, dass Mitarbeiter häufig mehrere Registerkarten gleichzeitig verwenden, wird jeweils auf die Sitzungen zurückgegriffen, um die Fähigkeiten / Benutzerdaten / etc. Zu bestätigen ... also hoffe ich auf eine gewisse Leistungssteigerung - bitte kommentieren Sie dies, wenn Sie möchten - ich werde sehen, wie es morgen läuft, wenn wir unsere Spitzenzeiten mit höherem Volumen überstehen.
Antworten:
Ein paar Dinge zu beachten (Entschuldigung im Voraus, wenn Sie diese bereits berücksichtigt haben): Stellen Sie zunächst sicher, dass Sie Ihre Nginx-Konfiguration optimieren und php-fpm nur dann aufrufen, wenn dies unbedingt erforderlich ist. Das Letzte, was Sie tun möchten, ist, PHP Dinge wie statische HTML-Seiten behandeln zu lassen (was es gerne tun wird).
Zweitens, da Sie php-fpm verwenden, schlage ich vor, aggressiver damit umzugehen, wie lange die Kinder von php-fpm leben dürfen. Sie müssen den Sweet Spot zwischen kurzlebigen Fäden / Kindern und Stabilität finden. Die PHP-Fpm-Standardeinstellungen sind meiner Meinung nach für jedes Produktionssystem viel zu großzügig. Je länger ein Mitarbeiter Anfragen bearbeiten darf, desto instabiler wird er. Es besteht auch ein höheres Risiko für Speicherlecks. Wenn dieses Framework, auf das Sie sich beziehen, Fehler wie Endlosschleifen aufweist, die Sie möglicherweise über die CPU-Auslastung beunruhigen, sollte dies nicht schaden.
Ich würde die Anzahl
pm.max_requests
für Ihre Produktionspools reduzieren . Ich denke, der Standardwert ist 200. Ich würde bei 50 anfangen und sehen, wohin Sie das führt.Andernfalls können Sie auch diese globalen Optionen ausprobieren (AFAIK, alle sind standardmäßig deaktiviert):
Was bedeutet das? Wenn 3 untergeordnete PHP-FPM-Prozesse innerhalb von 1 Minute mit SIGSEGV oder SIGBUS (dh Absturz) beendet werden, soll PHP-FPM automatisch neu gestartet werden. Der untergeordnete Prozess wartet 5 Sekunden auf eine Reaktion auf Signale vom Master.
Hier ist eine schöne Übersicht aller hier erwähnten Konfigurationsoptionen sowie anderer: http://myjeeva.com/php-fpm-configuration-101.html
Hoffe diese Tipps helfen dir! Denken Sie daran, zu optimieren und zu beobachten. Leider scheint es für all dies keine Faustregel zu geben. Wie Sie festgestellt haben, gibt es zu viele Variablen, die das Verhalten und die Stabilität von PHP beeinflussen.
Schließlich ist die CPU-Begrenzungsfunktion, nach der Sie gefragt haben , hier dokumentiert , aber ich würde nur dann darauf zurückgreifen, wenn Sie alle anderen Optionen ausschöpfen. Wenn Sie diesen Pfad wählen, würde ich auf jeden Fall auf mögliche Wechselwirkungen zwischen PHP-FPM-Optimierungen und Ihrer Limits.conf-Konfiguration achten. An diesem Punkt etckeeper kann ein Lebensretter sein! :) :)
Viel Glück!
Rouben
quelle
Sie führen Opcode-Caching aus, richtig?
Früher war es APC, das hier die erste Wahl war , aber es war schon eine ganze Weile ein Buggy-Teil und wurde von Zend Opcache abgelöst , das jetzt seit 5.5 Teil von PHP ist und einen Backport in PECL für 5.3 hat und 5.4.
quelle