Prozess Killen mit hoher MEM-Auslastung per Cronjob
Prozess Killen mit hoher MEM-Auslastung per Cronjob
Hallo Leute,
wir haben derzeit ein Problem mit einer gehosteten Webseite, diese verursacht in irgenwelchen "Php-Skripten" etc.. eine sehr hohe IO Auslastung, sodass alles was auf diesem Server läuft extrem langsam wird.
Das Problem äußert sich wie folgt: Der RAM und die komplette SWAP wird aufgebraucht (16GB RAM, 8GB swap). Wir müssen dies Problem ersteinmal "eindämmen" und daher haben wir uns folgenden workaround überlegt.
Es ist immer der selbe Prozess "Apache" der das Problem verursacht.
Schießt man diesen Prozess manuell ab, dann ist das system erstmal wieder flott... bis erneut eine "Seite aufgerufen wird, die dieses Problem erneut" verursacht.
Ich hätte nun gerne eine Script welches folgendes tut:
1. Ausgabe von ApacheProzessen mit hoher Speicherauslastung zb. mehr als 300MB je Prozess
2. diese Prozesse "killen"
3. fertig
Das Skript lasse ich per cron jede Minute laufen.
parallel klonen wir den V-Server und versuchen das Problem nachzustellen und die Ursache zu beheben.
killscript.sh
ps aux | awk '{print $2, $4, $11}' | sort -k2rn | head -n 3 | grep apache
kill all
Fehler:
/root/killapacheload.sh: Zeile 2: kill: all: Die Argumente müssen Prozess- oder Jobbezeichnungen sein.
root@server~# nano /root/killapacheload.sh
ich hoffe Ihr könnt mir helfen;)
viele Grüße
wir haben derzeit ein Problem mit einer gehosteten Webseite, diese verursacht in irgenwelchen "Php-Skripten" etc.. eine sehr hohe IO Auslastung, sodass alles was auf diesem Server läuft extrem langsam wird.
Das Problem äußert sich wie folgt: Der RAM und die komplette SWAP wird aufgebraucht (16GB RAM, 8GB swap). Wir müssen dies Problem ersteinmal "eindämmen" und daher haben wir uns folgenden workaround überlegt.
Es ist immer der selbe Prozess "Apache" der das Problem verursacht.
Schießt man diesen Prozess manuell ab, dann ist das system erstmal wieder flott... bis erneut eine "Seite aufgerufen wird, die dieses Problem erneut" verursacht.
Ich hätte nun gerne eine Script welches folgendes tut:
1. Ausgabe von ApacheProzessen mit hoher Speicherauslastung zb. mehr als 300MB je Prozess
2. diese Prozesse "killen"
3. fertig
Das Skript lasse ich per cron jede Minute laufen.
parallel klonen wir den V-Server und versuchen das Problem nachzustellen und die Ursache zu beheben.
killscript.sh
ps aux | awk '{print $2, $4, $11}' | sort -k2rn | head -n 3 | grep apache
kill all
Fehler:
/root/killapacheload.sh: Zeile 2: kill: all: Die Argumente müssen Prozess- oder Jobbezeichnungen sein.
root@server~# nano /root/killapacheload.sh
ich hoffe Ihr könnt mir helfen;)
viele Grüße
-
- Beiträge: 2951
- Registriert: 24.12.2010 16:50:59
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Rheinland
Re: Prozess Killen mit hoher MEM-Auslastung per Cronjob
Macht es nicht mehr Sinn das Memory-Limit in der php.ini angemessen zu waehlen bzw. die Apache-Threads zu limitieren? Dein beschriebens Problem hoert sich nach einem schlecht konfigurierten Server an. Normalerweise multipliziert man mindestens die PHP-Instanzen mit der Anzahl der moeglichen Apache-Threads. Wenn das den vorhandenen Arbeitsspeicher uebersteigt, dann ist ein vorbei laufender Spider (Suchmaschine) in der Lage den Server mit beschriebenem Symptom lahm zu legen. Setzt man die Limits konservativer, dann werden neue herein kommende Verbindungen in einer Queue aufgenommen und lediglich spaeter beliefert. Man verhindert aber, dass der Server sich im Swap fest faehrt.
Re: Prozess Killen mit hoher MEM-Auslastung per Cronjob
Danke für deine Antwort,
Das haben wir auch schonmal testweise ausprobiert - leider ohne Erfolg.
Wie bereits erwähnt möchten wir die Anwendung in einem Virtualserver-Klon debuggen. (Im Klon haben wir keinen externen traffic und können gezielt und präzise nach dem Problem schauen, tests und Konfigurationsänderungen durchführen etc..) Derzeit monitore ich den Server und "schieße" die Prozesse per Hand ab;).
Das php-mermoy Limit liegt bei 30MB - es kann 80 Apache Threads geben - = 80*30 = 2400MB
viele Grüße
Das haben wir auch schonmal testweise ausprobiert - leider ohne Erfolg.
Wie bereits erwähnt möchten wir die Anwendung in einem Virtualserver-Klon debuggen. (Im Klon haben wir keinen externen traffic und können gezielt und präzise nach dem Problem schauen, tests und Konfigurationsänderungen durchführen etc..) Derzeit monitore ich den Server und "schieße" die Prozesse per Hand ab;).
Das php-mermoy Limit liegt bei 30MB - es kann 80 Apache Threads geben - = 80*30 = 2400MB
viele Grüße
-
- Beiträge: 2951
- Registriert: 24.12.2010 16:50:59
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Rheinland
Re: Prozess Killen mit hoher MEM-Auslastung per Cronjob
Um was fuer eine Apache-Variante handelt es sich und wie sieht der "Server-Pool Size Regulation"-Abschnitt der apache.conf aus?
Was genau fehlt dir fuer dein Skript?
Was genau fehlt dir fuer dein Skript?
Code: Alles auswählen
#!/bin/bash
PIDS=$(ps aux | awk '{print $2, $4, $11}' | sort -k2rn | head -n 3 | grep opera | cut -d" " -f1)
for PID in $PIDS
do
echo $PID
kill $PID
done
Re: Prozess Killen mit hoher MEM-Auslastung per Cronjob
danke für deine schnelle Antwort. Dein Script bringt mich weiter, werde es noch leicht modifizieren.
vielen Dank nochmals.
wir nutzen "prefork" das habe ich mit apach2ctl -l herausgefunden.
Vermutlich ist der Wert Max-RequestPerChild 0 nicht gerade ideal...
<IfModule mpm_prefork_module>
StartServers 20
MinSpareServers 20
MaxSpareServers 40
MaxClients 200
MaxRequestsPerChild 0
</IfModule>
vielen Dank nochmals.
wir nutzen "prefork" das habe ich mit apach2ctl -l herausgefunden.
Vermutlich ist der Wert Max-RequestPerChild 0 nicht gerade ideal...
<IfModule mpm_prefork_module>
StartServers 20
MinSpareServers 20
MaxSpareServers 40
MaxClients 200
MaxRequestsPerChild 0
</IfModule>
-
- Beiträge: 2951
- Registriert: 24.12.2010 16:50:59
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Rheinland
Re: Prozess Killen mit hoher MEM-Auslastung per Cronjob
PHP als Modul?
Code: Alles auswählen
dpkg -l | grep php5
Re: Prozess Killen mit hoher MEM-Auslastung per Cronjob
Hallo,
ii libapache2-mod-php5 5.3.3-7+squeeze17 server-side, HTML-embedded scripting language (Apache 2 module)
ii php5 5.3.3-7+squeeze17 server-side, HTML-embedded scripting language (metapackage)
ii php5-cli 5.3.3-7+squeeze17 command-line interpreter for the php5 scripting language
ii php5-common 5.3.3-7+squeeze17 Common files for packages built from the php5 source
ii php5-curl 5.3.3-7+squeeze17 CURL module for php5
ii php5-gd 5.3.3-7+squeeze17 GD module for php5
ii php5-imap 5.3.3-7+squeeze17 IMAP module for php5
ii php5-mcrypt 5.3.3-7+squeeze17 MCrypt module for php5
ii php5-mysql 5.3.3-7+squeeze17 MySQL module for php5
ii php5-suhosin 0.9.32.1-1 advanced protection module for php5
ii libapache2-mod-php5 5.3.3-7+squeeze17 server-side, HTML-embedded scripting language (Apache 2 module)
ii php5 5.3.3-7+squeeze17 server-side, HTML-embedded scripting language (metapackage)
ii php5-cli 5.3.3-7+squeeze17 command-line interpreter for the php5 scripting language
ii php5-common 5.3.3-7+squeeze17 Common files for packages built from the php5 source
ii php5-curl 5.3.3-7+squeeze17 CURL module for php5
ii php5-gd 5.3.3-7+squeeze17 GD module for php5
ii php5-imap 5.3.3-7+squeeze17 IMAP module for php5
ii php5-mcrypt 5.3.3-7+squeeze17 MCrypt module for php5
ii php5-mysql 5.3.3-7+squeeze17 MySQL module for php5
ii php5-suhosin 0.9.32.1-1 advanced protection module for php5
-
- Beiträge: 2951
- Registriert: 24.12.2010 16:50:59
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Rheinland
Re: Prozess Killen mit hoher MEM-Auslastung per Cronjob
Limitierend wirkt sich folgende Variable aus:
Das bedeutet, dass dein Apache max. 200 Threads zulaesst. Also mindestens 200 * 30MB (= 6GB) alloziert. Ein Memory-Limit von 128MB wuerde dir also den Hals brechen (Speicherverbrauch von 25.6GB). Nicht in dieser Rechnung sind moegliche (notwendige) MySQL-Threads. Der Memory-Footprint deine Apaches an sich uvm.
Code: Alles auswählen
MaxClients 200