Server trotz nur einer Webpräsenz überfordert!

gammla

Member
Hallo!
Irgendwie komme ich nicht weiter. bzw. bastel ich ständig an dem gleichen Thema rum!
Mein Server kommt mir unheimlich langsam vor! Manchmal beobachte ich sogar, dass ein paar Zombies auf dem Server entstehen.

Vielleicht könnt ihr mir bei der Konfiguration etwas unter die Arme greife:

Server:
Athlon™ 3200+
2,0 GHz
512 MB RAM

CentOS 5

Ich verwnde den Apache mit folgender Konfiguration:
Code:
Timeout 100
KeepAlive On
MaxKeepAliveRequests 300
KeepAliveTimeout 2

<IfModule prefork.c>
StartServers       1
MinSpareServers    1
MaxSpareServers   5
ServerLimit      50
MaxClients       45
MaxRequestsPerChild  1500
</IfModule>
Code:
httpd -t -D DUMP_MODULES
Loaded Modules:
 core_module (static)
 mpm_prefork_module (static)
 http_module (static)
 so_module (static)
 authz_host_module (shared)
 log_config_module (shared)
 setenvif_module (shared)
 mime_module (shared)
 status_module (shared)
 autoindex_module (shared)
 negotiation_module (shared)
 dir_module (shared)
 alias_module (shared)
 rewrite_module (shared)
 php5_module (shared)
Syntax OK

Obwohl ich schon sehr viele Module rausgeworfen habe, ist ein httpd Prozess immernoch recht groß:

Code:
apache   10392  7.1  4.0  39456 21072 ?        S    11:41   0:07 /usr/sbin/httpd
apache   10396  5.3  3.6  37180 18760 ?        S    11:41   0:05 /usr/sbin/httpd
apache   10418  0.0  0.3  21444  1964 ?        S    11:42   0:00 /usr/sbin/httpd
apache   10422  5.9  4.2  40276 21796 ?        S    11:42   0:02 /usr/sbin/httpd
apache   10423  0.0  0.3  21444  1944 ?        S    11:42   0:00 /usr/sbin/httpd

Woran kann das liegen? Es läuft nur eine Webpräsenz (Joomla) auf dem Server!

Während einem Benchmark geht der Server in die Knie:

Code:
ab -n 100 -c 100 http://www.schule-ratgeber.de/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking www.schule-ratgeber.de (be patient).....done


Server Software:        Apache/2.2.3
Server Hostname:        www.schule-ratgeber.de
Server Port:            80

Document Path:          /
Document Length:        1201 bytes

Concurrency Level:      100
Time taken for tests:   240.785204 seconds
Complete requests:      100
Failed requests:        52
   (Connect: 0, Length: 52, Exceptions: 0)
Write errors:           0
Total transferred:      3255024 bytes
HTML transferred:       3222992 bytes
Requests per second:    0.42 [#/sec] (mean)
Time per request:       240785.202 [ms] (mean)
Time per request:       2407.852 [ms] (mean, across all concurrent requests)
Transfer rate:          13.20 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0  188  66.7    252     256
Processing: 39745 133790 48513.1 118822  240605
Waiting:    39631 131142 47956.2 118819  240414
Total:      39870 133978 48520.5 119076  240605

Percentage of the requests served within a certain time (ms)
  50%  119076
  66%  123301
  75%  177668
  80%  184758
  90%  216507
  95%  219188
  98%  240547
  99%  240605
 100%  240605 (longest request)
Auffällig ist, das der Server extrem anfängt zu swappen. Habe den Benchmark zeitglieich mit top beobachtet!

Was mache ich falsch?

Gruß,

gammla
 
Du hast beim "top" leider die oberen Zeilen abgeschnitten. Da stecken noch wichtige Informationen drin. (U.a. die Spalten-Überschriften und Einheiten. ;))
Aber ich denke schon mal, daß Dein Server keine "MaxClients 45" verträgt.
Die Faustregel heißt: 12 MB pro Apache-Thread. Von Deinem Hauptspeicher mußt Du erst den Speicher für Kernel und die anderen laufenden Prozesse (u.a. MySQL) abziehen. Selbst wenn dann noch 400 MB übrig bleiben würden, sind es nur "MaxClients 33".

Stell das einfach ein und mach wieder einen Benchmark. (Evtl. nicht mit 100 gleichzeitigen Clients, da dies natürlich das Ergebnis verfälscht.)
Sollte er immer noch swappen, verringere den Wert weiterhin, und wiederhole den Benchmark solange bis er nicht mehr swappt.

huschi.
 
