Hohe Serverlast durch Apache ( bedingt durch php? )

Apache, Lighttpd, nginx, Cherokee
trasric
Posts: 8
Joined: 2007-09-07 11:00
 

Hohe Serverlast durch Apache ( bedingt durch php? )

Post by trasric »

Hallo zusammen,

Ich habe auf meinem Rootserver folgende Installation von apache2 / php:

Apache2:

Code: Select all

# dpkg -l | grep apache2
ii  apache2                            2.2.3-4+etch1                   Next generation, scalable, extendable web se
rc  apache2-common                     2.0.54-5sarge1                  next generation, scalable, extendable web se
ii  apache2-mpm-prefork                2.2.3-4+etch1                   Traditional model for Apache HTTPD 2.1
ii  apache2-utils                      2.2.3-4+etch1                   utility programs for webservers
ii  apache2.2-common                   2.2.3-4+etch1                   Next generation, scalable, extendable web se
ii  libapache2-mod-fastcgi             2.4.2-8                         Apache 2 FastCGI module for long-running CGI
ii  libapache2-mod-php5                5.2.0-8+etch7                   server-side, HTML-embedded scripting languag
ii  libapache2-svn                     1.4.2dfsg1-2                    Subversion server modules for Apache
Und php5 als Mod installiert.

Code: Select all

# dpkg -l | grep php5
ii  libapache2-mod-php5                5.2.0-8+etch7                   server-side, HTML-embedded scripting languag
ii  php5-cli                           5.2.0-8+etch7                   command-line interpreter for the php5 script
ii  php5-common                        5.2.0-8+etch7                   Common files for packages built from the php
ii  php5-gd                            5.2.0-8+etch7                   GD module for php5
ii  php5-imap                          5.2.0-8+etch7                   IMAP module for php5
ii  php5-mysql                         5.2.0-8+etch7                   MySQL module for php5
ii  php5-odbc                          5.2.0-8+etch7                   ODBC module for php5
ii  php5-pgsql                         5.2.0-8+etch7                   PostgreSQL module for php5
Mein Problem ist, dass eine viel zu hohe Serverlast entsteht ( Es laufen 2 Seiten auf dem Server, die zwar recht gut besucht sind, jedoch die Hardware nicht derart ins schwitzen bringen sollten ).

Hier mal ein Auszug aus TOP:

Code: Select all

top - 11:20:19 up 118 days, 15:03,  2 users,  load average: 79.97, 81.99, 77.47
Tasks: 131 total,  79 running,  52 sleeping,   0 stopped,   0 zombie
Cpu(s): 100.0% us,  0.0% sy,  0.0% ni,  0.0% id,  0.0% wa,  0.0% hi,  0.0% si
Mem:   2076852k total,  2016232k used,    60620k free,    20104k buffers
Swap:  1052248k total,    46888k used,  1005360k free,   495308k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 1110 www-data  25   0 48628  30m  21m R  3.7  1.5   2:47.56 apache2
 1228 www-data  25   0 50628  32m  21m R  3.7  1.6   1:38.97 apache2
 1305 www-data  25   0 36952  19m  21m R  3.7  0.9   1:15.07 apache2
 1487 www-data  25   0 40464  22m  21m R  3.7  1.1   0:20.93 apache2
 1492 www-data  25   0 51440  32m  21m R  3.7  1.6   0:25.60 apache2
 1494 www-data  25   0 50336  31m  21m R  3.7  1.6   0:25.39 apache2
 1505 www-data  25   0 41704  23m  21m R  3.7  1.1   0:22.13 apache2
 1161 www-data  25   0 50380  31m  21m R  3.3  1.6   2:00.23 apache2
 1188 www-data  25   0 49724  31m  21m R  3.3  1.5   1:44.68 apache2
 1206 www-data  25   0 41792  23m  21m R  3.3  1.2   1:32.92 apache2
 1214 www-data  25   0 51792  33m  21m R  3.3  1.6   1:41.16 apache2
 1215 www-data  25   0 36896  18m  21m R  3.3  0.9   1:29.07 apache2
 1299 www-data  25   0 40560  22m  21m R  3.3  1.1   1:19.23 apache2
 1300 www-data  25   0 51024  32m  21m R  3.3  1.6   1:14.03 apache2
 1304 www-data  25   0 49168  30m  21m R  3.3  1.5   1:18.34 apache2
 1328 www-data  25   0 50960  32m  21m R  3.3  1.6   1:13.95 apache2
 1368 www-data  25   0 51736  33m  21m R  3.3  1.6   1:01.72 apache2
 1420 www-data  25   0 36840  18m  21m R  3.3  0.9   0:40.68 apache2
 1423 www-data  25   0 49352  30m  21m R  3.3  1.5   0:31.05 apache2
 1427 www-data  25   0 50192  31m  21m R  3.3  1.6   0:38.25 apache2
 1464 www-data  25   0 37576  19m  21m R  3.3  1.0   0:24.06 apache2
 1485 www-data  25   0 36852  18m  21m R  3.3  0.9   0:25.79 apache2
 1495 www-data  25   0 51440  32m  21m R  3.3  1.6   0:25.38 apache2
 1500 www-data  25   0 51440  32m  21m R  3.3  1.6   0:25.03 apache2
 1508 www-data  25   0 50928  32m  21m R  3.3  1.6   0:21.71 apache2
 1515 www-data  25   0 49824  31m  21m R  3.3  1.5   0:21.31 apache2
 1524 www-data  25   0 50672  32m  21m R  3.3  1.6   0:20.13 apache2
 1537 www-data  25   0 34304  16m  21m R  3.3  0.8   0:16.43 apache2
 1549 www-data  25   0 48560  29m  21m R  3.3  1.5   0:14.17 apache2
 1430 www-data  25   0 50636  32m  21m R  1.0  1.6   0:26.75 apache2
