Performance messen/verbessern php/apache

#1
Hi,

Ich habe einen webserver(OVH 2kern i5, SSD) mit proxmox.
In einem Conatiner läuft: ispconfig mit apache2/php-fpm

Eines meiner Projekte darauf ist ein live-scoring für Sportveranstaltungen, das selten, aber von vielen Benutzern gleichzeitig besucht wird.
Die Seite wird automatisch alle 5 sekunden aktualisiert.
Um die performance zu steigern hab ich einen Cache gebaut, der bereits einmal generierte Seiten als ganze Datei zwischenspeichert und per include(); ausgibt so lange keine Änderungen vorliegen.

Per php/microtime hab ich eine Ausführungszeit von ca. 0,5ms(gegenüber bis zu 50ms bei der vollen Erstellung) gemessen.

Mein Problem: wenn der Server am Tag der Veranstaltung zusammenbricht wäre das der worst case, weil dann auch andere Projekte ausfallen würden...

Kann ich irgendwie die Auslastung des Servers zuverlässig messen, um als Reaktion die Aktualisierungsrate zu reduzieren?

Muss ich dazu Apache-prozesse messen, oder gibt es PHP-Prozesse, oder besser die Gesamtauslastung des Promox-Container oder des ganzen Node?

Kann ich irgendwie ermitteln wie viele solcher Seiten ich pro Sekunde ausgeben kann oder hängt das noch von vielen anderen Voraussetzungen ab?

Würde es helfen nginx statt apache2 zu verwenden?

Macht es Sinn einen eigenen Cointainer als ISPconfig-Slave mit nginx/php für das Projekt zu erstellen damit die anderen Projekte nicht blockiert wenn es überlastet wird?

Gibt es eine Möglichkeit den Server mal testweise auszulasten um die Grenzen der Machbarkeit in der Realität zu ermitteln?
Mit meinem Internetzugang von 3mbit schaffe ich das nicht, der Server ist mit 100mbit ans Inet angebunden...


Hoffentlich habt ihr ein paar Hinweise wie ich weiter vorgehen könnte...

fuxifux
 

planet_fox

Super-Moderator
#2
Hi
was ein Möglichkeit wer Dienste zu Monitoren ist Nagios oder die Pro Version OP5 (25 Hosts sind kostenlos) damit Überwache ich Verfügbarkeit und Auslastung der Dienste meiner Server. Du bekommst nette Diagramme und eine e-mail wenn es Kritisch wird .
Dazu benötigst du jedoch einen unabhängigen von deinem Proxmox System der von Außen überwacht . Wir überachen seit circa einem Jahr alle Server damit um frühzeitig schwach stellen und auslastungsprobleme zu Überwachen.

Links:
http://www.op5.com/
http://www.nagios.org/

Auf Howtorge finden sich auch anleitungen zu anderen Systemen
 

Till

Administrator
#4
Für erste einfache tests kannst Du auch das programm "ab" nehmen und es auf dem selben host laufen lassen. das verfälscht natürlich etwas, aber für einen ersten Überblick istes sicher OK und Du weißt dann dass der server mehr schaffen kann las das was Du mit AB erhältst. Beispiel:

ab -n 100 -c 5 http://www.deinedomain.tld/

ruft die URL mit 5 Verbindungen gleichzeitig die seite 100 mal ab.
 
#5
Danke für die Tips.
Zum Monitoring hab ich momentan munin laufen.
Der test mit AB ergibt mit -n 1000 -c 5 folgende Ausgabe am selben Host laufend:
Code:
Document Path:          /live.php?R_ID=0&P_ID=2&lastfew=5&refresh=15
Document Length:        62321 bytes

Concurrency Level:      5
Time taken for tests:   0.725 seconds
Complete requests:      1000
Failed requests:        3
   (Connect: 0, Receive: 0, Length: 3, Exceptions: 0)
