Rolf B: PHP bzw. Apache mehr Leistung geben

Beitrag lesen

Hallo T-Rex,

wieviele Kerne hat deine CPU? Deine CPU hat 8 Kerne, schriebst Du.

Nennst Du uns die Gesamtbelastung der CPU, oder die von einem Kern?

Bei einer 8-Kern CPU wäre die maximale Auslastung eines Kerns, plus etwas OS-Overhead, gerade die 15% Gesamtlast. Und PHP ist single threaded, d.h. es kann die Arbeit nicht auf mehrere Kerne verteilen. Dafür brauchst Du eigene Arbeits-Threads, und das ist eine ganz andere Form der Programmierung. Es gibt die pthreads-Erweiterung in PHP, aber die gilt als tot. Der Nachfolger pht ist für PHP 7.2 - ausschließlich. Vielleicht findet man bei PECL noch andere.

Ein anderer Bremsfaktor kann zu wenig Speicher sein, aber das wird auf deinem Gaming Notebook wohl nicht gelten. Du kannst das im Taskmanager prüfen - wie verhalten sich während der Rechnung die Seitenfehler für den PHP Prozess? Bzw. für Apache falls Du mod_php verwendest?

Wenn deine Berechnungen zwischendurch Festplatten- oder Datenbankzugriffe brauchen, ist das ein weiterer limitierender Faktor. Du kannst dann versuchen, die Daten vorher en bloc in den Speicher zu lesen, das mag schneller sein als sie zwischendurch einzeln zu holen.

Und natürlich gilt immer, dass die beste Optimierung nichts nützt, wenn der Algorithmus schlecht ist. Aber das können wir von hier aus nicht beurteilen.

Für handgemachte Parallelverarbeitung: Hast Du genug Speicher? Wie lange laufen Deine Berechnungen? Wie gut lassen sie sich in unabhängige Großblöcke verteilen? Wenn sie lange brauchen und sich große, unabhängige Teilbereiche bilden lassen, könntest Du die Arbeitsdaten in eine Datei schreiben, einen separaten PHP Prozess starten der sie verarbeitet und das Ergebnis in eine andere Datei stellt, und das wieder einlesen. Wie gesagt: das lohnt nur bei VIEL Laufzeit, und Du brauchst genug RAM für die Zusatzprozesse. Statt Dateien kannst Du auch mit Shared Memory arbeiten, dafür brauchst Du aber ein speziell compiliertes PHP und es geht nur unter Linux. Es gibt auch das Konzept der "Named Pipes" um Daten von einem Prozess zum anderen zu bekommen, aber das hab ich noch nicht gemacht und müsste erst recherchieren.

Eine weitere Alternative ist, mehrere PHP Prozesse (so viele, wie Du Kerne übrig hast) mit der -S Option zu starten, jeder auf einem eigenen Port, und die Teilberechnungen per HTTP Request an sie zu verteilen. Auf einem öffentlichen Webserver klappt das natürlich nicht so einfach…

Für das Management von Workern kann auch der FastCGI Manager helfen, aber das ist, glaub ich, ein Monster für sich.

Rolf

--
sumpsi - posui - obstruxi