1<?xml version="1.0" encoding="ISO-8859-1"?> 2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 3<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr"><head><!-- 4 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 5 This file is generated from xml source: DO NOT EDIT 6 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 7 --> 8<title>Optimisation des performances d'Apache - Serveur Apache HTTP</title> 9<link href="/style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" /> 10<link href="/style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" /> 11<link href="/style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /><link rel="stylesheet" type="text/css" href="/style/css/prettify.css" /> 12<script src="/style/scripts/prettify.min.js" type="text/javascript"> 13</script> 14 15<link href="/images/favicon.ico" rel="shortcut icon" /></head> 16<body id="manual-page"><div id="page-header"> 17<p class="menu"><a href="/mod/">Modules</a> | <a href="/mod/directives.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="/glossary.html">Glossaire</a> | <a href="/sitemap.html">Plan du site</a></p> 18<p class="apache">Serveur Apache HTTP Version 2.4</p> 19<img alt="" src="/images/feather.gif" /></div> 20<div class="up"><a href="./"><img title="<-" alt="<-" src="/images/left.gif" /></a></div> 21<div id="path"> 22<a href="http://www.apache.org/">Apache</a> > <a href="http://httpd.apache.org/">Serveur HTTP</a> > <a href="http://httpd.apache.org/docs/">Documentation</a> > <a href="../">Version 2.4</a> > <a href="./">Documentations diverses</a></div><div id="page-content"><div id="preamble"><h1>Optimisation des performances d'Apache</h1> 23<div class="toplang"> 24<p><span>Langues Disponibles: </span><a href="/en/misc/perf-tuning.html" hreflang="en" rel="alternate" title="English"> en </a> | 25<a href="/fr/misc/perf-tuning.html" title="Fran�ais"> fr </a> | 26<a href="/ko/misc/perf-tuning.html" hreflang="ko" rel="alternate" title="Korean"> ko </a> | 27<a href="/tr/misc/perf-tuning.html" hreflang="tr" rel="alternate" title="T�rk�e"> tr </a></p> 28</div> 29 30 31 <p>Apache 2.x est un serveur web � usage g�n�ral, con�u dans un but 32 d'�quilibre entre souplesse, portabilit� et performances. Bien que non 33 con�u dans le seul but d'�tablir une r�f�rence en la mati�re, 34 Apache 2.x est capable de hautes performances dans de nombreuses situations 35 du monde r�el.</p> 36 37 <p>Compar�e � Apache 1.3, la version 2.x comporte de nombreuses 38 optimisations suppl�mentaires permettant d'am�liorer le d�bit du serveur 39 et sa personnalisation. La plupart de ces am�liorations sont activ�es par 40 d�faut. Cependant, certains choix de configuration � la compilation et � 41 l'ex�cution peuvent affecter les performances de mani�re significative. Ce 42 document d�crit les options qu'un administrateur de serveur peut configurer 43 pour am�liorer les performances d'une installation d'Apache 2.x. Certaines 44 de ces options de configuration permettent au d�mon httpd de mieux tirer 45 parti des possibilit�s du mat�riel et du syst�me d'exploitation, tandis 46 que d'autres permettent � l'administrateur de privil�gier la vitesse 47 par rapport aux fonctionnalit�s.</p> 48 49 </div> 50<div id="quickview"><ul id="toc"><li><img alt="" src="/images/down.gif" /> <a href="#hardware">Probl�mes mat�riels et relatifs au syst�me d'exploitation</a></li> 51<li><img alt="" src="/images/down.gif" /> <a href="#runtime">Optimisation de la configuration � l'ex�cution</a></li> 52<li><img alt="" src="/images/down.gif" /> <a href="#compiletime">Optimisation de la configuration � la compilation</a></li> 53<li><img alt="" src="/images/down.gif" /> <a href="#trace">Appendice : Analyse d�taill�e d'une trace</a></li> 54</ul><ul class="seealso"><li><a href="#comments_section">Commentaires</a></li></ul></div> 55<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div> 56<div class="section"> 57<h2><a name="hardware" id="hardware">Probl�mes mat�riels et relatifs au syst�me d'exploitation</a></h2> 58 59 60 61 <p>Le principal probl�me mat�riel qui affecte les performances du serveur 62 web est la m�moire vive (RAM). Un serveur web ne devrait jamais avoir � 63 utiliser le swap, car le swapping augmente le temps de r�ponse de chaque 64 requ�te au del� du point que les utilisateurs consid�rent comme 65 "trop lent". Ceci incite les utilisateurs � cliquer sur "Stop", puis 66 "Charger � nouveau", ce qui a pour effet d'augmenter encore la charge 67 du serveur. Vous pouvez, et m�me devez d�finir la valeur de la directive 68 <code class="directive"><a href="/mod/mpm_common.html#maxrequestworkers">MaxRequestWorkers</a></code> de fa�on � ce que 69 votre serveur ne lance pas un nombre de processus enfants tel qu'il 70 commence � faire du swapping. La m�thode pour y parvenir est 71 simple : d�terminez la taille de votre processus Apache standard en 72 consultant votre liste de processus � l'aide d'un outil tel que 73 <code>top</code>, et divisez votre quantit� totale de m�moire disponible 74 par cette taille, tout en gardant un espace suffisant 75 pour les autres processus.</p> 76 77 <p>Hormis ce r�glage relatif � la m�moire, le reste est trivial : le 78 processeur, la carte r�seau et les disques doivent �tre suffisamment 79 rapides, o� "suffisamment rapide" doit �tre d�termin� par 80 l'exp�rience.</p> 81 82 <p>Le choix du syst�me d'exploitation d�pend principalement du 83 contexte local. Voici cependant quelques conseils qui se sont 84 g�n�ralement av�r�s utiles :</p> 85 86 <ul> 87 <li> 88 <p>Ex�cutez la derni�re version stable et le niveau de patches le 89 plus haut du syst�me d'exploitation que vous avez choisi. De nombreux 90 �diteurs de syst�mes d'exploitation ont am�lior� de mani�re 91 significative les performances de leurs piles TCP et de leurs 92 biblioth�ques de thread ces derni�res ann�es.</p> 93 </li> 94 95 <li> 96 <p>Si votre syst�me d'exploitation poss�de un appel syst�me 97 <code>sendfile(2)</code>, assurez-vous d'avoir install� la version 98 et/ou les patches n�cessaires � son activation. (Pour Linux, par 99 exemple, cela se traduit par Linux 2.4 ou plus. Pour les versions 100 anciennes de Solaris 8, vous pouvez �tre amen� � appliquer un patch.) 101 Sur les syst�mes o� il est disponible, <code>sendfile</code> permet 102 � Apache 2 de servir les contenus statiques plus rapidement, tout en 103 induisant une charge CPU inf�rieure.</p> 104 </li> 105 </ul> 106 107 </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div> 108<div class="section"> 109<h2><a name="runtime" id="runtime">Optimisation de la configuration � l'ex�cution</a></h2> 110 111 112 113 <table class="related"><tr><th>Modules Apparent�s</th><th>Directives Apparent�es</th></tr><tr><td><ul><li><code class="module"><a href="/mod/mod_dir.html">mod_dir</a></code></li><li><code class="module"><a href="/mod/mpm_common.html">mpm_common</a></code></li><li><code class="module"><a href="/mod/mod_status.html">mod_status</a></code></li></ul></td><td><ul><li><code class="directive"><a href="/mod/core.html#allowoverride">AllowOverride</a></code></li><li><code class="directive"><a href="/mod/mod_dir.html#directoryindex">DirectoryIndex</a></code></li><li><code class="directive"><a href="/mod/core.html#hostnamelookups">HostnameLookups</a></code></li><li><code class="directive"><a href="/mod/core.html#enablemmap">EnableMMAP</a></code></li><li><code class="directive"><a href="/mod/core.html#enablesendfile">EnableSendfile</a></code></li><li><code class="directive"><a href="/mod/core.html#keepalivetimeout">KeepAliveTimeout</a></code></li><li><code class="directive"><a href="/mod/prefork.html#maxspareservers">MaxSpareServers</a></code></li><li><code class="directive"><a href="/mod/prefork.html#minspareservers">MinSpareServers</a></code></li><li><code class="directive"><a href="/mod/core.html#options">Options</a></code></li><li><code class="directive"><a href="/mod/mpm_common.html#startservers">StartServers</a></code></li></ul></td></tr></table> 114 115 <h3><a name="dns" id="dns">HostnameLookups et autres consid�rations � propos du DNS</a></h3> 116 117 118 119 <p>Avant Apache 1.3, la directive 120 <code class="directive"><a href="/mod/core.html#hostnamelookups">HostnameLookups</a></code> �tait positionn�e 121 par d�faut � <code>On</code>. Ce r�glage augmente le temps de r�ponse de 122 chaque requ�te car il entra�ne une recherche DNS et le traitement de la 123 requ�te ne pourra pas �tre achev� tant que cette recherche ne sera 124 pas termin�e. Avec Apache 1.3, ce r�glage est d�fini par d�faut � 125 <code>Off</code>. Si vous souhaitez que les adresses dans vos fichiers 126 journaux soient r�solues en noms d'h�tes, utilisez le programme 127 <code class="program"><a href="/programs/logresolve.html">logresolve</a></code> fourni avec Apache, ou un des nombreux 128 paquets g�n�rateurs de rapports sur les journaux disponibles.</p> 129 130 <p>Il est recommand� d'effectuer ce genre de traitement a posteriori 131 de vos fichiers journaux sur une autre machine que celle qui h�berge le 132 serveur web en production, afin que cette activit� n'affecte pas les 133 performances du serveur.</p> 134 135 <p>Si vous utilisez une directive 136 <code><code class="directive"><a href="/mod/mod_access_compat.html#allow">Allow</a></code>from domain</code> 137 ou 138 <code><code class="directive"><a href="/mod/mod_access_compat.html#deny">Deny</a></code> from domain</code> 139 (ce qui signifie que vous utilisez un nom d'h�te ou un nom de domaine � 140 la place d'une adresse IP), vous devrez compter avec deux recherches 141 DNS (une recherche inverse suivie d'une recherche directe pour 142 s'assurer que l'adresse IP n'a pas �t� usurp�e). C'est pourquoi il est 143 pr�f�rable, pour am�liorer les performances, d'utiliser des adresses IP 144 plut�t que des noms lorsqu'on utilise ces directives, du moins chaque 145 fois que c'est possible.</p> 146 147 <p>Notez qu'il est possible de modifier la port�e des directives, en les 148 pla�ant par exemple � l'int�rieur d'une section 149 <code><Location /server-status></code>. Les recherches DNS ne 150 seront alors effectu�es que pour les requ�tes qui satisfont aux crit�res. 151 Voici un exemple qui d�sactive les recherches DNS sauf pour les fichiers 152 <code>.html</code> et <code>.cgi</code> :</p> 153 154 <pre class="prettyprint lang-config">HostnameLookups off 155<Files ~ "\.(html|cgi)$"> 156 HostnameLookups on 157</Files></pre> 158 159 160 <p>Mais m�me dans ce cas, si vous n'avez besoin de noms DNS que dans 161 certains CGIs, vous pouvez effectuer l'appel � <code>gethostbyname</code> 162 dans les CGIs sp�cifiques qui en ont besoin.</p> 163 164 165 166 <h3><a name="symlinks" id="symlinks">FollowSymLinks et SymLinksIfOwnerMatch</a></h3> 167 168 169 170 <p>Chaque fois que la ligne <code>Options FollowSymLinks</code> sera 171 absente, ou que la ligne <code>Options SymLinksIfOwnerMatch</code> sera 172 pr�sente dans votre espace d'adressage, Apache devra effectuer des 173 appels syst�me suppl�mentaires pour v�rifier la pr�sence de liens 174 symboliques. Un appel suppl�mentaire par �l�ment du chemin du fichier. 175 Par exemple, si vous avez :</p> 176 177 <pre class="prettyprint lang-config">DocumentRoot /www/htdocs 178<Directory /> 179 Options SymLinksIfOwnerMatch 180</Directory></pre> 181 182 183 <p>et si une requ�te demande l'URI <code>/index.html</code>, Apache 184 effectuera un appel � <code>lstat(2)</code> pour 185 <code>/www</code>, <code>/www/htdocs</code>, et 186 <code>/www/htdocs/index.html</code>. Les r�sultats de ces appels � 187 <code>lstat</code> ne sont jamais mis en cache, ils devront donc �tre 188 g�n�r�s � nouveau pour chaque nouvelle requ�te. Si vous voulez absolument 189 v�rifier la s�curit� des liens symboliques, vous pouvez utiliser une 190 configuration du style :</p> 191 192 <pre class="prettyprint lang-config">DocumentRoot /www/htdocs 193<Directory /> 194 Options FollowSymLinks 195</Directory> 196 197<Directory /www/htdocs> 198 Options -FollowSymLinks +SymLinksIfOwnerMatch 199</Directory></pre> 200 201 202 <p>Ceci �vite au moins les v�rifications suppl�mentaires pour le chemin 203 d�fini par <code class="directive"><a href="/mod/core.html#documentroot">DocumentRoot</a></code>. Notez que 204 vous devrez ajouter des sections similaires si vous avez des chemins 205 d�finis par les directives 206 <code class="directive"><a href="/mod/mod_alias.html#alias">Alias</a></code> ou 207 <code class="directive"><a href="/mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> en dehors de 208 la racine de vos documents. Pour am�liorer les performances, et supprimer 209 toute protection des liens symboliques, ajoutez l'option 210 <code>FollowSymLinks</code> partout, et n'utilisez jamais l'option 211 <code>SymLinksIfOwnerMatch</code>.</p> 212 213 214 215 <h3><a name="htaccess" id="htaccess">AllowOverride</a></h3> 216 217 218 219 <p>Dans toute partie de votre espace d'adressage o� vous autoriserez 220 la surcharge de la configuration (en g�n�ral � l'aide de fichiers 221 <code>.htaccess</code>), Apache va tenter d'ouvrir <code>.htaccess</code> 222 pour chaque �l�ment du chemin du fichier demand�. Par exemple, si vous 223 avez : </p> 224 225 <pre class="prettyprint lang-config">DocumentRoot /www/htdocs 226<Directory /> 227 AllowOverride all 228</Directory></pre> 229 230 231 <p>et qu'une requ�te demande l'URI <code>/index.html</code>, Apache 232 tentera d'ouvrir <code>/.htaccess</code>, <code>/www/.htaccess</code>, 233 et <code>/www/htdocs/.htaccess</code>. Les solutions sont similaires � 234 celles �voqu�es pr�c�demment pour <code>Options FollowSymLinks</code>. 235 Pour am�liorer les performances, utilisez <code>AllowOverride None</code> 236 pour tous les niveaux de votre espace d'adressage.</p> 237 238 239 240 <h3><a name="negotiation" id="negotiation">N�gociation</a></h3> 241 242 243 244 <p>Dans la mesure du possible, �vitez toute n�gociation de contenu si 245 vous tenez au moindre gain en performances. En pratique toutefois, 246 les b�n�fices de la n�gociation l'emportent souvent sur la diminution 247 des performances. 248 Il y a cependant un cas dans lequel vous pouvez acc�l�rer le serveur. 249 Au lieu d'utiliser une directive g�n�rique comme :</p> 250 251 <pre class="prettyprint lang-config">DirectoryIndex index</pre> 252 253 254 <p>utilisez une liste explicite d'options :</p> 255 256 <pre class="prettyprint lang-config">DirectoryIndex index.cgi index.pl index.shtml index.html</pre> 257 258 259 <p>o� vous placez le choix courant en premi�re position.</p> 260 261 <p>Notez aussi que cr�er explicitement un fichier de 262 <code>correspondances de type</code> fournit de meilleures performances 263 que l'utilisation des <code>MultiViews</code>, car les informations 264 n�cessaires peuvent �tre simplement obtenues en lisant ce fichier, sans 265 avoir � parcourir le r�pertoire � la recherche de types de fichiers.</p> 266 267 <p>Par cons�quent, si la n�gociation de contenu est n�cessaire pour votre 268 site, pr�f�rez les fichiers de <code>correspondances de type</code> aux 269 directives <code>Options MultiViews</code> pour mener � bien cette 270 n�gociation. Se r�f�rer au document sur la 271 <a href="/content-negotiation.html">N�gociation de contenu</a> pour une 272 description compl�te des m�thodes de n�gociation, et les instructions 273 permettant de cr�er des fichiers de <code>correspondances de type</code>.</p> 274 275 276 277 <h3>Transfert en m�moire</h3> 278 279 280 281 <p>Dans les situations o� Apache 2.x doit consulter le contenu d'un 282 fichier en train d'�tre servi - par exemple � l'occasion du traitement 283 d'une inclusion c�t� serveur - il transf�re en g�n�ral le fichier en 284 m�moire si le syst�me d'exploitation supporte une forme quelconque 285 de <code>mmap(2)</code>.</p> 286 287 <p>Sur certains syst�mes, ce transfert en m�moire am�liore les 288 performances. Dans certains cas, ce transfert peut toutefois les d�grader 289 et m�me diminuer la stabilit� du d�mon httpd :</p> 290 291 <ul> 292 <li> 293 <p>Dans certains syst�mes d'exploitation, <code>mmap</code> devient 294 moins efficace que <code>read(2)</code> quand le nombre de 295 processeurs augmente. Sur les serveurs multiprocesseurs sous Solaris, 296 par exemple, Apache 2.x sert parfois les fichiers consult�s par le 297 serveur plus rapidement quand <code>mmap</code> est d�sactiv�.</p> 298 </li> 299 300 <li> 301 <p>Si vous transf�rez en m�moire un fichier localis� dans un syst�me 302 de fichiers mont� par NFS, et si un processus sur 303 une autre machine cliente NFS supprime ou tronque le fichier, votre 304 processus peut rencontrer une erreur de bus la prochaine fois qu'il 305 essaiera d'acc�der au contenu du fichier en m�moire.</p> 306 </li> 307 </ul> 308 309 <p>Pour les installations o� une de ces situations peut se produire, 310 vous devez utiliser <code>EnableMMAP off</code> afin de d�sactiver le 311 transfert en m�moire des fichiers servis. (Note : il est possible de 312 passer outre cette directive au niveau de chaque r�pertoire.)</p> 313 314 315 316 <h3>Sendfile</h3> 317 318 319 320 <p>Dans les cas o� Apache peut se permettre d'ignorer le contenu du 321 fichier � servir - par exemple, lorsqu'il sert un contenu de fichier 322 statique - il utilise en g�n�ral le support sendfile du noyau si le 323 syst�me d'exploitation supporte l'op�ration <code>sendfile(2)</code>.</p> 324 325 <p>Sur la plupart des plateformes, l'utilisation de sendfile am�liore 326 les performances en �liminant les m�canismes de lecture et envoi s�par�s. 327 Dans certains cas cependant, l'utilisation de sendfile peut nuire � la 328 stabilit� du d�mon httpd :</p> 329 330 <ul> 331 <li> 332 <p>Certaines plateformes peuvent pr�senter un support de sendfile 333 d�faillant que la construction du syst�me n'a pas d�tect�, en 334 particulier si les binaires ont �t� construits sur une autre machine 335 et transf�r�s sur la machine o� le support de sendfile est 336 d�faillant.</p> 337 </li> 338 <li> 339 <p>Dans le cas d'un syst�me de fichiers mont� 340 sous NFS, le noyau peut s'av�rer incapable de servir 341 les fichiers r�seau de mani�re fiable depuis 342 son propre cache.</p> 343 </li> 344 </ul> 345 346 <p>Pour les installations o� une de ces situations peut se produire, 347 vous devez utiliser <code>EnableSendfile off</code> afin de d�sactiver 348 la mise � disposition de contenus de fichiers par sendfile. (Note : il 349 est possible de passer outre cette directive au niveau de chaque 350 r�pertoire.)</p> 351 352 353 354 <h3><a name="process" id="process">Process Creation</a></h3> 355 356 357 358 <p>Avant Apache 1.3, les directives 359 <code class="directive"><a href="/mod/prefork.html#minspareservers">MinSpareServers</a></code>, 360 <code class="directive"><a href="/mod/prefork.html#maxspareservers">MaxSpareServers</a></code>, et 361 <code class="directive"><a href="/mod/mpm_common.html#startservers">StartServers</a></code> avaient des 362 effets drastiques sur les performances de r�f�rence. En particulier, 363 Apache avait besoin d'un d�lai de "mont�e en puissance" afin d'atteindre 364 un nombre de processus enfants suffisant pour supporter la charge qui lui 365 �tait appliqu�e. Apr�s le lancement initial des processus enfants par 366 <code class="directive"><a href="/mod/mpm_common.html#startservers">StartServers</a></code>, seulement un 367 processus enfant par seconde �tait cr�� afin d'atteindre la valeur de la 368 directive <code class="directive"><a href="/mod/prefork.html#minspareservers">MinSpareServers</a></code>. Ainsi, 369 un serveur acc�d� par 100 clients simultan�s et utilisant la valeur par 370 d�faut de <code>5</code> pour la directive 371 <code class="directive"><a href="/mod/mpm_common.html#startservers">StartServers</a></code>, n�cessitait 372 environ 95 secondes pour lancer suffisamment de processus enfants 373 permettant de faire face � la charge. Ceci fonctionne en pratique pour 374 les serveurs en production, car ils sont rarement red�marr�s. Ce n'est 375 cependant pas le cas pour les tests de r�f�rence (benchmarks) o� le 376 serveur ne fonctionne que 10 minutes.</p> 377 378 <p>La r�gle "un processus par seconde" avait �t� impl�ment�e afin 379 d'�viter l'enlisement de la machine dans le d�marrage de nouveaux 380 processus enfants. Pendant que la machine est occup�e � lancer des 381 processus enfants, elle ne peut pas traiter les requ�tes. Mais cette 382 r�gle impactait tellement la perception des performances d'Apache qu'elle 383 a d� �tre remplac�e. A partir d'Apache 1.3, le code a assoupli la r�gle 384 "un processus par seconde". Il va en lancer un, attendre une seconde, 385 puis en lancer deux, attendre une seconde, puis en lancer quatre et 386 ainsi de suite jusqu'� lancer 32 processus. Il s'arr�tera lorsque le 387 nombre de processus aura atteint la valeur d�finie par la directive 388 <code class="directive"><a href="/mod/prefork.html#minspareservers">MinSpareServers</a></code>.</p> 389 390 <p>Ceci s'av�re suffisamment r�actif pour pouvoir en g�n�ral se passer 391 de manipuler les valeurs des directives 392 <code class="directive"><a href="/mod/prefork.html#minspareservers">MinSpareServers</a></code>, 393 <code class="directive"><a href="/mod/prefork.html#maxspareservers">MaxSpareServers</a></code> et 394 <code class="directive"><a href="/mod/mpm_common.html#startservers">StartServers</a></code>. Lorsque plus de 395 4 processus enfants sont lanc�s par seconde, un message est �mis vers 396 le journal des erreurs. Si vous voyez appara�tre souvent ce genre de 397 message, vous devez vous pencher sur ces r�glages. Pour vous guider, 398 utilisez les informations d�livr�es par le module 399 <code class="module"><a href="/mod/mod_status.html">mod_status</a></code>.</p> 400 401 <p>� mettre en relation avec la cr�ation de processus, leur destruction 402 est d�finie par la valeur de la directive 403 <code class="directive"><a href="/mod/mpm_common.html#maxconnectionsperchild">MaxConnectionsPerChild</a></code>. Sa valeur 404 par d�faut est <code>0</code>, ce qui signifie qu'il n'y a pas de limite 405 au nombre de connexions qu'un processus enfant peut traiter. Si votre 406 configuration actuelle a cette directive r�gl�e � une valeur tr�s basse, 407 de l'ordre de <code>30</code>, il est conseill� de l'augmenter de mani�re 408 significative. Si vous utilisez SunOs ou une ancienne version de Solaris, 409 utilisez une valeur de l'ordre de <code>10000</code> � cause des fuites 410 de m�moire.</p> 411 412 <p>Lorsqu'ils sont en mode "keep-alive", les processus enfants sont 413 maintenus et ne font rien sinon attendre la prochaine requ�te sur la 414 connexion d�j� ouverte. La valeur par d�faut de <code>5</code> de la 415 directive <code class="directive"><a href="/mod/core.html#keepalivetimeout">KeepAliveTimeout</a></code> tend � 416 minimiser cet effet. Il faut trouver le bon compromis entre la bande 417 passante r�seau et les ressources du serveur. En aucun cas vous ne devez 418 choisir une valeur sup�rieure � <code>60</code> seconds, car 419 <a href="http://www.hpl.hp.com/techreports/Compaq-DEC/WRL-95-4.html"> 420 la plupart des b�n�fices sont alors perdus</a>.</p> 421 422 423 424 </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div> 425<div class="section"> 426<h2><a name="compiletime" id="compiletime">Optimisation de la configuration � la compilation</a></h2> 427 428 429 430 <h3>Choisir un Module Multi-Processus (MPM)</h3> 431 432 433 434 <p>Apache 2.x supporte les mod�les simultan�s enfichables, appel�s 435 <a href="/mpm.html">Modules Multi-Processus</a> (MPMs). Vous devez 436 choisir un MPM au moment de la construction d'Apache. Certaines 437 plateformes ont des modules MPM sp�cifiques : 438 <code class="module"><a href="/mod/mpm_netware.html">mpm_netware</a></code>, <code class="module"><a href="/mod/mpmt_os2.html">mpmt_os2</a></code> et 439 <code class="module"><a href="/mod/mpm_winnt.html">mpm_winnt</a></code>. Sur les syst�mes de type Unix, vous avez le 440 choix entre un grand nombre de modules MPM. Le choix du MPM peut affecter 441 la vitesse et l'�volutivit� du d�mon httpd :</p> 442 443 <ul> 444 445 <li>Le MPM <code class="module"><a href="/mod/worker.html">worker</a></code> utilise plusieurs processus 446 enfants poss�dant chacun de nombreux threads. Chaque thread g�re une 447 seule connexion � la fois. Worker est en g�n�ral un bon choix pour les 448 serveurs pr�sentant un traffic important car il poss�de une empreinte 449 m�moire plus petite que le MPM prefork.</li> 450 451 <li>Comme le MPM Worker, le MPM <code class="module"><a href="/mod/event.html">event</a></code> utilise 452 les threads, mais il a �t� con�u pour traiter davantage de 453 requ�tes simultan�ment en confiant une partie du travail � des 454 threads de support, ce qui permet aux threads principaux de 455 traiter de nouvelles requ�tes.</li> 456 457 <li>Le MPM <code class="module"><a href="/mod/prefork.html">prefork</a></code> utilise plusieurs processus enfants 458 poss�dant chacun un seul thread. Chaque processus g�re une seule 459 connexion � la fois. Sur de nombreux syst�mes, prefork est comparable 460 en mati�re de vitesse � worker, mais il utilise plus de m�moire. De par 461 sa conception sans thread, prefork pr�sente des avantages par rapport � 462 worker dans certaines situations : il peut �tre utilis� avec les 463 modules tiers qui ne supportent pas le threading, et son d�bogage est plus 464 ais� sur les platesformes pr�sentant un support du d�bogage des threads 465 rudimentaire.</li> 466 467 </ul> 468 469 <p>Pour plus d'informations sur ces deux MPMs et les autres, veuillez 470 vous r�f�rer � la <a href="/mpm.html">documentation sur les 471 MPM</a>.</p> 472 473 474 475 <h3><a name="modules" id="modules">Modules</a></h3> 476 477 478 479 <p>Comme le contr�le de l'utilisation de la m�moire est tr�s important 480 en mati�re de performance, il est conseill� d'�liminer les modules que 481 vous n'utilisez pas vraiment. Si vous avez construit ces modules en 482 tant que <a href="/dso.html">DSOs</a>, leur �limination consiste 483 simplement � commenter la directive 484 <code class="directive"><a href="/mod/mod_so.html#loadmodule">LoadModule</a></code> associ�e � ce 485 module. Ceci vous permet de v�rifier si votre site fonctionne toujours 486 apr�s la suppression de tel ou tel module.</p> 487 488 <p>Par contre, si les modules que vous voulez supprimer sont li�s 489 statiquement � votre binaire Apache, vous devrez recompiler ce dernier 490 afin de pouvoir les �liminer.</p> 491 492 <p>La question qui d�coule de ce qui pr�c�de est �videmment de 493 savoir de quels modules vous avez besoin et desquels vous pouvez vous 494 passer. La r�ponse sera bien entendu diff�rente d'un site web � 495 l'autre. Cependant, la liste <em>minimale</em> de modules n�cessaire � 496 la survie de votre site contiendra certainement 497 <code class="module"><a href="/mod/mod_mime.html">mod_mime</a></code>, <code class="module"><a href="/mod/mod_dir.html">mod_dir</a></code> et 498 <code class="module"><a href="/mod/mod_log_config.html">mod_log_config</a></code>. <code>mod_log_config</code> est bien 499 entendu optionnel puisque vous pouvez faire fonctionner un site web 500 en se passant de fichiers journaux ; ceci est cependant 501 d�conseill�.</p> 502 503 504 505 <h3>Op�rations atomiques</h3> 506 507 508 509 <p>Certains modules, � l'instar de <code class="module"><a href="/mod/mod_cache.html">mod_cache</a></code> et des 510 versions de d�veloppement r�centes du MPM worker, utilisent l'API 511 atomique d'APR. Cette API propose des op�rations atomiques que l'on 512 peut utiliser pour all�ger la synchronisation des threads.</p> 513 514 <p>Par d�faut, APR impl�mente ces op�rations en utilisant les 515 m�canismes les plus efficaces disponibles sur chaque plateforme cible 516 (Syst�me d'exploitation et processeur). De nombreux processeurs modernes, 517 par exemple, poss�dent une instruction qui effectue une op�ration 518 atomique de type comparaison et �change ou compare-and-swap (CAS) au 519 niveau mat�riel. Sur certaines platesformes cependant, APR utilise par 520 d�faut une impl�mentation de l'API atomique plus lente, bas�e sur les 521 mutex, afin d'assurer la compatibilit� avec les anciens mod�les de 522 processeurs qui ne poss�dent pas ce genre d'instruction. Si vous 523 construisez Apache pour une de ces platesformes, et ne pr�voyez de 524 l'ex�cuter que sur des processeurs r�cents, vous pouvez s�lectionner une 525 impl�mentation atomique plus rapide � la compilation en utilisant 526 l'option <code>--enable-nonportable-atomics</code> du 527 script configure :</p> 528 529 <div class="example"><p><code> 530 /buildconf<br /> 531 /configure --with-mpm=worker --enable-nonportable-atomics=yes 532 </code></p></div> 533 534 <p>L'option <code>--enable-nonportable-atomics</code> concerne les 535 platesformes suivantes :</p> 536 537 <ul> 538 539 <li>Solaris sur SPARC<br /> 540 Sur Solaris/SPARC, APR utilise par d�faut les op�rations 541 atomiques bas�es sur les mutex. Cependant, si vous ajoutez l'option 542 <code>--enable-nonportable-atomics</code> au script configure, APR 543 g�n�re un code qui utilise le code op�ration SPARC v8plus pour des 544 op�rations de compare-and-swap mat�riel plus rapides. Si vous 545 utilisez cette option de configure avec Apache, les op�rations 546 atomiques seront plus efficaces (permettant d'all�ger la charge du 547 processeur et un plus haut niveau de simultan�it�), mais 548 l'ex�cutable produit ne fonctionnera que sur les processeurs 549 UltraSPARC. 550 </li> 551 552 <li>Linux sur x86<br /> 553 Sous Linux, APR utilise par d�faut les op�rations atomiques bas�es 554 sur les mutex. Cependant, si vous ajoutez l'option 555 <code>--enable-nonportable-atomics</code> au script configure, 556 APR g�n�rera un code qui utilise un code d'op�ration du 486 557 pour des op�rations de compare-and-swap mat�riel plus rapides. Le 558 code r�sultant est plus efficace en mati�re d'op�rations atomiques, 559 mais l'ex�cutable produit ne fonctionnera que sur des processeurs 560 486 et sup�rieurs (et non sur des 386). 561 </li> 562 563 </ul> 564 565 566 567 <h3>Module mod_status et ExtendedStatus On</h3> 568 569 570 571 <p>Si vous incluez le module <code class="module"><a href="/mod/mod_status.html">mod_status</a></code> � la 572 construction d'Apache et ajoutez <code>ExtendedStatus On</code> � sa 573 configuration, Apache va effectuer pour chaque requ�te deux appels � 574 <code>gettimeofday(2)</code> (ou <code>times(2)</code> selon votre 575 syst�me d'exploitation), et (pour les versions ant�rieures � 1.3) de 576 nombreux appels suppl�mentaires � <code>time(2)</code>. Tous ces 577 appels sont effectu�s afin que le rapport de statut puisse contenir 578 des indications temporelles. Pour am�liorer les performances, utilisez 579 <code>ExtendedStatus off</code> (qui est le r�glage par d�faut).</p> 580 581 582 583 <h3>accept Serialization - points de connexion � un programme (sockets) multiples</h3> 584 585 586 587 <div class="warning"><h3>Mise en garde :</h3> 588 <p>Cette section n'a pas �t� totalement mise � jour car elle ne tient pas 589 compte des changements intervenus dans la version 2.x du Serveur HTTP 590 Apache. Certaines informations sont encore pertinentes, il vous est 591 cependant conseill� de les utiliser avec prudence.</p> 592 </div> 593 594 <p>Ce qui suit est une br�ve discussion � propos de l'API des sockets 595 Unix. Supposons que votre serveur web utilise plusieurs directives 596 <code class="directive"><a href="/mod/mpm_common.html#listen">Listen</a></code> afin d'�couter 597 plusieurs ports ou de multiples adresses. Afin de tester chaque socket 598 pour voir s'il a une connexion en attente, Apache utilise 599 <code>select(2)</code>. <code>select(2)</code> indique si un socket a 600 <em>z�ro</em> ou <em>au moins une</em> connexion en attente. Le mod�le 601 d'Apache comporte plusieurs processus enfants, et tous ceux qui sont 602 inactifs testent la pr�sence de nouvelles connexions au m�me moment. 603 Une impl�mentation rudimentaire de ceci pourrait ressembler � 604 l'exemple suivant 605 (ces exemples ne sont pas extraits du code d'Apache, ils ne sont 606 propos�s qu'� des fins p�dagogiques) :</p> 607 608 <pre class="prettyprint lang-c"> for (;;) { 609 for (;;) { 610 fd_set accept_fds; 611 612 FD_ZERO (&accept_fds); 613 for (i = first_socket; i <= last_socket; ++i) { 614 FD_SET (i, &accept_fds); 615 } 616 rc = select (last_socket+1, &accept_fds, NULL, NULL, NULL); 617 if (rc < 1) continue; 618 new_connection = -1; 619 for (i = first_socket; i <= last_socket; ++i) { 620 if (FD_ISSET (i, &accept_fds)) { 621 new_connection = accept (i, NULL, NULL); 622 if (new_connection != -1) break; 623 } 624 } 625 if (new_connection != -1) break; 626 } 627 process_the(new_connection); 628 }</pre> 629 630 631 <p>Mais cette impl�mentation rudimentaire pr�sente une s�rieuse lacune. 632 Rappelez-vous que les processus enfants ex�cutent cette boucle au m�me 633 moment ; ils vont ainsi bloquer sur <code>select</code> s'ils se trouvent 634 entre deux requ�tes. Tous ces processus bloqu�s vont se r�activer et 635 sortir de <code>select</code> quand une requ�te va appara�tre sur un des 636 sockets (le nombre de processus enfants qui se r�activent varie en 637 fonction du syst�me d'exploitation et des r�glages de synchronisation). 638 Ils vont alors tous entrer dans la boucle et tenter un 639 <code>"accept"</code> de la connexion. Mais seulement un d'entre eux y 640 parviendra (en supposant qu'il ne reste q'une seule connexion en 641 attente), les autres vont se bloquer au niveau de <code>accept</code>. 642 Ceci verrouille vraiment ces processus de telle sorte qu'ils ne peuvent 643 plus servir de requ�tes que par cet unique socket, et il en sera ainsi 644 jusqu'� ce que suffisamment de nouvelles requ�tes apparaissent sur ce 645 socket pour les r�activer tous. Cette lacune a �t� document�e pour la 646 premi�re fois dans 647 <a href="http://bugs.apache.org/index/full/467">PR#467</a>. Il existe 648 au moins deux solutions.</p> 649 650 <p>La premi�re consiste � rendre les sockets non blocants. Dans ce cas, 651 <code>accept</code> ne bloquera pas les processus enfants, et ils 652 pourront continuer � s'ex�cuter imm�diatement. Mais ceci consomme des 653 ressources processeur. Supposons que vous ayez dix processus enfants 654 inactifs dans <code>select</code>, et qu'une connexion arrive. 655 Neuf des dix processus vont se r�activer, tenter un <code>accept</code> 656 de la connexion, �chouer, et boucler dans <code>select</code>, tout en 657 n'ayant finalement rien accompli. Pendant ce temps, aucun de ces processus 658 ne traite les requ�tes qui arrivent sur d'autres sockets jusqu'� ce 659 qu'ils retournent dans <code>select</code>. Finalement, cette solution 660 ne semble pas tr�s efficace, � moins que vous ne disposiez d'autant de 661 processeurs inactifs (dans un serveur multiprocesseur) que de processus 662 enfants inactifs, ce qui n'est pas une situation tr�s courante.</p> 663 664 <p>Une autre solution, celle qu'utilise Apache, consiste � s�rialiser les 665 entr�es dans la boucle interne. La boucle ressemble � ceci (les 666 diff�rences sont mises en surbrillance) :</p> 667 668 <pre class="prettyprint lang-c"> for (;;) { 669 <strong>accept_mutex_on ();</strong> 670 for (;;) { 671 fd_set accept_fds; 672 673 FD_ZERO (&accept_fds); 674 for (i = first_socket; i <= last_socket; ++i) { 675 FD_SET (i, &accept_fds); 676 } 677 rc = select (last_socket+1, &accept_fds, NULL, NULL, NULL); 678 if (rc < 1) continue; 679 new_connection = -1; 680 for (i = first_socket; i <= last_socket; ++i) { 681 if (FD_ISSET (i, &accept_fds)) { 682 new_connection = accept (i, NULL, NULL); 683 if (new_connection != -1) break; 684 } 685 } 686 if (new_connection != -1) break; 687 } 688 <strong>accept_mutex_off ();</strong> 689 process the new_connection; 690 }</pre> 691 692 693 <p><a id="serialize" name="serialize">Les fonctions</a> 694 <code>accept_mutex_on</code> et <code>accept_mutex_off</code> 695 impl�mentent un s�maphore permettant une exclusion mutuelle. Un seul 696 processus enfant � la fois peut poss�der le mutex. Plusieurs choix se 697 pr�sentent pour impl�menter ces mutex. Ce choix est d�fini dans 698 <code>src/conf.h</code> (versions ant�rieures � 1.3) ou 699 <code>src/include/ap_config.h</code> (versions 1.3 ou sup�rieures). 700 Certaines architectures ne font pas ce choix du mode de verrouillage ; 701 l'utilisation de directives 702 <code class="directive"><a href="/mod/mpm_common.html#listen">Listen</a></code> multiples sur ces 703 architectures est donc peu s�r.</p> 704 705 <p>La directive <code class="directive"><a href="/mod/core.html#mutex">Mutex</a></code> permet 706 de modifier l'impl�mentation du mutex <code>mpm-accept</code> � 707 l'ex�cution. Des consid�rations sp�cifiques aux diff�rentes 708 impl�mentations de mutex sont document�es avec cette directive.</p> 709 710 <p>Une autre solution qui a �t� imagin�e mais jamais impl�ment�e, consiste 711 � s�rialiser partiellement la boucle -- c'est � dire y faire entrer un 712 certain nombre de processus. Ceci ne pr�senterait un int�r�t que sur les 713 machines multiprocesseurs o� plusieurs processus enfants peuvent 714 s'ex�cuter simultan�ment, et encore, la s�rialisation ne tire pas 715 vraiment parti de toute la bande passante. C'est une possibilit� 716 d'investigation future, mais demeure de priorit� basse car les serveurs 717 web � architecture hautement parall�le ne sont pas la norme.</p> 718 719 <p>Pour bien faire, vous devriez faire fonctionner votre serveur sans 720 directives <code class="directive"><a href="/mod/mpm_common.html#listen">Listen</a></code> multiples 721 si vous visez les performances les plus �lev�es. 722 Mais lisez ce qui suit.</p> 723 724 725 726 <h3>accept Serialization - point de connexion � un programme (sockets) unique</h3> 727 728 729 730 <p>Ce qui pr�c�de convient pour les serveurs � sockets multiples, mais 731 qu'en est-il des serveurs � socket unique ? En th�orie, ils ne 732 devraient pas rencontrer les m�mes probl�mes car tous les processus 733 enfants peuvent se bloquer dans <code>accept(2)</code> jusqu'� ce qu'une 734 connexion arrive, et ils ne sont pas utilis�s � ne rien faire. En 735 pratique, ceci dissimule un m�me comportement de bouclage 736 discut� plus haut dans la solution non-blocante. De la mani�re dont 737 sont impl�ment�es les piles TCP, le noyau r�active v�ritablement tous les 738 processus bloqu�s dans <code>accept</code> quand une seule connexion 739 arrive. Un de ces processus prend la connexion en compte et retourne 740 dans l'espace utilisateur, les autres bouclant dans l'espace du 741 noyau et se d�sactivant quand ils s'aper�oivent qu'il n'y a pas de 742 connexion pour eux. Ce bouclage est invisible depuis le code de l'espace 743 utilisateur, mais il est quand-m�me pr�sent. Ceci peut conduire � la 744 m�me augmentation de charge � perte que la solution non blocante au cas 745 des sockets multiples peut induire.</p> 746 747 <p>Pour cette raison, il appara�t que de nombreuses architectures se 748 comportent plus "proprement" si on s�rialise m�me dans le cas d'une socket 749 unique. Il s'agit en fait du comportement par d�faut dans la plupart des 750 cas. Des exp�riences pouss�es sous Linux (noyau 2.0.30 sur un 751 biprocesseur Pentium pro 166 avec 128 Mo de RAM) ont montr� que la 752 s�rialisation d'une socket unique provoque une diminution inf�rieure � 3% 753 du nombre de requ�tes par secondes par rapport au traitement non 754 s�rialis�. Mais le traitement non s�rialis� des sockets uniques induit 755 un temps de r�ponse suppl�mentaire de 100 ms pour chaque requ�te. Ce 756 temps de r�ponse est probablement provoqu� par une limitation sur les 757 lignes � haute charge, et ne constitue un probl�me que sur les r�seaux 758 locaux. Si vous voulez vous passer de la s�rialisation des sockets 759 uniques, vous pouvez d�finir 760 <code>SINGLE_LISTEN_UNSERIALIZED_ACCEPT</code> et les 761 serveurs � socket unique ne pratiqueront plus du tout la 762 s�rialisation.</p> 763 764 765 766 <h3>Fermeture en prenant son temps (Lingering close)</h3> 767 768 769 770 <p>Comme discut� dans <a href="http://www.ics.uci.edu/pub/ietf/http/draft-ietf-http-connection-00.txt"> 771 draft-ietf-http-connection-00.txt</a> section 8, pour impl�menter de 772 mani�re <strong>fiable</strong> le protocole, un serveur HTTP doit fermer 773 les deux directions d'une communication ind�pendamment (rappelez-vous 774 qu'une connexion TCP est bidirectionnelle, chaque direction �tant 775 ind�pendante de l'autre).</p> 776 777 <p>Quand cette fonctionnalit� fut ajout�e � Apache, elle causa une 778 avalanche de probl�mes sur plusieurs versions d'Unix � cause d'une 779 impl�mentation � courte vue. La sp�cification TCP ne pr�cise pas que 780 l'�tat <code>FIN_WAIT_2</code> poss�de un temps de r�ponse mais elle ne 781 l'exclut pas. Sur les syst�mes qui n'introduisent pas ce temps de 782 r�ponse, Apache 1.2 induit de nombreux blocages d�finitifs de socket 783 dans l'�tat <code>FIN_WAIT_2</code>. On peut eviter ceci dans de nombreux 784 cas tout simplement en mettant � jour TCP/IP avec le dernier patch mis � 785 disposition par le fournisseur. Dans les cas o� le fournisseur n'a 786 jamais fourni de patch (par exemple, SunOS4 -- bien que les utilisateurs 787 poss�dant une license source puissent le patcher eux-m�mes), nous avons 788 d�cid� de d�sactiver cette fonctionnalit�.</p> 789 790 <p>Il y a deux m�thodes pour arriver � ce r�sultat. La premi�re est 791 l'option de socket <code>SO_LINGER</code>. Mais le sort a voulu que cette 792 solution ne soit jamais impl�ment�e correctement dans la plupart des 793 piles TCP/IP. Et m�me dans les rares cas o� cette solution a �t� 794 impl�ment�e correctement (par exemple Linux 2.0.31), elle se 795 montre beaucoup plus gourmande (en temps processeur) que la solution 796 suivante.</p> 797 798 <p>Pour la plus grande partie, Apache impl�mente cette solution � l'aide 799 d'une fonction appel�e <code>lingering_close</code> (d�finie dans 800 <code>http_main.c</code>). La fonction ressemble approximativement � 801 ceci :</p> 802 803 <pre class="prettyprint lang-c"> void lingering_close (int s) 804 { 805 char junk_buffer[2048]; 806 807 /* shutdown the sending side */ 808 shutdown (s, 1); 809 810 signal (SIGALRM, lingering_death); 811 alarm (30); 812 813 for (;;) { 814 select (s for reading, 2 second timeout); 815 if (error) break; 816 if (s is ready for reading) { 817 if (read (s, junk_buffer, sizeof (junk_buffer)) <= 0) { 818 break; 819 } 820 /* just toss away whatever is here */ 821 } 822 } 823 824 close (s); 825 }</pre> 826 827 828 <p>Ceci ajoute naturellement un peu de charge � la fin d'une connexion, 829 mais s'av�re n�cessaire pour une impl�mentation fiable. Comme HTTP/1.1 830 est de plus en plus pr�sent et que toutes les connexions sont 831 persistentes, la charge sera amortie par la multiplicit� des requ�tes. 832 Si vous voulez jouer avec le feu en d�sactivant cette fonctionnalit�, 833 vous pouvez d�finir <code>NO_LINGCLOSE</code>, mais c'est fortement 834 d�conseill�. En particulier, comme les connexions persistantes en 835 pipeline de HTTP/1.1 commencent � �tre utilis�es, 836 <code>lingering_close</code> devient une absolue n�cessit� (et les 837 <a href="http://www.w3.org/Protocols/HTTP/Performance/Pipeline.html"> 838 connexions en pipeline sont plus rapides</a> ; vous avez donc tout 839 int�r�t � les supporter).</p> 840 841 842 843 <h3>Fichier tableau de bord (Scoreboard file)</h3> 844 845 846 847 <p>Les processus parent et enfants d'Apache communiquent entre eux � 848 l'aide d'un objet appel� "Tableau de bord" (Scoreboard). Id�alement, cet 849 �change devrait s'effectuer en m�moire partag�e. Pour les syst�mes 850 d'exploitation auxquels nous avons eu acc�s, ou pour lesquels nous avons 851 obtenu des informations suffisamment d�taill�es pour effectuer un 852 portage, cet �change est en g�n�ral impl�ment� en utilisant la m�moire 853 partag�e. Pour les autres, on utilise par d�faut un fichier d'�change sur 854 disque. Le fichier d'�change sur disque est non seulement lent, mais 855 aussi peu fiable (et propose moins de fonctionnalit�s). Recherchez dans 856 le fichier <code>src/main/conf.h</code> correspondant � votre 857 architecture soit <code>USE_MMAP_SCOREBOARD</code>, soit 858 <code>USE_SHMGET_SCOREBOARD</code>. La d�finition de l'un des deux 859 (ainsi que leurs compagnons respectifs <code>HAVE_MMAP</code> et 860 <code>HAVE_SHMGET</code>), active le code fourni pour la m�moire 861 partag�e. Si votre syst�me propose une autre solution pour la gestion de 862 la m�moire partag�e, �ditez le fichier <code>src/main/http_main.c</code> 863 et ajoutez la portion de code n�cessaire pour pouvoir l'utiliser dans 864 Apache (Merci de nous envoyer aussi le patch correspondant).</p> 865 866 <div class="note">Note � caract�re historique : le portage d'Apache sous Linux 867 n'utilisait pas la m�moire partag�e avant la version 1.2. Ceci entra�nait 868 un comportement tr�s rudimentaire et peu fiable des versions ant�rieures 869 d'Apache sous Linux.</div> 870 871 872 873 <h3>DYNAMIC_MODULE_LIMIT</h3> 874 875 876 877 <p>Si vous n'avez pas l'intention d'utiliser les modules charg�s 878 dynamiquement (ce qui est probablement le cas si vous �tes en train de 879 lire ce document afin de personnaliser votre serveur en recherchant le 880 moindre des gains en performances), vous pouvez ajouter la d�finition 881 <code>-DDYNAMIC_MODULE_LIMIT=0</code> � la construction de votre serveur. 882 Ceci aura pour effet de lib�rer la m�moire RAM allou�e pour le 883 chargement dynamique des modules.</p> 884 885 886 887 </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div> 888<div class="section"> 889<h2><a name="trace" id="trace">Appendice : Analyse d�taill�e d'une trace</a></h2> 890 891 892 893 <p>Voici la trace d'un appel syst�me d'Apache 2.0.38 avec le MPM worker 894 sous Solaris 8. Cette trace a �t� collect�e � l'aide de la commande :</p> 895 896 <div class="example"><p><code> 897 truss -l -p <var>httpd_child_pid</var>. 898 </code></p></div> 899 900 <p>L'option <code>-l</code> demande � truss de tracer l'ID du LWP 901 (lightweight process--la version de Solaris des threads niveau noyau) qui 902 invoque chaque appel syst�me.</p> 903 904 <p>Les autres syst�mes peuvent proposer des utilitaires de tra�age 905 des appels syst�me diff�rents comme <code>strace</code>, 906 <code>ktrace</code>, ou <code>par</code>. Ils produisent cependant tous une 907 trace similaire.</p> 908 909 <p>Dans cette trace, un client a demand� un fichier statique de 10 ko au 910 d�mon httpd. Le tra�age des requ�tes pour des contenus non statiques 911 ou comportant une n�gociation de contenu a une pr�sentation 912 diff�rente (et m�me assez laide dans certains cas).</p> 913 914 <div class="example"><pre>/67: accept(3, 0x00200BEC, 0x00200C0C, 1) (sleeping...) 915/67: accept(3, 0x00200BEC, 0x00200C0C, 1) = 9</pre></div> 916 917 <p>Dans cette trace, le thread � l'�coute s'ex�cute � l'int�rieur de 918 LWP #67.</p> 919 920 <div class="note">Notez l'absence de la s�rialisation d'<code>accept(2)</code>. Sur 921 cette plateforme sp�cifique, le MPM worker utilise un accept non s�rialis� 922 par d�faut sauf s'il est en �coute sur des ports multiples.</div> 923 924 <div class="example"><pre>/65: lwp_park(0x00000000, 0) = 0 925/67: lwp_unpark(65, 1) = 0</pre></div> 926 927 <p>Apr�s avoir accept� la connexion, le thread � l'�coute r�active un 928 thread du worker pour effectuer le traitement de la requ�te. Dans cette 929 trace, le thread du worker qui traite la requ�te est associ� � 930 LWP #65.</p> 931 932 <div class="example"><pre>/65: getsockname(9, 0x00200BA4, 0x00200BC4, 1) = 0</pre></div> 933 934 <p>Afin de pouvoir impl�menter les h�tes virtuels, Apache doit conna�tre 935 l'adresse du socket local utilis� pour accepter la connexion. On pourrait 936 supprimer cet appel dans de nombreuses situations (par exemple dans le cas 937 o� il n'y a pas d'h�te virtuel ou dans le cas o� les directives 938 <code class="directive"><a href="/mod/mpm_common.html#listen">Listen</a></code> contiennent des adresses 939 sans caract�res de substitution). Mais aucun effort n'a �t� accompli � ce 940 jour pour effectuer ces optimisations.</p> 941 942 <div class="example"><pre>/65: brk(0x002170E8) = 0 943/65: brk(0x002190E8) = 0</pre></div> 944 945 <p>L'appel <code>brk(2)</code> alloue de la m�moire dans le tas. Ceci est 946 rarement visible dans une trace d'appel syst�me, car le d�mon httpd 947 utilise des allocateurs m�moire de son cru (<code>apr_pool</code> et 948 <code>apr_bucket_alloc</code>) pour la plupart des traitements de requ�tes. 949 Dans cette trace, le d�mon httpd vient juste de d�marrer, et il doit 950 appeler <code>malloc(3)</code> pour r�server les blocs de m�moire 951 n�cessaires � la cr�ation de ses propres allocateurs de m�moire.</p> 952 953 <div class="example"><pre>/65: fcntl(9, F_GETFL, 0x00000000) = 2 954/65: fstat64(9, 0xFAF7B818) = 0 955/65: getsockopt(9, 65535, 8192, 0xFAF7B918, 0xFAF7B910, 2190656) = 0 956/65: fstat64(9, 0xFAF7B818) = 0 957/65: getsockopt(9, 65535, 8192, 0xFAF7B918, 0xFAF7B914, 2190656) = 0 958/65: setsockopt(9, 65535, 8192, 0xFAF7B918, 4, 2190656) = 0 959/65: fcntl(9, F_SETFL, 0x00000082) = 0</pre></div> 960 961 <p>Ensuite, le thread de worker passe la connexion du client (descripteur 962 de fichier 9) en mode non blocant. Les appels <code>setsockopt(2)</code> 963 et <code>getsockopt(2)</code> constituent un effet de bord de la mani�re 964 dont la libc de Solaris utilise <code>fcntl(2)</code> pour les sockets.</p> 965 966 <div class="example"><pre>/65: read(9, " G E T / 1 0 k . h t m".., 8000) = 97</pre></div> 967 968 <p>Le thread de worker lit la requ�te du client.</p> 969 970 <div class="example"><pre>/65: stat("/var/httpd/apache/httpd-8999/htdocs/10k.html", 0xFAF7B978) = 0 971/65: open("/var/httpd/apache/httpd-8999/htdocs/10k.html", O_RDONLY) = 10</pre></div> 972 973 <p>Ce d�mon httpd a �t� configur� avec les options 974 <code>Options FollowSymLinks</code> et <code>AllowOverride None</code>. Il 975 n'a donc ni besoin d'appeler <code>lstat(2)</code> pour chaque r�pertoire 976 du chemin du fichier demand�, ni besoin de v�rifier la pr�sence de fichiers 977 <code>.htaccess</code>. Il appelle simplement <code>stat(2)</code> pour 978 v�rifier d'une part que le fichier existe, et d'autre part que c'est un 979 fichier r�gulier, et non un r�pertoire.</p> 980 981 <div class="example"><pre>/65: sendfilev(0, 9, 0x00200F90, 2, 0xFAF7B53C) = 10269</pre></div> 982 983 <p>Dans cet exemple, le d�mon httpd peut envoyer l'en-t�te de la r�ponse 984 HTTP et le fichier demand� � l'aide d'un seul appel syst�me 985 <code>sendfilev(2)</code>. La s�mantique de sendfile varie en fonction des 986 syst�mes d'exploitation. Sur certains autres syst�mes, il faut faire un 987 appel � <code>write(2)</code> ou <code>writev(2)</code> pour envoyer les 988 en-t�tes avant d'appeler <code>sendfile(2)</code>.</p> 989 990 <div class="example"><pre>/65: write(4, " 1 2 7 . 0 . 0 . 1 - ".., 78) = 78</pre></div> 991 992 <p>Cet appel � <code>write(2)</code> enregistre la requ�te dans le journal 993 des acc�s. Notez qu'une des choses manquant � cette trace est un appel � 994 <code>time(2)</code>. A la diff�rence d'Apache 1.3, Apache 2.x utilise 995 <code>gettimeofday(3)</code> pour consulter l'heure. Sur certains syst�mes 996 d'exploitation, comme Linux ou Solaris, <code>gettimeofday</code> est 997 impl�ment� de mani�re optimis�e de telle sorte qu'il consomme moins de 998 ressources qu'un appel syst�me habituel.</p> 999 1000 <div class="example"><pre>/65: shutdown(9, 1, 1) = 0 1001/65: poll(0xFAF7B980, 1, 2000) = 1 1002/65: read(9, 0xFAF7BC20, 512) = 0 1003/65: close(9) = 0</pre></div> 1004 1005 <p>Le thread de worker effectue une fermeture "en prenant son temps" 1006 (lingering close) de la connexion.</p> 1007 1008 <div class="example"><pre>/65: close(10) = 0 1009/65: lwp_park(0x00000000, 0) (sleeping...)</pre></div> 1010 1011 <p>Enfin, le thread de worker ferme le fichier qu'il vient de d�livrer et 1012 se bloque jusqu'� ce que le thread en �coute lui assigne une autre 1013 connexion.</p> 1014 1015 <div class="example"><pre>/67: accept(3, 0x001FEB74, 0x001FEB94, 1) (sleeping...)</pre></div> 1016 1017 <p>Pendant ce temps, le thread � l'�coute peut accepter une autre connexion 1018 � partir du moment o� il a assign� la connexion pr�sente � un thread de 1019 worker (selon une certaine logique de contr�le de flux dans le MPM worker 1020 qui impose des limites au thread � l'�coute si tous les threads de worker 1021 sont occup�s). Bien que cela n'apparaisse pas dans cette trace, 1022 l'<code>accept(2)</code> suivant peut (et le fait en g�n�ral, en situation 1023 de charge �lev�e) s'ex�cuter en parall�le avec le traitement de la 1024 connexion qui vient d'�tre accept�e par le thread de worker.</p> 1025 1026 </div></div> 1027<div class="bottomlang"> 1028<p><span>Langues Disponibles: </span><a href="/en/misc/perf-tuning.html" hreflang="en" rel="alternate" title="English"> en </a> | 1029<a href="/fr/misc/perf-tuning.html" title="Fran�ais"> fr </a> | 1030<a href="/ko/misc/perf-tuning.html" hreflang="ko" rel="alternate" title="Korean"> ko </a> | 1031<a href="/tr/misc/perf-tuning.html" hreflang="tr" rel="alternate" title="T�rk�e"> tr </a></p> 1032</div><div class="top"><a href="#page-header"><img src="/images/up.gif" alt="top" /></a></div><div class="section"><h2><a id="comments_section" name="comments_section">Commentaires</a></h2><div class="warning"><strong>Notice:</strong><br />This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed again by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Freenode, or sent to our <a href="http://httpd.apache.org/lists.html">mailing lists</a>.</div> 1033<script type="text/javascript"><!--//--><![CDATA[//><!-- 1034var comments_shortname = 'httpd'; 1035var comments_identifier = 'http://httpd.apache.org/docs/2.4/misc/perf-tuning.html'; 1036(function(w, d) { 1037 if (w.location.hostname.toLowerCase() == "httpd.apache.org") { 1038 d.write('<div id="comments_thread"><\/div>'); 1039 var s = d.createElement('script'); 1040 s.type = 'text/javascript'; 1041 s.async = true; 1042 s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier; 1043 (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s); 1044 } 1045 else { 1046 d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>'); 1047 } 1048})(window, document); 1049//--><!]]></script></div><div id="footer"> 1050<p class="apache">Copyright 2014 The Apache Software Foundation.<br />Autoris� sous <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p> 1051<p class="menu"><a href="/mod/">Modules</a> | <a href="/mod/directives.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="/glossary.html">Glossaire</a> | <a href="/sitemap.html">Plan du site</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!-- 1052if (typeof(prettyPrint) !== 'undefined') { 1053 prettyPrint(); 1054} 1055//--><!]]></script> 1056</body></html>