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="&lt;-" alt="&lt;-" src="/images/left.gif" /></a></div>
21<div id="path">
22<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">Serveur HTTP</a> &gt; <a href="http://httpd.apache.org/docs/">Documentation</a> &gt; <a href="../">Version 2.4</a> &gt; <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">&nbsp;en&nbsp;</a> |
25<a href="/fr/misc/perf-tuning.html" title="Fran�ais">&nbsp;fr&nbsp;</a> |
26<a href="/ko/misc/perf-tuning.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
27<a href="/tr/misc/perf-tuning.html" hreflang="tr" rel="alternate" title="T�rk�e">&nbsp;tr&nbsp;</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>&lt;Location /server-status&gt;</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&lt;Files ~ "\.(html|cgi)$"&gt;
156  HostnameLookups on
157&lt;/Files&gt;</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&lt;Directory /&gt;
179  Options SymLinksIfOwnerMatch
180&lt;/Directory&gt;</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&lt;Directory /&gt;
194  Options FollowSymLinks
195&lt;/Directory&gt;
196
197&lt;Directory /www/htdocs&gt;
198  Options -FollowSymLinks +SymLinksIfOwnerMatch
199&lt;/Directory&gt;</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&lt;Directory /&gt;
227  AllowOverride all
228&lt;/Directory&gt;</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 (&amp;accept_fds);
613            for (i = first_socket; i &lt;= last_socket; ++i) {
614              FD_SET (i, &amp;accept_fds);
615            }
616            rc = select (last_socket+1, &amp;accept_fds, NULL, NULL, NULL);
617            if (rc &lt; 1) continue;
618            new_connection = -1;
619            for (i = first_socket; i &lt;= last_socket; ++i) {
620              if (FD_ISSET (i, &amp;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 (&amp;accept_fds);
674            for (i = first_socket; i &lt;= last_socket; ++i) {
675              FD_SET (i, &amp;accept_fds);
676            }
677            rc = select (last_socket+1, &amp;accept_fds, NULL, NULL, NULL);
678            if (rc &lt; 1) continue;
679            new_connection = -1;
680            for (i = first_socket; i &lt;= last_socket; ++i) {
681              if (FD_ISSET (i, &amp;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)) &lt;= 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">&nbsp;en&nbsp;</a> |
1029<a href="/fr/misc/perf-tuning.html" title="Fran�ais">&nbsp;fr&nbsp;</a> |
1030<a href="/ko/misc/perf-tuning.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
1031<a href="/tr/misc/perf-tuning.html" hreflang="tr" rel="alternate" title="T�rk�e">&nbsp;tr&nbsp;</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&amp;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>