[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Apache: MaxClients + taille processus



Le 08/03/2011 16:12, Luxpopuli Open source a écrit :
Merci bien Nicolas ;-)

Le 8 mars 2011 13:47, FROIDURE Nicolas <froidure_nicolas@yahoo.fr> a écrit :
Le 08/03/2011 13:18, Luxpopuli Open source a écrit :
Bonjour Nicolas,

Merci pour ta réponse.

J'ai trouvé également cette page concernant les scripts Perl: http://modperlbook.org/html/11-1-Setting-the-MaxClients-Directive.html

Et ici, un calcul d'estimation pour déterminer la valeur: http://www.devside.net/articles/apache-performance-tuning

A propos de ab, peux-tu me donner un peu plus d'info sur le test qui permet de mettre en évidence la différence de ressource entre des ressources statiques et du php ?

Pascal

Le 7 mars 2011 14:57, FROIDURE Nicolas <froidure_nicolas@yahoo.fr> a écrit :
Le 06/03/2011 16:41, Luxpopuli Open source a écrit :
Bonjour,


On lit de partout, à commencer dans la doc, que la valeur par défaut (256) de la directive MaxClients de Apache est suffisante dans la plupart des cas.

Comme je ne trouve pas cette valeur particulièrement élevée, je voudrais savoir s'il y a un moyen d'évaluer (d'une façon ou d'une autre) ce que cela représente en terme de visites ou de pages vues ou je ne sais quoi ?
Si j'ai bien compris 256 c'est le nombre max de processus fils simultanés = nombre max de connexions simultanées ? (un processus ne gère qu'une connexion (il meurt à la fin de la connexion) alors qu'une connexion peut gérer MaxRequestsPerChild requêtes) Oui/Non ?

Taille des processus

Quelles sont les techniques de calcul de la taille des processus pour déterminer la valeur de MaxClients et donc la quantité de RAM que doit avoir le serveur ?

Pascal
            Slt,

    En ce qui concerne la taille des processus, cela dépend du nombre de modules Apaches chargés en mémoire + la taille éventuelle de la mémoire utilisé par ton language de programmation côté serveur.

    C'est d'ailleurs le principal problème car pour des ressources statiques, une valeur de 256 est probablement supportable par de nombreuses confs matérielles, mais dès lors que ce sont des scripts qui font appel à la base/utilisent bcp de mémoire, ça change la donne.

    J'ai lu qqpart : 1-2Mo pour une ressource statique et 8Mo pour un script PHP en moyenne, après, à toi de définir le ratio entre processus php/res statiques. Si tu veux optimiser, vire les modules qui ne te servent pas en t'aidant de la doc, ça te permettra de mieux les connaître par la même occasion.

    Et sinon, dans le dossier bin d'apache, tu as ab (apache benchmark) qui te permet d'effectuer un grand nombre de requêtes simultanées. Tu pourra constater l'énorme différence entre des ressources statiques et du php.

    Bonne semaine.
-- 
Cordialement, Nicolas Froidure, gérant, Elitwork SARL.

            Slt,

    Merci pour tes liens, j'y ai aussi appris des trucs.

    Pour te donner un exemple sur un serveur local de test avec 512mo de ram et un AMD 2Go. 500 requêtes avec 50 requêtes concurrentes :
- 22 secondes : 12ko générés en PHP avec cache côté serveur activé (XCMS)
- 90 secondes : 12ko générés en PHP sans cache (XCMS)
- 3.71 secondes pour une image de 47ko

    Je t'ai mis les résultats en fin de mail. Tu peux également tester une charge plus "habituelle" en extrayant les url de tes logs et en les mettant en entrée dans ab. Essayes man ab pour voir si il lit l'entrée standard. A la limite, ça serait pas mal de faire un shell qui automatise le "replay" de fichiers de log n fois. Je mets ça dans ma todolist.

    Bons tests.

