Optimisation Apache

10 réponses
AuteurMessage

mirage |
Modérateur

Photo de mirage

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

Je ne promet rien sur la valeur des liens suivants, mais c'est ceux que j'ai mis en favoris (entre autre) si un jour je dois me mettre à apprendre ça (actuellement j'y connais rien)

http://olange.developpez.com/articles/debian/insta...Ouvrir dans une nouvelle fenetre

http://www.webrankinfo.com/forums/viewtopic_86073....Ouvrir dans une nouvelle fenetre

http://www.webrankinfo.com/forums/viewtopic_51449....Ouvrir dans une nouvelle fenetre

mirage | Vincent
Modérateur

Photo de mirage

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

Photo de MultiNetWorks

Inscrit le : 13/05/2005

# Le 31/05/2008 à 15:29

Par ici : http://www.webrankinfo.com/forums/viewtopic_63439....Ouvrir dans une nouvelle fenetre

Damien...

Bool | Olivier
Modérateur

Photo de Bool

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...Ouvrir dans une nouvelle fenetre

(Message édité le 31-05-2008 à 16h07 par Bool)

daevel : infogérance et conseilOuvrir dans une nouvelle fenetre || moiOuvrir dans une nouvelle fenetre

mirage | Vincent
Modérateur

Photo de mirage

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, mySQLTunerOuvrir dans une nouvelle fenetre 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

Photo de Bool

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 conseilOuvrir dans une nouvelle fenetre || moiOuvrir dans une nouvelle fenetre

mirage | Vincent
Modérateur

Photo de mirage

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

Photo de flush

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

Photo de Bool

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 conseilOuvrir dans une nouvelle fenetre || moiOuvrir dans une nouvelle fenetre

mirage | Vincent
Modérateur

Photo de mirage

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.

Répondre

Vous ne pouvez pas participer au forum, car votre inscription n'a pas été validée. Pour vous faire valider en tant que Membre, cliquez ici.

© MHN - Tous droits réservés | CNIL N°844440 | 24/11/2024 10:49:24 | Généré en 8.19ms | Contacts | Mentions légales |