Was tun, nachdem das gefürchtete Apache-Limit von maximal 256 Verbindungen erreicht wurde?

9

Nachdem ich mir am Kopf gekratzt hatte, um herauszufinden, warum meine Site so langsam reagierte, obwohl die Serverressourcen in Ordnung sind, überprüfte ich schließlich den Apache-Status und stellte fest:

78 requests/sec - 0.7 MB/second - 8.5 kB/request
256 requests currently being processed, 0 idle workers

Es scheint, dass mein Apache buchstäblich mit Verbindungen ausgelastet ist. Jeder, der versucht, meine Website zu besuchen, wird auf eine "Warteliste" gesetzt, bis Apache wieder frei ist.

Es scheint, ich habe zwei Möglichkeiten.

A) Erhöhen Sie das maximale Verbindungslimit über 256. Obwohl es laut diesem Artikel nicht so einfach ist:

Standardmäßig hat der MaxClients-Parameter ein kompiliertes Hard-Limit von 256. Dies kann jedoch durch erneutes Kompilieren von Apache geändert werden. Einige Distributionen oder Hosting-Unternehmen erhöhen diese Grenze auf einen sehr hohen Wert, z. B. 512 oder sogar 1024, um mit großen Lasten fertig zu werden.

B) Suchen Sie Skripte, die zu viel Zeit in Anspruch nehmen. Dies scheint mir viel schwieriger zu sein, da die meisten Apache-Prozesse nur erscheinen und dann wieder verschwinden. Außerdem sind die PHP-Skripte meiner Websites ziemlich gut optimiert ... und auch hier sind die Serverressourcen in Ordnung:

Server load 2.69 (8 CPUs)   
Memory Used 25.33% (2,039,108 of 8,048,804) 
Swap Used   1.32% (54,156 of 4,095,992)

Welche Option (wenn eine davon) sollte ich wählen und wie soll ich das tun?

BEARBEITEN

Weitere Informationen: Serverversion: Apache / 2.2.23 (Unix) mod_ssl / 2.2.23 OpenSSL / 1.0.0-fips DAV / 2 mod_auth_passthrough / 2.1 mod_bwlimited / 1.4 FrontPage / 5.0.2.2635

HTTP Conf: http://pastebin.com/yBeLt6mP

Beispiel für eine paritale Anfrage: http://pastebin.com/vzUVDMPR

Schalten Sie Text-Wrap um, wenn die Paste-Bins seltsam erscheinen.

kmoney12
quelle
Der Artikel, den Sie zitiert haben, ist ~ 6 Jahre alt. Softwareänderungen. Siehe Shane's Antwort.
Chris S
1
@ChrisS Noch weiter veraltet - das kompilierte Limit war eine 1.x-Sache (2.0 wurde 2002 veröffentlicht), und der Artikel verweist sogar explizit auf die 2.0-Dokumente.
Shane Madden

Antworten:

10

Dieser Artikel ist ungenau; MaxClientskann bei Verwendung des Prefork-MPM über 256 angehoben werden (was ich davon ausgehe, dass Sie es derzeit verwenden, basierend auf Ihrer Beschreibung des Problems). Aus der Dokumentation :

Für Server ohne Thread (dh Prefork) MaxClientsbedeutet dies die maximale Anzahl von untergeordneten Prozessen, die gestartet werden, um Anforderungen zu bedienen. Der Standardwert ist 256; Um es zu erhöhen, müssen Sie auch erhöhen ServerLimit.

ServerLimitist diejenige, die das hart kompilierte Limit hat, aber es ist weit über den Punkt hinaus, an den Sie jemals gelangen sollten, ohne dass Ihr Server auf einen anderen Engpass stößt. Dokumentation :

Es gibt eine feste Grenze für die ServerLimit 20000Kompilierung in den Server (für den Prefork MPM 200000). Dies soll böse Auswirkungen durch Tippfehler vermeiden.

Wenn Sie also Ihr Kundenlimit auf etwa 512 erhöhen möchten, dann:

MaxClients 512
ServerLimit 512

Sie sollten sich auch ansehen, welches MPM Sie verwenden, da andere MPMs als Prefork besser für die Skalierung geeignet sind. Sehen Sie hier für weitere Informationen.

Shane Madden
quelle
Ich sehe, dass core.c und worker.c ausgeführt werden httpd -l. Ich denke, das bedeutet, dass ich Worker MPM betreibe?
kmoney12
@hellohellosharp der Tat - in diesem Fall, werden Sie wollen möglicherweise Ihre anpassen MaxClients, ServerLimit, ThreadsPerChild, und ThreadLimit. Können Sie Ihre aktuelle Worker-Konfiguration von bereitstellen httpd.conf?
Shane Madden
Ja ... besteht die Gefahr, dies öffentlich zu veröffentlichen? Hoffentlich nicht, hier ist es: pastebin.com/yBeLt6mP
kmoney12
Nein, keine Probleme beim Posten der meisten httpd.conf-Dateien. Stellen Sie nur sicher, dass Sie keine seltsamen Kommentare wie Passwörter / Benutzernamen / etc. Haben. Diese schleichen sich manchmal auch in Proxy-Konfigurationsabschnitten und dergleichen ein. Viele Leute bearbeiten auch gerne IP- und Domain-Namen, nur damit sie nicht auffallen
Chris S
1
Das Statusmodul kann Ihnen diese Details anzeigen.
ETL
-1

Ich würde vorschlagen, dass Sie einen Reverse-Proxy verwenden, so etwas wie nginx oder lighttpd kann viel mehr Verbindungen als Apache verarbeiten. Abhängig davon, wie Ihre Websites htaccess verwenden, können Sie auch nginx / lighttpd mit fcgi verwenden und auf Apache vollständig verzichten.

Shoshomiga
quelle
4
Ja wirklich?? Er muss zwei Konfigurationszeilen hinzufügen httpd.confund Ihre Lösung besteht darin, den größten Teil der von ihm ausgeführten Software herauszureißen und zu ersetzen?! Jede Software hat ihre Probleme, aber ungebildeter Missbrauch verursacht schlimmere Probleme.
Chris S
Letztendlich kann nginx aktivere Verbindungen verarbeiten. Es liegt am OP, zu entscheiden, was verwendet werden soll. Ich habe nur meinen Vorschlag unterbreitet.
Shoshomiga