[TEST 1]
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.elitwork.com.ewk (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Finished 500 requests


Server Software:        Apache/2.2.16
Server Hostname:        www.elitwork.com.ewk
Server Port:            80

Document Path:          /
Document Length:        12456 bytes

Concurrency Level:      50
Time taken for tests:   22.312500 seconds
Complete requests:      500
Failed requests:        0
Write errors:           0
Total transferred:      6396000 bytes
HTML transferred:       6228000 bytes
Requests per second:    22.41 [#/sec] (mean)
Time per request:       2231.250 [ms] (mean)
Time per request:       44.625 [ms] (mean, across all concurrent requests)
Transfer rate:          279.93 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   2.6      0      15
Processing:   406 2187 459.2   2250    3421
Waiting:      390 2089 429.6   2125    3218
Total:        406 2188 459.3   2250    3421

Percentage of the requests served within a certain time (ms)
  50%   2250
  66%   2312
  75%   2359
  80%   2390
  90%   2515
  95%   2859
  98%   3171
  99%   3281
 100%   3421 (longest request)



[TEST 2]
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.elitwork.com.ewk (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Finished 500 requests


Server Software:        Apache/2.2.16
Server Hostname:        www.elitwork.com.ewk
Server Port:            80

Document Path:          /
Document Length:        12477 bytes

Concurrency Level:      50
Time taken for tests:   89.796875 seconds
Complete requests:      500
Failed requests:        481
   (Connect: 0, Length: 481, Exceptions: 0)
Write errors:           0
Total transferred:      6455956 bytes
HTML transferred:       6265456 bytes
Requests per second:    5.57 [#/sec] (mean)
Time per request:       8979.688 [ms] (mean)
Time per request:       179.594 [ms] (mean, across all concurrent requests)
Transfer rate:          70.20 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   2.4      0      15
Processing:  2046 8802 1658.7   8906   13906
Waiting:     2000 8596 1627.1   8687   13703
Total:       2046 8802 1658.9   8906   13906

Percentage of the requests served within a certain time (ms)
  50%   8906
  66%   9031
  75%   9078
  80%   9125
  90%   9296
  95%  11750
  98%  13390
  99%  13656
 100%  13906 (longest request)

[TEST 3]
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.elitwork.com.ewk (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Finished 500 requests


Server Software:        Apache/2.2.16
Server Hostname:        www.elitwork.com.ewk
Server Port:            80

Document Path:          /images/refs/48-thumb.png
Document Length:        46527 bytes

Concurrency Level:      50
Time taken for tests:   3.718750 seconds
Complete requests:      500
Failed requests:        0
Write errors:           0
Total transferred:      23387500 bytes
HTML transferred:       23263500 bytes
Requests per second:    134.45 [#/sec] (mean)
Time per request:       371.875 [ms] (mean)
Time per request:       7.438 [ms] (mean, across all concurrent requests)
Transfer rate:          6141.58 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   4.7      0      15
Processing:    46  355  75.2    375     484
Waiting:       15  306  70.2    328     437
Total:         46  357  74.9    375     484

Percentage of the requests served within a certain time (ms)
  50%    375
  66%    390
  75%    406
  80%    421
  90%    437
  95%    437
  98%    453
  99%    453
 100%    484 (longest request)

-- 
Cordialement, Nicolas Froidure, gérant, Elitwork SARL.

Il n'y malheureusement pas de valeur facile a trouver .
Tous dépend du code PHP que tu utilises .

La valeur safe et facile a trouver, mais elle est loin d'être la valeur optimale :(
Il s'agit de la valeur qui dans le pire des cas te permet de ne pas être en saturation mémoire ( swapper )

Un fork apache prend entre 5 et 8 Mo en général .
 
Tu rajoute la valeur max_memory_limit configurée dans ton fichier php.ini
Par ex pour 16MO dans le php.ini et te reste 1500 Mo de dispo pour apache .
ceil(1500 /( 8 + 16)) = 62 

Tu ne devrais pas mettre en théorie plus de 62 en ServerLimit

Le chiffre est faible, mais il te garantis que si le code PHP ne libère pas correctement la mémoire de ne pas swapper .

Le maximum de la mémoire utiliser par les scripts PHP sur le meme fork
Sera la mémoire qui sera utilisée par le fork apache .

Ex. :
Si une page PHP utilise 32 Mo pour son exécution.
Le fort apache exécute cette page, il utilise donc 32Mo.
Après même si plein d'autres scripts ou de page statiques sont exécutés sur le même fort .
Le fort apache continuera toujours à utiliser les 32 Mo de mémoire en plus des 8 de bases .
Jammais compris pourquoi apache ne libérer pas correctement la mémoire .


Tu as deux solutions dans les cas de gros PHP .
La moins bonne :
Abaisser le max request par fils pour que les fork apache s'arrêtent après X exécutions ( abaissant la probabilité que tous les fork est exécuté le PHP de 32 Mo )
En contre partis tu utiliseras beaucoup de ressources processeur pour supprimer et créer les fork .


La meilleure solution passer en apache-worker et fast-cgi
La seul contrainte ne pas avoir des centaines de PHP en frontal et encore je suis que cela encore marcherait mieux .
Cette solution m'a permis de gagner 1000 % sur des sites avec symfony (200 connexions simultanées a 2000 connexions sur le même serveur web).
Tu n'a pas 2000 fork apache qui utilise 32Mo mais de 1 à 6 PHP qui utilise 32Mo .
Configuration plus lourdes d'apache surement pour cela que ce n'est pas la solution par défaut .



Reply to: