Bekijk Volledige Versie : Apache crasht regelmatig
nielsvroegin
23/10/07, 16:21
Hallo,
Sinds enkele dagen gebeurd het regelmatig dat apache crasht, of dat het veel te lang duurt om een website op te vragen.
In de error_log komt de volgende melding erg vaak voor:
[warn] child process XXXXX still did not exit, sending a SIGTERM
Soms komt bovenstaande melding ook als een error(ipv warning) voor.
Een andere opvallende error is:
[error] server reached MaxClients setting, consider raising the MaxClients setting
Na aanleiding van deze error heb ik MaxClients verhoogd. Dit lijkt niet echt veel te helpen, hoewel er geen crash meer is geweest.
Na een crash krijgen we apache niet meer met apachectl restart of apachectl start gestart. Wel werkt die weer naar een volledige reboot van de server.
Ook is de load van de server erg hoog, tijdens zo'n voorval(10 tot 20), dit lijkt voornamelijk te komen door httpd processen.
Heeft iemand een idee hoe ik dit probleem eventueel kan oplossen?
Server: Linux Fedora 2 met Plesk 8 en Apache 2.0.51
je maxclients is ook afhankelijk van je totale maxclientsperchild etc, kijk even in de apache documentatie hoe dit te verhelpen is.
verder doe je er denk ik goed aan even je apache opnieuw te compilen met andere wachttijden, want de error die daar staat betekend dat je child processen niet goed afsluiten of iig niet snel genoeg, kijk ook even goed naar welke apache fork je gebruikt, vooral apache-mpm-prefork staat erom bekend dat deze veel child processes spawnt
kijk voor een korte maar goede documentatie even hier: http://www.xs4all.nl/~thomas/apachecon/PerformanceTuning.html
Freakingme
23/10/07, 17:25
Na aanleiding van deze error heb ik MaxClients verhoogd. Dit lijkt niet echt veel te helpen, hoewel er geen crash meer is geweest.
Dan is het toch op gelost?
nielsvroegin
23/10/07, 17:43
Dan is het toch op gelost?
Tja, als je er een 20/30 seconde over doet om een webpagina te openen, is dit niet ideaal. Ook draait apache pas sinds vannochtend met een verhoogd aantal maxclients, dus het is nog niet zeker dat die zonder te crashen blijft werken.
@MMaI
Zijn die wachttijden niet te veranderen zonder opnieuw te compilen? Ik ben bang dat opnieuw compileren verkeerd gaat (moet ook goed blijven werken met plesk) en de server plat ligt.
Doel je op MaxRequestsPerChild ipv maxclientsperchild? Deze staat in ieder geval bij mij op 4000. Ik gebruik trouwens de apache-mpm-prefork.
Maar kan het zo zijn geweest dat de server crasht doordat die maxclients wordt overschreden?
hrodenburg
23/10/07, 18:50
Het crashen zou natuurlijk niet moeten. Aangezien je het ook over een hoge load hebt, wordt je server dan niet veel te zwaar belast?? Daardoor haalt ie natuurlijk ook de Maxclients sneller.
hmm als ik nu mijn stukje herlees heb ik niet zo goed nagedacht, de maxrequestsperchild is normaal gesproken hoger voor mpm-worker compilaties, en ik doelde in dat kader op de maxclients directive.
Je hebt een mpm-prefork wat zou moeten betekenen dat je maxrequestsperchild op 0 zou kunnen zetten, omdat deze apache config niet met threads werkt.
je zou kunnen controleren of dit klopt door even te kijken naar het aantal processen dat apache spawnt, als dit er eentje (of een zeer klein aantal) is zou je dez eop 0 kunnen zetten, de childs expiren dan namelijk niet en het lijkt erop alsof bij het expiren vna je threads dan ook iets mis gaat met apache.
Overigens is de foutmelding zoals deze in de logs staat niet zo vreemd, dit is gewoon de limiet waarna childs worden gestopt met als voordeel dat het memory leakage tegengaat en ervoor zorgt dat er niet veel apache threads spawnen
als de server stabiel draait met die directive op 5000 zou ik deze laten staan, mocht dit niet het geval zijn zou ik even informeren of mpm-worker een goede oplossing is, deze gebruikt namelijk minder processen voor alle taken maar heeft per proces meer geheugen etc.
Wat je ook even zou kunnen proeren is het tellen vna het aantal apache processen en even kijken hoeveel memory deze gezamenlijk verbruiken, is dat meer dna je hoeveelheid RAM zou je kunnne overwegen mpm-worker te gebruiken
nielsvroegin
24/10/07, 09:20
In httpd.conf is ook de worker mpm configuratie te zien, hier staat MaxRequestsPerChild op 0 en bij prefork op 4000, dus denk dat het precies andersom normaal is.
ThreadsPerChild staat bij worker mode op 25, misschien is worker mpm beter geschikt voor deze server, of wordt de server gewoon te zwaar belast.
We hebben besloten om er iemand anders even naar te laten kijken, omdat dit toch wat te ver gaat voor mij en ik liever geen fouten maak op een productie server.
Ik zal kijken of ik hier kan melden hoe het eventueel opgelost is.
Bedankt voor de reacties!
systemdeveloper
24/10/07, 09:54
Je moet de maxclients dus niet hoger gaan zetten dan je server aankan. Als je dan veel bezoekers hebt 'denkt' apache nog even wat processen te kunenn spawnen, maar als je geheugen daarvoor te weinig is gaat is swappen. Swappen is niet erc als die even of incidenteel gebeurt, maar met veel bezoekers staat je server dus alleen maar de zooi naar schijf te schrijven en weer in te laden. Hierdoor komt de hoge load en de slechte response. Zo krijg je al snel dat de server niet binnen 30 seconden het proces kan afwerken en zal dan het child afknallen.
Als je op save wil spelen doet je het volgende:
Pak je totaal ram en trek daar het default gebruikte geheugen (mysql, os en eventueel andere gadgets die op de server draaien) vanaf. Kijk met 'top' hoe groot een httpd process is en deel het resterende geheugen door die waarde. De uitkomst is je safeste maxclient settings. Natuurlijk kan je dit nog verder verhogen, maar dan ga je weer risico lopen. Normaal zal niet elke http aanvraag evenveel geheugen nodig hebben en de ene sql query zal minder nodig hebben dan de andere, dus zie het als een uitgangspunt.
[error] server reached MaxClients setting, consider raising the MaxClients setting
Eigenlijk is dit geen error maar een waarschuwing. Je hebt zoveel bezoekers dat apache geen processen meer kan spawnen voor nieuwe childs en nieuwe aanvragen dus gaat queuen of zelfs helemaal niet meer bedient. Indien je maar weinig geheugen in je bak hebt, hebt je weining andere keus natuurlijk.
Tip: hercompileer alles geoptimaliseerd voor je specifieke processor architectuur en dump apache modules die je niet nodig hebt, voeg een paar reepjes ram toe of gebruik tinyhttpd.
nielsvroegin
24/10/07, 11:25
Oke duidelijk,
Server ligt nu weer plat, met in de error_log 187 keer "process XXXXX still did not exit, sending a SIGTERM" draaien, wel nog stuk of 5 processen van apache, maar de sites zijn onbereikbaar. Ook is de load gedaalt naar bijna 0(logisch omdat er weinig gebeurd nu).
Op dit moment lijkt het me verstandig naar aanleiding van de post van systemdeveloper om max clients tijdelijk juist om laag te gooien, tot dat er meer geheugen in gestopt is of een expert alles wat geoptimaliseerd heeft voor ons.
ulimit -n 65536
service httpd start
Probeer dat eens even :)
Oke duidelijk,
Server ligt nu weer plat, met in de error_log 187 keer "process XXXXX still did not exit, sending a SIGTERM" draaien, wel nog stuk of 5 processen van apache, maar de sites zijn onbereikbaar.
Klinkt als een of andere endless loop in een php applicatie die Apache niet gekilled krijgt.
Als je ServerStatus enabled kun je hiervan bijvoorbeeld elke minuut een dump van laten maken. Je ziet dan in het overzicht wellicht een aanwijzing.