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.