Apache2 - workerek szép lassan egyesével beragadnak, majd a kiszolgálás leáll.
Sziasztok!
Nem tudok dűlőre jutni az alábbi problémával, valaki már találkozott vele, vagy sejti a megoldást?
Adott egy élesben futó apache2 webszerver, ami működik szépen 3-4 órát, majd szépen lassan elkezdenek kifagyni* a workerek. Ezután a kéréseket nem tudja milyen processznek adni az apache s bekerülnek egy várólistába, így a kiszolgálás végtelen sorbanállási idő végett használhatatlan.
Jelenleg két óránként egy cronjob újraindítja a szervert. (GRACEFUL nem használ)
*8.000-10.000 másodperce nem vesznek fel új feladatopt kiszolgálásra...
A PHP szkriptemben keressem a hibát, vagy nincs összefüggés?
Létezik szkript, ami kilövi a beragadt workereket, vagy nekem kéne megírnom?
A szerver adatai a következők:
Itt a processzek nagyrészénél az "SS"* mező már több ezres érték, s többet már nem is dolgoznak. A maradéknál 10 alatti , s még tökéletesen működnek
*Seconds since beginning of most recent request.
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
Az MPM beállítása.
■ Nem tudok dűlőre jutni az alábbi problémával, valaki már találkozott vele, vagy sejti a megoldást?
Adott egy élesben futó apache2 webszerver, ami működik szépen 3-4 órát, majd szépen lassan elkezdenek kifagyni* a workerek. Ezután a kéréseket nem tudja milyen processznek adni az apache s bekerülnek egy várólistába, így a kiszolgálás végtelen sorbanállási idő végett használhatatlan.
Jelenleg két óránként egy cronjob újraindítja a szervert. (GRACEFUL nem használ)
*8.000-10.000 másodperce nem vesznek fel új feladatopt kiszolgálásra...
A PHP szkriptemben keressem a hibát, vagy nincs összefüggés?
Létezik szkript, ami kilövi a beragadt workereket, vagy nekem kéne megírnom?
A szerver adatai a következők:
Apache Server Status for IP :)
Server Version: Apache/2.2.9 (Debian) PHP/5.2.6-1+lenny8 with Suhosin-Patch (PREFORK)
Server Built: Mar 28 2010 18:03:05
Current Time: Tuesday, 20-Jul-2010 17:55:19 CEST
Restart Time: Tuesday, 20-Jul-2010 15:10:04 CEST
Parent Server Generation: 0
Server uptime: 2 hours 45 minutes 15 seconds
Total accesses: 44797 - Total Traffic: 563.9 MB
CPU Usage: u6.71 s.9 cu0 cs0 - .0768% CPU load
4.52 requests/sec - 58.2 kB/second - 12.9 kB/request
96 requests currently being processed, 49 idle workers
WWWWWWWWWWW_WWWWWWWW.WWWWWW_W_WWWW_WW__WW_WWWWWWWWWW_W_WWWWW_WWW
__.W_W_WWWWW_W_WW__WWWC_WW_WWWWWWWW_WWWW___WW____W___W__WWW__W__
W_W_W__..W..W___...W..W_____....................................
................................................................
Scoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading Request,
"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
"C" Closing connection, "L" Logging, "G" Gracefully finishing,
"I" Idle cleanup of worker, "." Open slot with no current process
Srv PID Acc M CPU SS Req Conn Child Slot
Server Version: Apache/2.2.9 (Debian) PHP/5.2.6-1+lenny8 with Suhosin-Patch (PREFORK)
Server Built: Mar 28 2010 18:03:05
Current Time: Tuesday, 20-Jul-2010 17:55:19 CEST
Restart Time: Tuesday, 20-Jul-2010 15:10:04 CEST
Parent Server Generation: 0
Server uptime: 2 hours 45 minutes 15 seconds
Total accesses: 44797 - Total Traffic: 563.9 MB
CPU Usage: u6.71 s.9 cu0 cs0 - .0768% CPU load
4.52 requests/sec - 58.2 kB/second - 12.9 kB/request
96 requests currently being processed, 49 idle workers
WWWWWWWWWWW_WWWWWWWW.WWWWWW_W_WWWW_WW__WW_WWWWWWWWWW_W_WWWWW_WWW
__.W_W_WWWWW_W_WW__WWWC_WW_WWWWWWWW_WWWW___WW____W___W__WWW__W__
W_W_W__..W..W___...W..W_____....................................
................................................................
Scoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading Request,
"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
"C" Closing connection, "L" Logging, "G" Gracefully finishing,
"I" Idle cleanup of worker, "." Open slot with no current process
Srv PID Acc M CPU SS Req Conn Child Slot
Itt a processzek nagyrészénél az "SS"* mező már több ezres érték, s többet már nem is dolgoznak. A maradéknál 10 alatti , s még tökéletesen működnek
*Seconds since beginning of most recent request.
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
Az MPM beállítása.
<IfModule mpm_prefork_module>
StartServers 100
MinSpareServers 50
MaxSpareServers 100
MaxClients 1000
MaxRequestsPerChild 5
</IfModule>
StartServers 100
MinSpareServers 50
MaxSpareServers 100
MaxClients 1000
MaxRequestsPerChild 5
</IfModule>
Keepalive?
A masik tippem, hogy slow request tamadas aldozata vagy, az ugyanis hasonlo jelenseget produkal. Ez ellen a mindenfele timeoutok betekerese segithet.
Esetleg tamadd meg egy straceval az egyik Apache szalat, lassuk, mit csinal.
Egyebkent meg szerintem, frissitsd meg a szoftvereidet, mert egyik sem mai darab, lehet, hogy ez onmagaban is megoldja a problemat.
A keepalive nem lehet
Arra van egysoros válasz hogyan eresztek strace-t egy adott id-jű processzre?
Nekiállok a szoftverek frissítésnek, de éles rendszernél bajos :)
Csinálok egy másolatot előbb azon letesztelem.
Strace
strace -p pid
Ha nagyon nem boldogulsz, keress meg privatban.
Update
http://security-tracker.debian.org/tracker/TEMP-0533661-015545
A strace az alábbit mondja:
Process 13981 attached - interrupt to quit
restart_syscall(<... resuming interrupted call ...>) = 0
poll([{fd=10, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 0 (Timeout)
poll([{fd=10, events=POLLIN|POLLERR|POLLHUP}], 1, 7000) = 0 (Timeout)
poll([{fd=10, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 0 (Timeout)
poll([{fd=10, events=POLLIN|POLLERR|POLLHUP}], 1, 7000) = 0 (Timeout)
poll([{fd=10, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 0 (Timeout)
poll([{fd=10, events=POLLIN|POLLERR|POLLHUP}], 1, 7000) = 0 (Timeout)
poll([{fd=10, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 0 (Timeout)
poll([{fd=10, events=POLLIN|POLLERR|POLLHUP}], 1, 7000) = 0 (Timeout)
poll([{fd=10, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 0 (Timeout)
poll([{fd=10, events=POLLIN|POLLERR|POLLHUP}], 1, 7000) = 0 (Timeout)
poll([{fd=10, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 0 (Timeout)
poll([{fd=10, events=POLLIN|POLLERR|POLLHUP}], 1, 7000) = 0 (Timeout)
poll([{fd=10, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 0 (Timeout)
poll([{fd=10, events=POLLIN|POLLERR|POLLHUP}], 1, 7000) = 0 (Timeout)
poll([{fd=10, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 0 (Timeout)
poll([{fd=10, events=POLLIN|POLLERR|POLLHUP}], 1, 7000) = 0 (Timeout)
poll([{fd=10, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 0 (Timeout)
poll([{fd=10, events=POLLIN|POLLERR|POLLHUP}], 1, 7000) = 0 (Timeout)
poll([{fd=10, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 0 (Timeout)
poll([{fd=10, events=POLLIN|POLLERR|POLLHUP}], 1, 7000
poll
Timeout 90
Nézd meg, ettől jobb lesz-e. Ha nagyon vakmerő , nézd meg a mod_security és mod_evasive modulokat.
re
A belinkelt debain jelentés alapján egyértelműen kijelenthető hogy egy 2.2.15-re frissítéssel védve vagyok a támadás elől, vagy szórakoznom kell az evasive befordításával?
Egyébként nagyon köszi a segítséget! :)
Most nézem a link nem is működik.
Elvileg ez:
http://security-tracker.debian.org/tracker/TEMP-0533661-015546
Bármi lehet
Egy lehetséges megoldás
Percenként lefut egy PHP szkript a szerveren, ami az apache status modulja alapján megállapítja a "befagyott" (SS > 500) apache childrenek pid-jét, s kilövi őket.
ha nem érné el a /server-status-t újraindítja az apache-t. (még nincs implementálva...)
A problémát megoldotta, már 26 órás uptime van apache restart nélkül. (eddig max 2 órát bírt a slotok beteléséig.)
Ha valakinek hasonló problémája lenne, én ezt a kódot "csaptam össze" hozzá:
php5-cli + cronjob + apache2 extended status kombóval működik.
A parancs hozzá:
/php/executable -f /php/thisscript.php