Performance messen/verbessern php/apache

Dieses Thema im Forum "Smalltalk" wurde erstellt von fuxifux, 30. Sep. 2014.

  1. fuxifux

    fuxifux Member

    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
     
  2. planet_fox

    planet_fox Super-Moderator

    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
     
  3. wotan2005

    wotan2005 Member

  4. Till

    Till Administrator

    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. fuxifux

    fuxifux Member

    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.
     
  6. wotan2005

    wotan2005 Member

    mit hammerhead solltest du aber von einem externen Host aus testen.
     
  7. fuxifux

    fuxifux Member

    Alles klar, ich bin schon halbwegs beruhigt wenn >1000 Abrufe pro Sekunde für Apache kein Problem sind.
     
  8. F4RR3LL

    F4RR3LL Member

    Dafür war dein Test dann aber falsch. Es sind ja bestimmt nicht nur 5 User die dann 1000 mal klicken... mach den Test mal mit einer höheren Userzahl- also höherer Verbindungsrate *fiktiv*

    Gruß Sven
     
  9. nowayback

    nowayback Well-Known Member

    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. fuxifux

    fuxifux Member

    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>
     

Diese Seite empfehlen