mirage
| Modérateur
Inscrit le : 04/05/2005
|
# Le 31/05/2008 à 10:44
Actuellement en pleine réinstallation de serveur, je vais entreprendre quelques optimisations d'Apache.
Est-ce que vous avez de bonnes adresses à échanger pour configurer les StartServers, Min/MaxSpareServers, MaxClients, MaxRequestsPerChild & co ?
Merci |
tonguide
| Jeremy Modérateur
Inscrit le : 09/05/2005
|
# Le 31/05/2008 à 14:17
|
mirage
| Vincent Modérateur
Inscrit le : 04/05/2005
|
# Le 31/05/2008 à 15:21
Merci, je vais compléter la liste si je trouve des choses intéressantes |
MultiNetWorks
| Damien Membre
Inscrit le : 13/05/2005
|
# Le 31/05/2008 à 15:29
Damien... |
Bool
| Olivier Modérateur
Inscrit le : 09/05/2005
|
# Le 31/05/2008 à 15:49
Pour moi le plus gros soucis d'Apache c'est la gestion du KeepAlive.
3 solutions pour palier plus ou moins à ça :
- un cron qui surveille régulièrement les slots Apache et désactive le KeepAlive quand ça coince. L'avantage c'est qu'on reste avec des configurations "classiques", mais le temps de réactivité du cron n'est pas toujours idéal... surtout qu'un reload d'Apache implique une purge du cache d'opcode PHP. Dans cette configuration, ne pas oublier de descendre la durée de KeepAlive entre 2 et 5 secondes.
- utiliser le MPM_event d'Apache, le seul à gérer correctement le keepalive. Seulement sous Debian la version 32bits est buggée, et cela implique de passer PHP en FastCGI pour éviter d'avoir à le faire tourner en mode "thread safe" (ce qui reste possible d'ailleurs, contrairement à ce qui est indiqué sur WRI).
- utiliser un autre serveur HTTP en front qui gèrera le keepalive, et si possible tout ce qui est fichier statique. Ainsi Apache ne gérera que le spécifique : HTTPS, PHP, rewriting, droits d'accès.
Évidement si tu es prêt à mettre la main à la patte, dégager Apache pour un autre serveur web est sûrement préférable.
Mais pour la plupart d'entre eux ça implique le passage de PHP en FastCGI ainsi que la non prise en charge des fichiers .htaccess ... donc un gros travail de refonte des sites.
Pour ce qui est du StartServers et autres réglages, sur un Apache prefork, je compte généralement moins de 5Mo par slot (selon les sites et les modules/extensions ça peut monter plus haut).
Il faut ensuite estimer combien de mémoire tu veux allouer à Apache, sans oublier d'en laisser au moins pour le cache disque, APC, bind, mysql, et le serveur de mail.
Tu auras donc ton "maxclients".
Pour le reste, arbitrairement j'ai tendance à faire du : MaxSpare = MaxClients * 0.2, MinSpare = MaxClients = 0.1 et Start = MaxClients * 0.15 .
Mais certains fixent le MinSpare-MaxSpare-Start à la même valeur que le MaxClients.
Pour le MaxRequestsPerChild, sauf site très mal foutu, je ne descends pas en dessous de 5000.
EDIT: je viens de voir sur WRI la méthode à coup de "ps" pour estimer la mémoire consommée par un script PHP. Cette méthode est (heureusement ?) fausse sous Linux, la mémoire en commun entre les processus n'étant pas dupliquée tant que ce n'est pas nécessaire. En gros la consommation mémoire en cas d'un fork sous Linux reste proche de la conso d'un thread... c'est pourquoi la consommation mémoire indiquée par "ps" est toujours farfelue pour Apache.
J'ai des machines qui montent ainsi facilement à 600 processus Apache+PHP simultanés avec moins d' 1.5Go de mémoire... et sans swap évidement.
Exemple d'ailleurs de résultat farfelu : http://www.webrankinfo.com/forums/topic_page_63439...
(Message édité le 31-05-2008 à 16h07 par Bool) daevel : infogérance et conseil || moi |
mirage
| Vincent Modérateur
Inscrit le : 04/05/2005
|
# Le 07/06/2008 à 08:55
Réponse un peu tardive, je n'ai pas eu le temps de m'occuper de ça cette semaine
Pour la raison que tu mentionnes, je ne souhaite pas changer Apache par un autre serveur http (comme lighttpd que j'avais testé sur des fichiers statiques et qui fonctionne à merveille) à cause des réécritures d'URL (sur lighttpd, par exemple, il faut spécifier toutes les rules dans le fichier de conf, c'est un peu lourd).
Le serveur est un Kimsufi XL (avec 2Go de RAM). Selon la configuration que je bidouille actuellement pour mySQL, mySQLTuner me dit qu'il peut utiliser 1,1Go. Ca me parait énorme mais j'ai modifié les valeurs en fonction des conseils qu'il donne. Au niveau des mails, je n'ai qu'un Postfix qui fait du SMTP (tout le reste est sur Google Apps). J'ai aussi APC et Bind d'installés. Je pense que je peux donc allouer 600Mo à Apache.
Actuellement il n'y a que Apache qui fait du swap (17Mo ce matin) avec les valeurs suivantes (sûrement très mal optimisé, je l'accorde) :
- MaxKeepAliveRequests 100
- KeepAliveTimeout 15
- StartServers 5
- MinSpareServers 5
- MaxSpareServers 10
- MaxClients 150
- MaxRequestsParChild 0
PS : Bool, tu dois avoir une petite erreur dans ta formule "MinSpare = MaxClients = 0.1", y a pas un "*" quelque part ? |
Bool
| Olivier Modérateur
Inscrit le : 09/05/2005
|
# Le 07/06/2008 à 11:37
Pour MySQL oui souvent plus il a de mémoire et mieux c'est... dans certaines limites toutefois. Si la base de données fait 150Mo, je me demande bien ce qu'il va pouvoir faire de ces 1.1Go
Un KeepAliveTimeout de 15 secondes, avec un Apache prefork c'est "risqué", ça peut rapidement saturer le nombre de connexions. cf message précédent.
Sinon oui tu as raison, c'était "MinSpare = MaxClients * 0.1". Mais comme je disais, c'est un peu arbitraire.
daevel : infogérance et conseil || moi |
mirage
| Vincent Modérateur
Inscrit le : 04/05/2005
|
# Le 07/06/2008 à 11:47
Le total des tables mySQL fait 75Mo (la plus grosse est à 50Mo). J'ai pas mal d'optimisation à faire au niveau des index de table donc il y a surement des choses perfectibles, comme je le disais.
Je vais monter le KeepAliveTimeout à 25 et regarder pour le reste .
Merci |
flush
| Jean-Philippe Modérateur
Inscrit le : 09/05/2005
|
# Le 07/06/2008 à 12:16
perso mon KeepAliveTimeout est à 2 !
Faut d'abord bien optimiser mysql avant de s'attaquer à apache ;)
avec 75 mo, tu peux tout mettre en mémoire ca devrait pas etre un problème ! Tu fais combien de requêtes sql / sec ? @+ Jean-Philippe |
Bool
| Olivier Modérateur
Inscrit le : 09/05/2005
|
# Le 07/06/2008 à 12:33
Malheureux, en prefork le KeepAliveTimeout il faut le baisser pas le monter ! T'as pas lu un seul mot de mon premier message ?
Pour le MaxRequestsParChild, si ça peut aider la limite par défaut en FastCGI d'un process PHP est de 500 exécutions.
Sinon avec une base de données de 75Mo, réserver 1Go à MySQL me semble ridicule perso. 500Mo ce serait déjà bien... à moins que tu ais un très grand nombre de connexions MySQL simultanées. daevel : infogérance et conseil || moi |
mirage
| Vincent Modérateur
Inscrit le : 04/05/2005
|
# Le 07/06/2008 à 14:04
Bool a dit :
Malheureux, en prefork le KeepAliveTimeout il faut le baisser pas le monter ! T'as pas lu un seul mot de mon premier message ?
Hum... si si mais surement trop vite . Je l'ai mis à deux. |