Write errors:           0
Total transferred:      62496003 bytes
HTML transferred:       62321003 bytes
Requests per second:    1379.16 [#/sec] (mean)
Time per request:       3.625 [ms] (mean)
Time per request:       0.725 [ms] (mean, across all concurrent requests)
Transfer rate:          84171.75 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:     1    4   1.8      3      13
Waiting:        1    3   1.8      3      13
Total:          1    4   1.8      3      13
Das schau ja nicht so schlecht aus... ich versuche demnächst mal mit hammerhead zu testen.
 

nowayback

Well-Known Member
#9
Danke für die Tips.
Zum Monitoring hab ich momentan munin laufen.
Der test mit AB ergibt mit -n 1000 -c 5 folgende Ausgabe am selben Host laufend:
Code:
Document Path:          /live.php?R_ID=0&P_ID=2&lastfew=5&refresh=15
Document Length:        62321 bytes

Concurrency Level:      5
Time taken for tests:   0.725 seconds
Complete requests:      1000
Failed requests:        3
   (Connect: 0, Receive: 0, Length: 3, Exceptions: 0)
Write errors:           0
Total transferred:      62496003 bytes
HTML transferred:       62321003 bytes
Requests per second:    1379.16 [#/sec] (mean)
Time per request:       3.625 [ms] (mean)
Time per request:       0.725 [ms] (mean, across all concurrent requests)
Transfer rate:          84171.75 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:     1    4   1.8      3      13
Waiting:        1    3   1.8      3      13
Total:          1    4   1.8      3      13
Das schau ja nicht so schlecht aus... ich versuche demnächst mal mit hammerhead zu testen.
Die Werte sind extrem gut.... aber der Einwand von Farrell hat natürlich seine Berechtigung. Ich würde aber den Test auf jeden Fall wiederholen denn Failed requests: 3 könnte das schon verfälschen.
 
#10
Ich ahb den Test jetzt geändert mit -n 8000 und -c 500 :
Code:
Document Path:          /live.php?R_ID=0&P_ID=2&lastfew=5&refresh=5
Document Length:        62237 bytes

Concurrency Level:      500
Time taken for tests:   10.294 seconds
Complete requests:      8000
Failed requests:        0
Write errors:           0
Total transferred:      499296000 bytes
HTML transferred:       497896000 bytes
Requests per second:    777.19 [#/sec] (mean)
Time per request:       643.345 [ms] (mean)
Time per request:       1.287 [ms] (mean, across all concurrent requests)
Transfer rate:          47368.97 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0   65 391.6      0    3001
Processing:    25  296 887.9    156    9487
Waiting:       21  296 888.0    156    9486
Total:         35  362 1163.5    156    9515

Percentage of the requests served within a certain time (ms)
  50%    156
  66%    158
  75%    160
  80%    161
  90%    164
  95%    168
  98%   6172
  99%   7953
100%   9515 (longest request)
Die failed request kamen von dynamisch generiertem Inhalt
Ich hab mit ausfgegeben ob die Seite aus dem Cache kommt und die php-Verarbeitungsdauer.
Weil die Dauer sich aber bei so vielen Requests ändern kann verändert das auch die Ausgabe des Dokuments.
Seit ich die Dynamischen Daten entfernt habe gibt es keine failed requests mehr.

Wenn ich allerdings -c 1000 verwende bricht der Test ab:
Code:
Benchmarking livetiming.at (be patient)
Completed 800 requests
Completed 1600 requests
Completed 2400 requests
Completed 3200 requests
Completed 4000 requests
Completed 4800 requests
Completed 5600 requests
Completed 6400 requests
Completed 7200 requests
apr_socket_recv: Connection reset by peer (104)
Total of 7751 requests completed
Kann ich die max. Anzahl an requests in den Apache2 configs erhöhen?
Schaut momentan so aus:
Code:
<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>

<IfModule mpm_worker_module>
    StartServers          2
    MinSpareThreads      25
    MaxSpareThreads      75
    ThreadLimit          64
    ThreadsPerChild      25
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>
 

Werbung