Viele werden sich jetzt wohl denken: Wieder ein Einstellungsproblem von prefork, jedoch kann ich dies leider nur verneinen. Ich bin schon so ziemlich jede Einstellung durchgegangen. Meiner Beobachtung nach liegt folgende Ereigniskette vor:

Apache2 startet -> Seite wird besucht -> Mutterprozess von apache ( Bei entsprechenden Einstellungen(!) benutzt 100% CPU, was sich jedoch nach ca. 5 Minuten wieder beruhigt, wenn die Seite nicht mehr angesprochen wird.

Leider kann ich auch defekte Hardware ausschließen, da wir die Seite schon einmal auf einen anderen Server gezogen haben.

Zusätzlich habe ich auch schon einmal php5 über mod-fastcgi installiert. Dort sieht das ganze dann so aus:

Code: Select all

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 1721 XXXXXXXX  25   0 22440  12m  14m R 99.9  0.6   0:07.37 php-cgi
Leider ist in der error.log / suexec.log dann auch nichts zu finden, außer das suexec einen timeout zum php-server bekommt, was sich mMn durch die die hohe Prozesserauslastung bedingt ist.

Hat vielleicht jemand einen Tipp, wodran es liegen könnte?

Vielen Dank im Voraus,

Trasric

Edit:

Auszug aus der error.log bei php5 mit fastcgi:

Code: Select all

[Fri Sep 07 11:27:51 2007] [error] [client 68.101.151.208] FastCGI: comm with server "/var/www/php-fcgi-scripts/php5/php-fcgi-starter" aborted: idle timeout (30 sec), referer: http://www.google.com
[Fri Sep 07 11:27:51 2007] [error] [client 68.101.151.208] FastCGI: incomplete headers (0 bytes) received from server "/var/www/php-fcgi-scripts/php5/php-fcgi-starter", referer: http://www.google.com
User avatar
Joe User
Project Manager
Project Manager
Posts: 11185
Joined: 2003-02-27 01:00
Location: Hamburg
 

Re: Hohe Serverlast durch Apache ( bedingt durch php? )

Post by Joe User »

Sarge und Etch zu mixen kann nur zu Problemen führen:

Code: Select all

sed 's/sarge/stable/g' -i /path/to/sources.list
apt-get update
apt-get dist-upgrade
trasric
Posts: 8
Joined: 2007-09-07 11:00
 

Re: Hohe Serverlast durch Apache ( bedingt durch php? )

Post by trasric »

matzewe01 wrote:Womöglich eine Schleife oder ein e ungünstige SQL Abfrage die das Script dann mit unsinniger Tätigkeit bis zum Timeout laufen lässt.

Verhalten unter Änderung der Timeouts in der php.ini weiter prüfen und dann den Code debuggen.

By the way: server-status aktivieren und die Ausgabe posten.

Gruss Matthias
Hallo,

ich werde einmal ein paar Testreihen in der php.ini durchführen. Danke schon einmal dafür.

Server-Status ist auch wenig aufschlussreich:

Code: Select all

urrent Time: Friday, 07-Sep-2007 13:22:55 CEST
Restart Time: Friday, 07-Sep-2007 13:22:40 CEST
Parent Server Generation: 0
Server uptime: 14 seconds
2 requests currently being processed, 5 idle workers

WW_____.........................................................
................................................................
................................................................
................................................................

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

PID Key:

   2002 in state: W ,   2003 in state: W ,   2004 in state: _ 
   2005 in state: _ ,   2006 in state: _ ,   2007 in state: _ 
   2008 in state: _ ,
@Joe User:

In der sources.list sind nur `etch` Einträge. Zudem ist das Problem auch vorhanden, wenn ich sowohl apache als auch php selbst übersetze.
noto
Posts: 6
Joined: 2007-02-19 04:38
 

Re: Hohe Serverlast durch Apache ( bedingt durch php? )

Post by noto »

server-tuning.conf sollte sein

Code: Select all

Timeout 30
KeepAlive On
MaxKeepAliveRequests 150
KeepAliveTimeout 2
und

Code: Select all

<IfModule prefork.c>
StartServers       5
MinSpareServers    5
MaxSpareServers    10
ServerLimit       110
MaxClients        100
MaxRequestsPerChild  4000
<IfModule>


HostnameLookups off
mit

Code: Select all

ps axu --sort:command
kannst du dir die httpd2 Prozesse anzeigen lassen und deren RAM Verbrauch in KB [RSS]. MaxClients sind ja Childs, also httpd2 Prozesse und 100 * RSS = RAM

KeepAliveTimeout 2
sollte deine Task deutlich reduzieren.
trasric
Posts: 8
Joined: 2007-09-07 11:00
 

Re: Hohe Serverlast durch Apache ( bedingt durch php? )

Post by trasric »

Hallo,

danke nochmals für die weiteren Antworten. Also in der Zwischenzeit habe ich die idle timeouts in php auf 1 Sekunde gestellt ( Seiten werden idr. eh schneller erzeugt ).

@matzewe01: Nein es sind keine vorgefertigten Skripts sondern ein selbst geschriebenes Portal. Jedoch kann ich mir kaum vorstellen, dass der Fehler darin liegt, da es schon seit längerem im Einsatz ist. In Bezug auf die Serverauslastung: Zumindest waren gleichwertig viele Prozesse eingesetzt von Apache.

@noto:

Danke für die tuning Einstellungen, jedoch liegt es auch nicht daran. Die Timeout Einstellungen bringen leider nicht den gewünschten Erfolg und KeepAlive hatte ich ausgestellt ( weil nicht benötigt ).

Nun teilen sich die 5 Serverprozesse die CPU-Last:

Code: Select all

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 6032 www-data  25   0 52236  36m  21m R 17.0  1.8   0:36.53 apache2
 6033 www-data  25   0 53264  37m  21m R 17.0  1.8   0:14.18 apache2
 6039 www-data  25   0 54332  38m  21m R 17.0  1.9   0:09.93 apache2
 6054 www-data  25   0 51672  35m  21m R 17.0  1.8   0:03.57 apache2
 6038 www-data  25   0 51992  36m  21m R 16.7  1.8   0:05.70 apache2
 6035 www-data  25   0 54256  38m  21m R 14.7  1.9   0:18.47 apache2
ps aux --sort:command :

Code: Select all

# ps aux --sort:command
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      6024  0.0  0.4  25428  9432 ?        Ss   13:54   0:00 /usr/sbin/apache2 -k start
www-data  6030  0.0  0.5  25808 11228 ?        S    13:54   0:30 /usr/sbin/apache2 -k start
www-data  6032  0.0  0.5  25808 11048 ?        S    13:54   1:00 /usr/sbin/apache2 -k start
www-data  6033  0.0  0.6  27452 12708 ?        S    13:54   0:39 /usr/sbin/apache2 -k start
www-data  6035  0.0  0.5  25772 11012 ?        S    13:54   0:30 /usr/sbin/apache2 -k start
www-data  6036  0.0  0.5  26776 11972 ?        S    13:54   0:06 /usr/sbin/apache2 -k start
www-data  6038  0.0  0.5  25800 11136 ?        S    13:55   0:30 /usr/sbin/apache2 -k start
www-data  6039  0.0  0.5  25828 11080 ?        S    13:55   0:30 /usr/sbin/apache2 -k start
www-data  6053  0.0  0.5  25704 10928 ?        S    13:57   0:00 /usr/sbin/apache2 -k start
www-data  6054  0.0  0.5  25768 10968 ?        S    13:57   0:29 /usr/sbin/apache2 -k start
www-data  6056  0.0  0.5  25692 10812 ?        S    13:57   0:00 /usr/sbin/apache2 -k start
trasric
Posts: 8
Joined: 2007-09-07 11:00
 

Re: Hohe Serverlast durch Apache ( bedingt durch php? )

Post by trasric »

Ich werde deinen Tipp an den Entwickler weiterleiten, dass er seinen Code nochmal durch schaut. Wenn es das ist, ist er mir aber nen Bierchen schuldig 8)


Das Problem ist plötzlich ohne Änderungen an php/apache aufgetreten. Also kein Update der Versionen.
trasric
Posts: 8
Joined: 2007-09-07 11:00
 

Re: Hohe Serverlast durch Apache ( bedingt durch php? )

Post by trasric »

Hallo,
das Problem scheint gelöst.

Es lag wohl an einer Kommentierfunktion bzw. deren MySQL Abfrage. Die Serverlast ist von 60.xx - 70.xx auf 0.2x - 0.3x herunter gegangen :)

Somit ist mir der Entwickler am Wochenende eindeutig was schuldig :lol:

Vielen Dank für die vielen Tipps.

Chris