Wenn du nix spezielles mit dem Apache machst und spezielle Module benutzt, könntest dud ir eventuell überlegen lighttpd einzusetzen, wenn du da eh nur eine Webseite laufen hast, wär das eigentlich optimal. ;) Das holt bestimmt noch mal was aus der Kiste raus. :D
 
Hallo!
Hier das Ergebnis von meinem letzten Benchmark:
Code:
 ab -n 50 -c 50 http://www.schule-ratgeber.de/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking www.schule-ratgeber.de (be patient).....done


Server Software:        Apache/2.2.3
Server Hostname:        www.schule-ratgeber.de
Server Port:            80

Document Path:          /
Document Length:        60524 bytes

Concurrency Level:      50
Time taken for tests:   137.412146 seconds
Complete requests:      50
Failed requests:        4
   (Connect: 0, Length: 4, Exceptions: 0)
Write errors:           0
Total transferred:      2801244 bytes
HTML transferred:       2788908 bytes
Requests per second:    0.36 [#/sec] (mean)
Time per request:       137412.140 [ms] (mean)
Time per request:       2748.243 [ms] (mean, across all concurrent requests)
Transfer rate:          19.90 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   1.3      2       4
Processing: 23358 81246 37777.7  78869  137409
Waiting:    23346 81182 37788.5  78852  137387
Total:      23358 81248 37777.8  78870  137409

Percentage of the requests served within a certain time (ms)
  50%  78870
  66%  98851
  75%  123224
  80%  123224
  90%  131852
  95%  136648
  98%  137409
  99%  137409
 100%  137409 (longest request)

Und hier nochmal die ersten Zeilen von top!
Code:
top - 11:59:57 up 5 days,  9:54,  2 users,  load average: 0.57, 7.80, 7.85
Tasks:  59 total,   2 running,  57 sleeping,   0 stopped,   0 zombie
Cpu(s): 32.6%us,  1.0%sy,  0.0%ni, 66.1%id,  0.3%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    514444k total,   266588k used,   247856k free,    22420k buffers
Swap:  2104496k total,    34724k used,  2069772k free,   142436k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 7593 apache    15   0 51288  28m  15m S 31.9  5.7   0:05.30 httpd
28579 mysql     15   0 61232  19m 2660 S  1.0  3.9   9:00.59 mysqld
 7414 root      15   0  2188 1004  804 R  0.3  0.2   0:00.76 top
 7595 apache    15   0 47100  22m  13m S  0.3  4.5   0:02.45 httpd
    1 root      15   0  2064  588  508 S  0.0  0.1   0:00.78 init
    2 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0
    3 root      34  19     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0
    4 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 watchdog/0
    5 root      10  -5     0    0    0 S  0.0  0.0   0:00.00 events/0
    6 root      10  -5     0    0    0 S  0.0  0.0   0:00.00 khelper
    7 root      10  -5     0    0    0 S  0.0  0.0   0:00.00 kthread
   10 root      10  -5     0    0    0 S  0.0  0.0   0:00.22 kblockd/0

Die MaxClients stehen auf 33 und er swapt nicht mehr! Dennoch machen mir die "Failed requests: 4" sorgen!

Der Benchmark simuliert doch 50 gleichzeitige "Benutzer"? Das würde aber auch heißen, dass die Webseite weitaus mehr als 50 "reale Benutzer" verkraften würde, da diese ja nicht alle gleichzeitig eine Seite anfordern! Oder?

Jetzt habe ich nochmal grundlegend ein paar Fragen zum Speicherverbrauch:
Bei "top" gibt die Spalte "RES" den Speicherverbrauch an? Das würde heißen das mein apache Thread in dem oben geposteten top 28 MB braucht? Leider komme ich irgendwie nicht tiefer!

Ein ps aux liefert ähnliche Werte:
Code:
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

apache    7665  1.1  4.9  47900 25332 ?        S    12:03   0:04 /usr/sbin/httpd
apache    7699  1.1  5.4  50684 28152 ?        S    12:04   0:03 /usr/sbin/httpd
apache    7702  0.9  5.0  48372 25980 ?        S    12:04   0:03 /usr/sbin/httpd
apache    7712  1.9  4.5  47184 23248 ?        S    12:08   0:02 /usr/sbin/httpd

Auch hier sind um die 25 MB angezeigt!
Wie komme ich auf 12 MB oder habe ich da einen Denkfehler. Kann es daran liegen, dass ich gestern eAccelerator installiert habe und der Cache von ihm mit an den Apache-Threads hängt?! Wobei ich meine, dass vor dem eAccelerator die Speicherbelegung ähnlich war!

Was läuft hier falsch?

Zu lighthttp:
Ich habe mir schon vor dem Aufsetzen des neuen Systems (CentOS 5) Gedanken über lighthttp gemacht! Aber leider verworfen, weil ich noch keinerlei Erfahrungswerte diesbezüglich habe.
Auf einen Versuch muss man es schon mal ankommen lassen! Werde also am Wochenende mal ein Testsystem mit lighthttp aufsetzen und schauen, ob die Webseite darauf läuft!
Oder meint ihr, ich könnte es so "einfach" mal testen?
Spezielle Module verwende ich nicht. Lediglich mod_rewrite ist schwer im Einsatz.
Aber das kann der lighthttp ja!

Gruß,

gammla
 
Der Benchmark simuliert doch 50 gleichzeitige "Benutzer"?
50 gleichzeitige Benutzer (-c) mit jeweils 50 Requests (-n).
Die ersten 33 werden sofort behandelt und die 17 Weiteren landen in einer Queue. Der nächste freie Apache-Thread schnappt sich dann den nächsten aus der Queue und der Bechnmark startet bereits den nächsten Request.
Hier kann es passiert sein, daß die Queue so lange wird, daß irgendwann der Timeout beim Client greift.

dass die Webseite weitaus mehr als 50 "reale Benutzer" verkraften würde
Richtig.

Bei "top" gibt die Spalte "RES" den Speicherverbrauch an?
Jein. RES == Ressourcen.
Der Speicher eines Programmes/Threads teilt sich immer in den Code-Speicher und Data-Speicher. Der Code-Bereich wird von allen Threads gleichzeitig genutzt. Wird also nur einmal im Speicher belegt. Der DATA-Bereich gehört zum Thread und wird mit jedem neuen Fork mit den Daten des Parents gefüllt. Während dem "Lebenslauf" eines Threads füllen sich immer mehr Daten in diesen Bereich (z.B. von PHP und eAccelerator).
Meine genannten "12 MB" sind ein reiner Schätzwert der auf Erfahrungen beruht und sich auf den Thread-Eigenen DATA-Bereich bezieht.

huschi.
 
Hallo!
Erst mal vielen Dank!

Ich denke mal, dass ich den Server nicht weiter schneller bekomme und das die CPU das Nadelöhr ist.

Gestern war es soweit, dass der Server bei ca 70 "gleichzeitigen" Benutzern in die Knie gegangen ist und nichts mehr ging.

Mit top konnte ich feststellen, dass recht viel RAM frei war (ca. 150MB) und der Swap Speicher mit ca. 200MB belegt war.

Ich habe jetzt die MaxClients wie folgt runtergesetzt:

Code:
<IfModule prefork.c>
StartServers       1
MinSpareServers    5
MaxSpareServers  5
ServerLimit     30
MaxClients       25
MaxRequestsPerChild 2000
</IfModule>

Code:
Timeout 100
KeepAlive On
MaxKeepAliveRequests 150
KeepAliveTimeout 4

Nach einem Benchmark mit -n 50 -c 50 konnte ich erkennen, dass der Server definitiv nicht swapt.

Allerdings war die CPU zu 100% ausgelastet und mein Request an die Seite wurde erst spät/gar nicht bearbeitet.

Ich schiebe das ganze jetzt mal auf die leistungsschwache CPU?

Muss ich tatsächliche einen leistungsstärkeren Server mieten um 70 Besucher beherbergen zu können?

Was mache ich falsch?

Gruß,

Gammla
 
Mit top konnte ich feststellen, dass recht viel RAM frei war (ca. 150MB) und der Swap Speicher mit ca. 200MB belegt war.
Schön dass Du es gesehen hast.
Aber in meiner Glaskugel taucht kein Screenshot auf, daher kann ich überhaupt keinen weiteren Rat geben.

huschi.
 
Leider habe ich keinen Screenshot gemacht.
Über einen Benchmark lässt sich das ganze leider nicht simulieren.

Wenn ich ab laufen lasse scheint alles im Rahmen zu sein. Der Ram speicher füllt sich bis auf 20MB, der Swap Speicher bleibt leer.

Was kann ich dir für Screenshots/Werte liefern, dass du die "Lage" besser beurteilen kannst?

Gruß,

Gammla
 
Ein "top" zu solchen Spitzenlastzeiten wäre schon mal ein Anfang.
(Schließlich stehen dort noch viel mehr Daten drin als nur der RAM-Verbrauch.)

huschi.
 
Back
Top