Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
Resourcenhungrige Apache-Prozesse im Hintergrund laufen lassen

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Netzwerk
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
abjetztneu



Anmeldungsdatum: 14.08.2006
Beiträge: 7

BeitragVerfasst am: 14. Aug 2006 11:05   Titel: Resourcenhungrige Apache-Prozesse im Hintergrund laufen lassen

Ich habe einen Apache laufen, der Webserver für mehrere Internetseiten ist. Nun soll dort zusätzlich mittels system(..)-Aufruf in einer php-Seite, die als http-cronjob regelmäßig aufgerufen wird, lokale, sehr rechenintensive Encodierungsprozesse gestartet werden.
Das Problem ist, dass jedes mal wenn das Encoding im Gange ist, die Webserveraktivität dadurch komplett blockiert wird, d.h. es werden keine anderen Webserveraktivitäten, wie Seiten ausliefern, etc. ausgeführt, solange der Encoding-Prozess nicht beendet ist.

Gibt es eine Möglichkeit, diese rechenintensiven Prozesse von den Webserveraktivitäten abzukoppeln (und evtl. auch aus der normalen Skript-Laufzeitbegrenzung auszunehmen?) bzw. die Priorität des Prozesses enorm zu "erniedrigen"?

Was ich bereits versucht habe, ist "nice" vor den encodierungsbefehl zu schreiben. Das hat jedoch die performance-blockade leider nicht beseitigt.

ich bin über jede Idee sehr dankbar!

Grüße,
Bernd
 
Benutzer-Profile anzeigen Private Nachricht senden

petameta
prolinux-forum-admin


Anmeldungsdatum: 14.02.2003
Beiträge: 1294

BeitragVerfasst am: 14. Aug 2006 12:11   Titel:

Welchen Nice-Wert hast Du denn benutzt ? Eigentlich sollte das klappen.
 
Benutzer-Profile anzeigen Private Nachricht senden

klopskuchen
prolinux-forum-admin


Anmeldungsdatum: 26.06.2004
Beiträge: 1444

BeitragVerfasst am: 14. Aug 2006 12:24   Titel:

> http-cronjob
Wasn dat?

Da der offensichtlich keine Interaktion benötigt (sonst wär es kein cronjob?), kannst du die Informationen die du aus der Serverumgebung brauchst in eine Datei schreiben lassen und ein richtiger Cronjob holt sich die wenn die Zeit ran ist.

Hier ein Auszug aus dem php.net-Manual:
"Die system() Funktionsaufrufe versuchen übrigens automatisch nach jeder Ausgabezeile den Ausgabebuffer des Webservers zu flushen, wenn PHP als Servermodul läuft"
Ziemlicher Müll also.
Da bist du wahrscheinlich mit einem cgi-script und dessen suexec() schneller und besser bedient. Oder wie oben beschrieben völlig trennen und Daten über eine Datei austauschen.


MfG, Klopskuchen
_________________
When all else fails, read the instructions .
 
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen

abjetztneu



Anmeldungsdatum: 14.08.2006
Beiträge: 7

BeitragVerfasst am: 14. Aug 2006 12:42   Titel:

Zitat:
Da bist du wahrscheinlich mit einem cgi-script und dessen suexec() schneller und besser bedient.

Mit cgi-scripts kenne ich mich leider gar nicht aus. Könnte es aber entsprechen auch eine Lösung sein, im php-script die Encodingaufrufe mittles exec(...) anstelle von system(...) aufzurufen?

Zitat:
> http-cronjob
Wasn dat?

ich meinte damit einen cronjob, der in bestimmten abständen eine .php datei, die auf dem webserver liegt als "normalen" Seitenaufruf anfordert. Hmm.. alernativ könnte ich die .php datei allerdings auch direkt per php befehl auf der kommandozeile aufrufen, hab ich nur noch nie probiert. Vielleicht ermöglicht das, dass der Prozess auch noch webserver-aktivitäten zulässt?

Zitat:
Welchen Nice-Wert hast Du denn benutzt ?

Ich hatte nichts angegeben. Laut manpage gilt dann der defaultwert 10. Ist das ok?
 
Benutzer-Profile anzeigen Private Nachricht senden

klopskuchen
prolinux-forum-admin


Anmeldungsdatum: 26.06.2004
Beiträge: 1444

BeitragVerfasst am: 14. Aug 2006 13:15   Titel:

Zitat:
Könnte es aber entsprechen auch eine Lösung sein, im php-script die Encodingaufrufe mittles exec(...) anstelle von system(...) aufzurufen?

Du kannst innerhalb der Funktionsaufrufe die Ausgabe umleiten. Bei system('while [ TRUE ]; do echo bla >/dev/null; done', $ret); startest du eine Endlosschleife, in der die Ausgabe nach /dev/null geschickt wird und so phps read() (und flush) entfällt, was den Anteil der serverseitigen Last ausmacht. Allerdings bekommt die Funktion dann gar keine Ausgabe mehr.
Bei einem cgi-script schreibst du dein Zeug einfach als normalen php-code in eine Datei, steckst sie ins Verzeichnis das in der httpd.conf als cgi-dir angegeben ist und startest das ganze wie gewohnt. Nur das du den Pfad relativ zum cgi-dir angibst. Dann wird mit fork() ein eigener Prozess gestartet, der sich bei Beendigung zurückmeldet.
Aber warum blockiert der Server? Du startest das script doch nur einmal, oder? Der Server erstellt sich selbst neue Kindsprozesse, wenn sie ihm auszugehen drohen.


MfG, Klopskuchen
_________________
When all else fails, read the instructions .
 
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Netzwerk Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy