mirror of
				https://github.com/apache/httpd.git
				synced 2025-11-03 17:53:20 +03:00 
			
		
		
		
	git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1776970 13f79535-47bb-0310-9956-ffa450edef68
		
			
				
	
	
		
			1018 lines
		
	
	
		
			53 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			1018 lines
		
	
	
		
			53 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
<?xml version="1.0" encoding="ISO-8859-1"?>
 | 
						||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 | 
						||
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr"><head>
 | 
						||
<meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type" />
 | 
						||
<!--
 | 
						||
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 | 
						||
              This file is generated from xml source: DO NOT EDIT
 | 
						||
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 | 
						||
      -->
 | 
						||
<title>Optimisation des performances d'Apache - Serveur Apache HTTP Version 2.5</title>
 | 
						||
<link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
 | 
						||
<link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
 | 
						||
<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" />
 | 
						||
<script src="../style/scripts/prettify.min.js" type="text/javascript">
 | 
						||
</script>
 | 
						||
 | 
						||
<link href="../images/favicon.ico" rel="shortcut icon" /></head>
 | 
						||
<body id="manual-page"><div id="page-header">
 | 
						||
<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/quickreference.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>
 | 
						||
<p class="apache">Serveur Apache HTTP Version 2.5</p>
 | 
						||
<img alt="" src="../images/feather.png" /></div>
 | 
						||
<div class="up"><a href="./"><img title="<-" alt="<-" src="../images/left.gif" /></a></div>
 | 
						||
<div id="path">
 | 
						||
<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.5</a> > <a href="./">Documentations diverses</a></div><div id="page-content"><div id="preamble"><h1>Optimisation des performances d'Apache</h1>
 | 
						||
<div class="toplang">
 | 
						||
<p><span>Langues Disponibles: </span><a href="../en/misc/perf-tuning.html" hreflang="en" rel="alternate" title="English"> en </a> |
 | 
						||
<a href="../fr/misc/perf-tuning.html" title="Fran<61>ais"> fr </a> |
 | 
						||
<a href="../ko/misc/perf-tuning.html" hreflang="ko" rel="alternate" title="Korean"> ko </a> |
 | 
						||
<a href="../tr/misc/perf-tuning.html" hreflang="tr" rel="alternate" title="T<>rk<72>e"> tr </a></p>
 | 
						||
</div>
 | 
						||
 | 
						||
 | 
						||
    <div class="warning"><h3>Avertissement</h3>
 | 
						||
      <p>Ce document est en partie obsol<6F>te et son contenu peut s'av<61>rer
 | 
						||
      inappropri<72>.</p>
 | 
						||
    </div>
 | 
						||
 | 
						||
    <p>Apache 2.4 est un serveur web <20> usage g<>n<EFBFBD>ral, con<6F>u dans un but
 | 
						||
    d'<27>quilibre entre souplesse, portabilit<69> et performances. Bien que non
 | 
						||
    con<6F>u dans le seul but d'<27>tablir une r<>f<EFBFBD>rence en la mati<74>re,
 | 
						||
    Apache 2.4 est capable de hautes performances dans de nombreuses situations
 | 
						||
    du monde r<>el.</p>
 | 
						||
 | 
						||
    <p>Ce
 | 
						||
    document d<>crit les options qu'un administrateur de serveur peut configurer
 | 
						||
    pour am<61>liorer les performances d'une installation d'Apache 2.4. Certaines
 | 
						||
    de ces options de configuration permettent au d<>mon httpd de mieux tirer
 | 
						||
    parti des possibilit<69>s du mat<61>riel et du syst<73>me d'exploitation, tandis
 | 
						||
    que d'autres permettent <20> l'administrateur de privil<69>gier la vitesse
 | 
						||
    par rapport aux fonctionnalit<69>s.</p>
 | 
						||
 | 
						||
  </div>
 | 
						||
<div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif" /> <a href="#hardware">Probl<62>mes mat<61>riels et relatifs au syst<73>me d'exploitation</a></li>
 | 
						||
<li><img alt="" src="../images/down.gif" /> <a href="#runtime">Optimisation de la configuration <20> l'ex<65>cution</a></li>
 | 
						||
<li><img alt="" src="../images/down.gif" /> <a href="#compiletime">Optimisation de la configuration <20> la compilation</a></li>
 | 
						||
<li><img alt="" src="../images/down.gif" /> <a href="#trace">Appendice : Analyse d<>taill<6C>e d'une trace</a></li>
 | 
						||
</ul><h3>Voir aussi</h3><ul class="seealso"><li><a href="#comments_section">Commentaires</a></li></ul></div>
 | 
						||
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
 | 
						||
<div class="section">
 | 
						||
<h2><a name="hardware" id="hardware">Probl<62>mes mat<61>riels et relatifs au syst<73>me d'exploitation</a></h2>
 | 
						||
 | 
						||
    
 | 
						||
 | 
						||
    <p>Le principal probl<62>me mat<61>riel qui affecte les performances du serveur
 | 
						||
    web est la m<>moire vive (RAM). Un serveur web ne devrait jamais avoir <20>
 | 
						||
    utiliser le swap, car le swapping augmente le temps de r<>ponse de chaque
 | 
						||
    requ<71>te au del<65> du point que les utilisateurs consid<69>rent comme
 | 
						||
    "trop lent". Ceci incite les utilisateurs <20> cliquer sur "Stop", puis
 | 
						||
    "Charger <20> nouveau", ce qui a pour effet d'augmenter encore la charge
 | 
						||
    du serveur. Vous pouvez, et m<>me devez d<>finir la valeur de la directive
 | 
						||
    <code class="directive"><a href="../mod/mpm_common.html#maxrequestworkers">MaxRequestWorkers</a></code> de fa<66>on <20> ce que
 | 
						||
    votre serveur ne lance pas un nombre de processus enfants tel qu'il
 | 
						||
    commence <20> faire du swapping. La m<>thode pour y parvenir est
 | 
						||
    simple : d<>terminez la taille de votre processus Apache standard en
 | 
						||
    consultant votre liste de processus <20> l'aide d'un outil tel que
 | 
						||
    <code>top</code>, et divisez votre quantit<69> totale de m<>moire disponible
 | 
						||
    par cette taille, tout en gardant un espace suffisant
 | 
						||
    pour les autres processus.</p>
 | 
						||
 | 
						||
    <p>Hormis ce r<>glage relatif <20> la m<>moire, le reste est trivial : le
 | 
						||
    processeur, la carte r<>seau et les disques doivent <20>tre suffisamment
 | 
						||
    rapides, o<> "suffisamment rapide" doit <20>tre d<>termin<69> par
 | 
						||
    l'exp<78>rience.</p>
 | 
						||
 | 
						||
    <p>Le choix du syst<73>me d'exploitation d<>pend principalement du
 | 
						||
    contexte local. Voici cependant quelques conseils qui se sont
 | 
						||
    g<>n<EFBFBD>ralement av<61>r<EFBFBD>s utiles :</p>
 | 
						||
 | 
						||
    <ul>
 | 
						||
      <li>
 | 
						||
        <p>Ex<45>cutez la derni<6E>re version stable et le niveau de patches le
 | 
						||
	plus haut du syst<73>me d'exploitation que vous avez choisi. De nombreux
 | 
						||
	<09>diteurs de syst<73>mes d'exploitation ont am<61>lior<6F> de mani<6E>re
 | 
						||
	significative les performances de leurs piles TCP et de leurs
 | 
						||
	biblioth<74>ques de thread ces derni<6E>res ann<6E>es.</p>
 | 
						||
      </li>
 | 
						||
 | 
						||
      <li>
 | 
						||
        <p>Si votre syst<73>me d'exploitation poss<73>de un appel syst<73>me
 | 
						||
	<code>sendfile(2)</code>, assurez-vous d'avoir install<6C> la version
 | 
						||
	et/ou les patches n<>cessaires <20> son activation. (Pour Linux, par
 | 
						||
	exemple, cela se traduit par Linux 2.4 ou plus. Pour les versions
 | 
						||
	anciennes de Solaris 8, vous pouvez <20>tre amen<65> <20> appliquer un patch.)
 | 
						||
	Sur les syst<73>mes o<> il est disponible, <code>sendfile</code> permet
 | 
						||
	<09> Apache de servir les contenus statiques plus rapidement, tout en
 | 
						||
	induisant une charge CPU inf<6E>rieure.</p>
 | 
						||
      </li>
 | 
						||
    </ul>
 | 
						||
 | 
						||
  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
 | 
						||
<div class="section">
 | 
						||
<h2><a name="runtime" id="runtime">Optimisation de la configuration <20> l'ex<65>cution</a></h2>
 | 
						||
 | 
						||
    
 | 
						||
 | 
						||
    <table class="related"><tr><th>Modules Apparent<6E>s</th><th>Directives Apparent<6E>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>
 | 
						||
 | 
						||
    <h3><a name="dns" id="dns">HostnameLookups et autres consid<69>rations <20> propos du DNS</a></h3>
 | 
						||
 | 
						||
      
 | 
						||
 | 
						||
      <p>Avant Apache 1.3, la directive
 | 
						||
      <code class="directive"><a href="../mod/core.html#hostnamelookups">HostnameLookups</a></code> <20>tait positionn<6E>e
 | 
						||
      par d<>faut <20> <code>On</code>, ce qui impliquait une recherche DNS et donc un temps d'attente
 | 
						||
      suppl<70>mentaire pour chaque requ<71>te. Avec Apache 2.4, <code class="directive"><a href="../mod/core.html#hostnamelookups">HostnameLookups</a></code> est positionn<6E>e par d<>faut <20>
 | 
						||
      <code>Off</code>. Si vous avez besoin de convertir des adresses IP en noms
 | 
						||
      d'h<>tes dans vos fichiers journaux, il est pr<70>f<EFBFBD>rable d'effectuer un
 | 
						||
      traitement <20> post<73>riori plut<75>t que de forcer Apache <20> le faire en temps
 | 
						||
      r<>el. Il est recommand<6E> d'effectuer ce genre de traitement a posteriori
 | 
						||
      de vos fichiers journaux sur une autre machine que celle qui h<>berge le
 | 
						||
      serveur web en production, afin que cette activit<69> n'affecte pas les
 | 
						||
      performances du serveur.</p>
 | 
						||
 | 
						||
      <p>Si vous utilisez une directive
 | 
						||
      <code><code class="directive"><a href="../mod/mod_access_compat.html#allow">Allow</a></code>from domain</code>
 | 
						||
      ou
 | 
						||
      <code><code class="directive"><a href="../mod/mod_access_compat.html#deny">Deny</a></code> from domain</code>
 | 
						||
      (ce qui signifie que vous utilisez un nom d'h<>te ou un nom de domaine <20>
 | 
						||
      la place d'une adresse IP), vous devrez compter avec deux recherches
 | 
						||
      DNS (une recherche inverse suivie d'une recherche directe pour
 | 
						||
      s'assurer que l'adresse IP n'a pas <20>t<EFBFBD> usurp<72>e). C'est pourquoi il est
 | 
						||
      pr<70>f<EFBFBD>rable, pour am<61>liorer les performances, et chaque fois que c'est
 | 
						||
      possible, d'utiliser des adresses IP plut<75>t que des noms de domaines.</p>
 | 
						||
 | 
						||
      <div class="warning"><h3>Avertissement :</h3>
 | 
						||
      <p>Veuillez utiliser la directive <code class="directive"><a href="../mod/mod_authz_core.html#require">Require</a></code> avec Apache 2.4 ; pour plus de
 | 
						||
      d<>tails, reportez-vous au <a href="../upgrading.html">guide de mise <20>
 | 
						||
      jour</a> correspondant.</p>
 | 
						||
      </div>
 | 
						||
 | 
						||
      <p>Notez qu'il est possible de modifier la port<72>e des directives, en les
 | 
						||
      pla<6C>ant par exemple <20> l'int<6E>rieur d'une section
 | 
						||
      <code><Location "/server-status"></code>. Les recherches DNS ne
 | 
						||
      seront alors effectu<74>es que pour les requ<71>tes qui satisfont aux crit<69>res.
 | 
						||
      Voici un exemple qui d<>sactive les recherches DNS sauf pour les fichiers
 | 
						||
      <code>.html</code> et <code>.cgi</code> :</p>
 | 
						||
 | 
						||
      <pre class="prettyprint lang-config"><Files ~ "\.(html|cgi)$">
 | 
						||
  HostnameLookups on
 | 
						||
</Files></pre>
 | 
						||
 | 
						||
 | 
						||
      <p>Mais m<>me dans ce cas, si vous n'avez besoin de noms DNS que dans
 | 
						||
      certains CGIs, vous pouvez effectuer l'appel <20> <code>gethostbyname</code>
 | 
						||
      dans les CGIs sp<73>cifiques qui en ont besoin.</p>
 | 
						||
 | 
						||
    
 | 
						||
 | 
						||
    <h3><a name="symlinks" id="symlinks">FollowSymLinks et SymLinksIfOwnerMatch</a></h3>
 | 
						||
 | 
						||
      
 | 
						||
 | 
						||
      <p>Chaque fois que la ligne <code>Options FollowSymLinks</code> sera
 | 
						||
      absente, ou que la ligne <code>Options SymLinksIfOwnerMatch</code> sera
 | 
						||
      pr<70>sente dans votre espace d'adressage, Apache devra effectuer des
 | 
						||
      appels syst<73>me suppl<70>mentaires pour v<>rifier la pr<70>sence de liens
 | 
						||
      symboliques. Un appel suppl<70>mentaire par <20>l<EFBFBD>ment du chemin du fichier.
 | 
						||
      Par exemple, si vous avez :</p>
 | 
						||
 | 
						||
      <pre class="prettyprint lang-config">DocumentRoot "/www/htdocs"
 | 
						||
<Directory "/">
 | 
						||
  Options SymLinksIfOwnerMatch
 | 
						||
</Directory></pre>
 | 
						||
 | 
						||
 | 
						||
      <p>et si une requ<71>te demande l'URI <code>/index.html</code>, Apache
 | 
						||
      effectuera un appel <20> <code>lstat(2)</code> pour
 | 
						||
      <code>/www</code>, <code>/www/htdocs</code>, et
 | 
						||
      <code>/www/htdocs/index.html</code>. Les r<>sultats de ces appels <20>
 | 
						||
      <code>lstat</code> ne sont jamais mis en cache, ils devront donc <20>tre
 | 
						||
      g<>n<EFBFBD>r<EFBFBD>s <20> nouveau pour chaque nouvelle requ<71>te. Si vous voulez absolument
 | 
						||
      v<>rifier la s<>curit<69> des liens symboliques, vous pouvez utiliser une
 | 
						||
      configuration du style :</p>
 | 
						||
 | 
						||
      <pre class="prettyprint lang-config">DocumentRoot "/www/htdocs"
 | 
						||
<Directory "/">
 | 
						||
  Options FollowSymLinks
 | 
						||
</Directory>
 | 
						||
 | 
						||
<Directory "/www/htdocs">
 | 
						||
  Options -FollowSymLinks +SymLinksIfOwnerMatch
 | 
						||
</Directory></pre>
 | 
						||
 | 
						||
 | 
						||
      <p>Ceci <20>vite au moins les v<>rifications suppl<70>mentaires pour le chemin
 | 
						||
      d<>fini par <code class="directive"><a href="../mod/core.html#documentroot">DocumentRoot</a></code>. Notez que
 | 
						||
      vous devrez ajouter des sections similaires si vous avez des chemins
 | 
						||
      d<>finis par les directives
 | 
						||
      <code class="directive"><a href="../mod/mod_alias.html#alias">Alias</a></code> ou
 | 
						||
      <code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code> en dehors de
 | 
						||
      la racine de vos documents. Pour am<61>liorer les performances, et supprimer
 | 
						||
      toute protection des liens symboliques, ajoutez l'option
 | 
						||
      <code>FollowSymLinks</code> partout, et n'utilisez jamais l'option
 | 
						||
      <code>SymLinksIfOwnerMatch</code>.</p>
 | 
						||
 | 
						||
    
 | 
						||
 | 
						||
    <h3><a name="htaccess" id="htaccess">AllowOverride</a></h3>
 | 
						||
 | 
						||
      
 | 
						||
 | 
						||
      <p>Dans toute partie de votre espace d'adressage o<> vous autoriserez
 | 
						||
      la surcharge de la configuration (en g<>n<EFBFBD>ral <20> l'aide de fichiers
 | 
						||
      <code>.htaccess</code>), Apache va tenter d'ouvrir <code>.htaccess</code>
 | 
						||
      pour chaque <20>l<EFBFBD>ment du chemin du fichier demand<6E>. Par exemple, si vous
 | 
						||
      avez : </p>
 | 
						||
 | 
						||
      <pre class="prettyprint lang-config">DocumentRoot "/www/htdocs"
 | 
						||
<Directory "/">
 | 
						||
  AllowOverride all
 | 
						||
</Directory></pre>
 | 
						||
 | 
						||
 | 
						||
      <p>et qu'une requ<71>te demande l'URI <code>/index.html</code>, Apache
 | 
						||
      tentera d'ouvrir <code>/.htaccess</code>, <code>/www/.htaccess</code>,
 | 
						||
      et <code>/www/htdocs/.htaccess</code>. Les solutions sont similaires <20>
 | 
						||
      celles <20>voqu<71>es pr<70>c<EFBFBD>demment pour <code>Options FollowSymLinks</code>.
 | 
						||
      Pour am<61>liorer les performances, utilisez <code>AllowOverride None</code>
 | 
						||
      pour tous les niveaux de votre espace d'adressage.</p>
 | 
						||
 | 
						||
    
 | 
						||
 | 
						||
    <h3><a name="negotiation" id="negotiation">N<>gociation</a></h3>
 | 
						||
 | 
						||
      
 | 
						||
 | 
						||
      <p>Dans la mesure du possible, <20>vitez toute n<>gociation de contenu si
 | 
						||
      vous tenez au moindre gain en performances. En pratique toutefois,
 | 
						||
      les b<>n<EFBFBD>fices de la n<>gociation l'emportent souvent sur la diminution
 | 
						||
      des performances.
 | 
						||
      Il y a cependant un cas dans lequel vous pouvez acc<63>l<EFBFBD>rer le serveur.
 | 
						||
      Au lieu d'utiliser une directive g<>n<EFBFBD>rique comme :</p>
 | 
						||
 | 
						||
      <pre class="prettyprint lang-config">DirectoryIndex index</pre>
 | 
						||
 | 
						||
 | 
						||
      <p>utilisez une liste explicite d'options :</p>
 | 
						||
 | 
						||
      <pre class="prettyprint lang-config">DirectoryIndex index.cgi index.pl index.shtml index.html</pre>
 | 
						||
 | 
						||
 | 
						||
      <p>o<> vous placez le choix courant en premi<6D>re position.</p>
 | 
						||
 | 
						||
      <p>Notez aussi que cr<63>er explicitement un fichier de
 | 
						||
      <code>correspondances de type</code> fournit de meilleures performances
 | 
						||
      que l'utilisation des <code>MultiViews</code>, car les informations
 | 
						||
      n<>cessaires peuvent <20>tre simplement obtenues en lisant ce fichier, sans
 | 
						||
      avoir <20> parcourir le r<>pertoire <20> la recherche de types de fichiers.</p>
 | 
						||
 | 
						||
    <p>Par cons<6E>quent, si la n<>gociation de contenu est n<>cessaire pour votre
 | 
						||
    site, pr<70>f<EFBFBD>rez les fichiers de <code>correspondances de type</code> aux
 | 
						||
    directives <code>Options MultiViews</code> pour mener <20> bien cette
 | 
						||
    n<>gociation. Se r<>f<EFBFBD>rer au document sur la
 | 
						||
    <a href="../content-negotiation.html">N<>gociation de contenu</a> pour une
 | 
						||
    description compl<70>te des m<>thodes de n<>gociation, et les instructions
 | 
						||
    permettant de cr<63>er des fichiers de <code>correspondances de type</code>.</p>
 | 
						||
 | 
						||
    
 | 
						||
 | 
						||
    <h3>Transfert en m<>moire</h3>
 | 
						||
 | 
						||
      
 | 
						||
 | 
						||
      <p>Dans les situations o<> Apache 2.x doit consulter le contenu d'un
 | 
						||
      fichier en train d'<27>tre servi - par exemple <20> l'occasion du traitement
 | 
						||
      d'une inclusion c<>t<EFBFBD> serveur - il transf<73>re en g<>n<EFBFBD>ral le fichier en
 | 
						||
      m<>moire si le syst<73>me d'exploitation supporte une forme quelconque
 | 
						||
      de <code>mmap(2)</code>.</p>
 | 
						||
 | 
						||
      <p>Sur certains syst<73>mes, ce transfert en m<>moire am<61>liore les
 | 
						||
      performances. Dans certains cas, ce transfert peut toutefois les d<>grader
 | 
						||
      et m<>me diminuer la stabilit<69> du d<>mon httpd :</p>
 | 
						||
 | 
						||
      <ul>
 | 
						||
        <li>
 | 
						||
          <p>Dans certains syst<73>mes d'exploitation, <code>mmap</code> devient
 | 
						||
	  moins efficace que <code>read(2)</code> quand le nombre de
 | 
						||
	  processeurs augmente. Sur les serveurs multiprocesseurs sous Solaris,
 | 
						||
	  par exemple, Apache 2.x sert parfois les fichiers consult<6C>s par le
 | 
						||
	  serveur plus rapidement quand <code>mmap</code> est d<>sactiv<69>.</p>
 | 
						||
        </li>
 | 
						||
 | 
						||
        <li>
 | 
						||
          <p>Si vous transf<73>rez en m<>moire un fichier localis<69> dans un syst<73>me
 | 
						||
	  de fichiers mont<6E> par NFS, et si un processus sur
 | 
						||
	  une autre machine cliente NFS supprime ou tronque le fichier, votre
 | 
						||
	  processus peut rencontrer une erreur de bus la prochaine fois qu'il
 | 
						||
	  essaiera d'acc<63>der au contenu du fichier en m<>moire.</p>
 | 
						||
        </li>
 | 
						||
      </ul>
 | 
						||
 | 
						||
      <p>Pour les installations o<> une de ces situations peut se produire,
 | 
						||
      vous devez utiliser <code>EnableMMAP off</code> afin de d<>sactiver le
 | 
						||
      transfert en m<>moire des fichiers servis. (Note : il est possible de
 | 
						||
      passer outre cette directive au niveau de chaque r<>pertoire.)</p>
 | 
						||
 | 
						||
    
 | 
						||
 | 
						||
    <h3>Sendfile</h3>
 | 
						||
 | 
						||
      
 | 
						||
 | 
						||
      <p>Dans les cas o<> Apache peut se permettre d'ignorer le contenu du
 | 
						||
      fichier <20> servir - par exemple, lorsqu'il sert un contenu de fichier
 | 
						||
      statique - il utilise en g<>n<EFBFBD>ral le support sendfile du noyau si le
 | 
						||
      syst<73>me d'exploitation supporte l'op<6F>ration <code>sendfile(2)</code>.</p>
 | 
						||
 | 
						||
      <p>Sur la plupart des plateformes, l'utilisation de sendfile am<61>liore
 | 
						||
      les performances en <20>liminant les m<>canismes de lecture et envoi s<>par<61>s.
 | 
						||
      Dans certains cas cependant, l'utilisation de sendfile peut nuire <20> la
 | 
						||
      stabilit<69> du d<>mon httpd :</p>
 | 
						||
 | 
						||
      <ul>
 | 
						||
        <li>
 | 
						||
          <p>Certaines plateformes peuvent pr<70>senter un support de sendfile
 | 
						||
	  d<>faillant que la construction du syst<73>me n'a pas d<>tect<63>, en
 | 
						||
	  particulier si les binaires ont <20>t<EFBFBD> construits sur une autre machine
 | 
						||
	  et transf<73>r<EFBFBD>s sur la machine o<> le support de sendfile est
 | 
						||
	  d<>faillant.</p>
 | 
						||
        </li>
 | 
						||
        <li>
 | 
						||
          <p>Dans le cas d'un syst<73>me de fichiers mont<6E>
 | 
						||
	  sous NFS, le noyau peut s'av<61>rer incapable de servir
 | 
						||
	  les fichiers r<>seau de mani<6E>re fiable depuis
 | 
						||
	  son propre cache.</p>
 | 
						||
        </li>
 | 
						||
      </ul>
 | 
						||
 | 
						||
      <p>Pour les installations o<> une de ces situations peut se produire,
 | 
						||
      vous devez utiliser <code>EnableSendfile off</code> afin de d<>sactiver
 | 
						||
      la mise <20> disposition de contenus de fichiers par sendfile. (Note : il
 | 
						||
      est possible de passer outre cette directive au niveau de chaque
 | 
						||
      r<>pertoire.)</p>
 | 
						||
 | 
						||
    
 | 
						||
 | 
						||
    <h3><a name="process" id="process">Recyclage des processus enfants</a></h3>
 | 
						||
 | 
						||
      
 | 
						||
 | 
						||
    <p>La directive <code class="directive"><a href="../mod/mpm_common.html#maxconnectionsperchild">MaxConnectionsPerChild</a></code> permet de limiter le
 | 
						||
    nombre de connexions qu'un processus enfant peut g<>rer au cours de sa vie
 | 
						||
    (par d<>faut, la valeur est <code>0</code>, soit aucune limite). Tous les <a href="../mpm.html#defaults">MPMs</a> sont concern<72>s, m<>me ceux qui utilisent
 | 
						||
    des threads. Par exemple, chaque processus cr<63><72> par le MPM
 | 
						||
    <code class="module"><a href="../mod/worker.html">worker</a></code> lance plusieurs threads qui g<>rent les connexions,
 | 
						||
    mais cette directive n'en affecte pas le nombre total. Cela signifie
 | 
						||
    seulement que la valeur de la directive <code class="directive"><a href="../mod/mpm_common.html#maxconnectionsperchild">MaxConnectionsPerChild</a></code> ne limitera que le
 | 
						||
    nombre de requ<71>tes trait<69>es par les threads lanc<6E>s par un seul processus
 | 
						||
    enfant.</p>
 | 
						||
 | 
						||
    <p>Dans des conditions d'utilisation optimales, la directive <code class="directive"><a href="../mod/mpm_common.html#maxconnectionsperchild">MaxConnectionsPerChild</a></code> ne devrait imposer
 | 
						||
    aucune limite, car il n'y a <20> priori aucune raison de tuer un processus, si
 | 
						||
    ce n'est suite <20> un bug logiciel causant des fuites de m<>moire ou un usage
 | 
						||
    excessif du CPU.</p>   
 | 
						||
 | 
						||
    <p>Lorsque le mode "keep-alive" est activ<69>, un processus (ou un thread lanc<6E>
 | 
						||
    par un processus) est
 | 
						||
    maintenu et ne fait rien sinon attendre la prochaine requ<71>te sur la
 | 
						||
    connexion d<>j<EFBFBD> ouverte. La valeur par d<>faut de <code>5</code> de la
 | 
						||
    directive <code class="directive"><a href="../mod/core.html#keepalivetimeout">KeepAliveTimeout</a></code> tend <20>
 | 
						||
    minimiser cet effet. Il faut trouver le bon compromis entre la bande
 | 
						||
    passante r<>seau et les ressources du serveur.</p>
 | 
						||
 | 
						||
    
 | 
						||
 | 
						||
  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
 | 
						||
<div class="section">
 | 
						||
<h2><a name="compiletime" id="compiletime">Optimisation de la configuration <20> la compilation</a></h2>
 | 
						||
 | 
						||
    
 | 
						||
 | 
						||
    <h3>Choisir un Module Multi-Processus (MPM)</h3>
 | 
						||
 | 
						||
      
 | 
						||
 | 
						||
      <p>Apache 2.x supporte les mod<6F>les simultan<61>s enfichables, appel<65>s
 | 
						||
      <a href="../mpm.html">Modules Multi-Processus</a> (MPMs). Vous devez
 | 
						||
      choisir un MPM au moment de la construction d'Apache. Certaines
 | 
						||
      plateformes ont des modules MPM sp<73>cifiques :
 | 
						||
      <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
 | 
						||
      <code class="module"><a href="../mod/mpm_winnt.html">mpm_winnt</a></code>. Sur les syst<73>mes de type Unix, vous avez le
 | 
						||
      choix entre un grand nombre de modules MPM. Le choix du MPM peut affecter
 | 
						||
      la vitesse et l'<27>volutivit<69> du d<>mon httpd :</p>
 | 
						||
 | 
						||
      <ul>
 | 
						||
 | 
						||
        <li>Le MPM <code class="module"><a href="../mod/worker.html">worker</a></code> utilise plusieurs processus
 | 
						||
	enfants poss<73>dant chacun de nombreux threads. Chaque thread g<>re une
 | 
						||
	seule connexion <20> la fois. Worker est en g<>n<EFBFBD>ral un bon choix pour les
 | 
						||
	serveurs pr<70>sentant un traffic important car il poss<73>de une empreinte
 | 
						||
	m<>moire plus petite que le MPM prefork.</li>
 | 
						||
 | 
						||
	<li>Comme le MPM Worker, le MPM <code class="module"><a href="../mod/event.html">event</a></code> utilise
 | 
						||
	les threads, mais il a <20>t<EFBFBD> con<6F>u pour traiter davantage de
 | 
						||
	requ<71>tes simultan<61>ment en confiant une partie du travail <20> des
 | 
						||
	threads de support, ce qui permet aux threads principaux de
 | 
						||
	traiter de nouvelles requ<71>tes.</li>
 | 
						||
 | 
						||
        <li>Le MPM <code class="module"><a href="../mod/prefork.html">prefork</a></code> utilise plusieurs processus enfants
 | 
						||
	poss<73>dant chacun un seul thread. Chaque processus g<>re une seule
 | 
						||
	connexion <20> la fois. Sur de nombreux syst<73>mes, prefork est comparable
 | 
						||
	en mati<74>re de vitesse <20> worker, mais il utilise plus de m<>moire. De par
 | 
						||
	sa conception sans thread, prefork pr<70>sente des avantages par rapport <20>
 | 
						||
	worker dans certaines situations : il peut <20>tre utilis<69> avec les
 | 
						||
	modules tiers qui ne supportent pas le threading, et son d<>bogage est plus
 | 
						||
	ais<69> sur les platesformes pr<70>sentant un support du d<>bogage des threads
 | 
						||
	rudimentaire.</li>
 | 
						||
 | 
						||
      </ul>
 | 
						||
 | 
						||
      <p>Pour plus d'informations sur ces deux MPMs et les autres, veuillez
 | 
						||
      vous r<>f<EFBFBD>rer <20> la <a href="../mpm.html">documentation sur les
 | 
						||
      MPM</a>.</p>
 | 
						||
 | 
						||
    
 | 
						||
 | 
						||
    <h3><a name="modules" id="modules">Modules</a></h3>
 | 
						||
 | 
						||
        
 | 
						||
 | 
						||
        <p>Comme le contr<74>le de l'utilisation de la m<>moire est tr<74>s important
 | 
						||
	en mati<74>re de performance, il est conseill<6C> d'<27>liminer les modules que
 | 
						||
	vous n'utilisez pas vraiment. Si vous avez construit ces modules en
 | 
						||
	tant que <a href="../dso.html">DSOs</a>, leur <20>limination consiste
 | 
						||
	simplement <20> commenter la directive
 | 
						||
	<code class="directive"><a href="../mod/mod_so.html#loadmodule">LoadModule</a></code> associ<63>e <20> ce
 | 
						||
	module. Ceci vous permet de v<>rifier si votre site fonctionne toujours
 | 
						||
	apr<70>s la suppression de tel ou tel module.</p>
 | 
						||
 | 
						||
        <p>Par contre, si les modules que vous voulez supprimer sont li<6C>s
 | 
						||
	statiquement <20> votre binaire Apache, vous devrez recompiler ce dernier
 | 
						||
	afin de pouvoir les <20>liminer.</p>
 | 
						||
 | 
						||
        <p>La question qui d<>coule de ce qui pr<70>c<EFBFBD>de est <20>videmment de
 | 
						||
	savoir de quels modules vous avez besoin et desquels vous pouvez vous
 | 
						||
	passer. La r<>ponse sera bien entendu diff<66>rente d'un site web <20>
 | 
						||
	l'autre. Cependant, la liste <em>minimale</em> de modules n<>cessaire <20>
 | 
						||
	la survie de votre site contiendra certainement
 | 
						||
	<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
 | 
						||
	<code class="module"><a href="../mod/mod_log_config.html">mod_log_config</a></code>. <code>mod_log_config</code> est bien
 | 
						||
	entendu optionnel puisque vous pouvez faire fonctionner un site web
 | 
						||
	en se passant de fichiers journaux ; ceci est cependant
 | 
						||
	d<>conseill<6C>.</p>
 | 
						||
 | 
						||
    
 | 
						||
 | 
						||
    <h3>Op<4F>rations atomiques</h3>
 | 
						||
 | 
						||
      
 | 
						||
 | 
						||
      <p>Certains modules, <20> l'instar de <code class="module"><a href="../mod/mod_cache.html">mod_cache</a></code> et des
 | 
						||
      versions de d<>veloppement r<>centes du MPM worker, utilisent l'API
 | 
						||
      atomique d'APR. Cette API propose des op<6F>rations atomiques que l'on
 | 
						||
      peut utiliser pour all<6C>ger la synchronisation des threads.</p>
 | 
						||
 | 
						||
      <p>Par d<>faut, APR impl<70>mente ces op<6F>rations en utilisant les
 | 
						||
      m<>canismes les plus efficaces disponibles sur chaque plateforme cible
 | 
						||
      (Syst<73>me d'exploitation et processeur). De nombreux processeurs modernes,
 | 
						||
      par exemple, poss<73>dent une instruction qui effectue une op<6F>ration
 | 
						||
      atomique de type comparaison et <20>change ou compare-and-swap (CAS) au
 | 
						||
      niveau mat<61>riel. Sur certaines platesformes cependant, APR utilise par
 | 
						||
      d<>faut une impl<70>mentation de l'API atomique plus lente, bas<61>e sur les
 | 
						||
      mutex, afin d'assurer la compatibilit<69> avec les anciens mod<6F>les de
 | 
						||
      processeurs qui ne poss<73>dent pas ce genre d'instruction. Si vous
 | 
						||
      construisez Apache pour une de ces platesformes, et ne pr<70>voyez de
 | 
						||
      l'ex<65>cuter que sur des processeurs r<>cents, vous pouvez s<>lectionner une
 | 
						||
      impl<70>mentation atomique plus rapide <20> la compilation en utilisant
 | 
						||
      l'option <code>--enable-nonportable-atomics</code> du
 | 
						||
      script configure :</p>
 | 
						||
 | 
						||
      <div class="example"><p><code>
 | 
						||
        ./buildconf<br />
 | 
						||
        ./configure --with-mpm=worker --enable-nonportable-atomics=yes
 | 
						||
      </code></p></div>
 | 
						||
 | 
						||
      <p>L'option <code>--enable-nonportable-atomics</code> concerne les
 | 
						||
      platesformes suivantes :</p>
 | 
						||
 | 
						||
      <ul>
 | 
						||
 | 
						||
        <li>Solaris sur SPARC<br />
 | 
						||
            Sur Solaris/SPARC, APR utilise par d<>faut les op<6F>rations
 | 
						||
	    atomiques bas<61>es sur les mutex. Cependant, si vous ajoutez l'option
 | 
						||
	    <code>--enable-nonportable-atomics</code> au script configure, APR
 | 
						||
	    g<>n<EFBFBD>re un code qui utilise le code op<6F>ration SPARC v8plus pour des
 | 
						||
	    op<6F>rations de compare-and-swap mat<61>riel plus rapides. Si vous
 | 
						||
	    utilisez cette option de configure avec Apache, les op<6F>rations
 | 
						||
	    atomiques seront plus efficaces (permettant d'all<6C>ger la charge du
 | 
						||
	    processeur et un plus haut niveau de simultan<61>it<69>), mais
 | 
						||
	    l'ex<65>cutable produit ne fonctionnera que sur les processeurs
 | 
						||
	    UltraSPARC.
 | 
						||
	</li>
 | 
						||
 | 
						||
        <li>Linux sur x86<br />
 | 
						||
            Sous Linux, APR utilise par d<>faut les op<6F>rations atomiques bas<61>es
 | 
						||
	    sur les mutex. Cependant, si vous ajoutez l'option
 | 
						||
	    <code>--enable-nonportable-atomics</code> au script configure,
 | 
						||
	    APR g<>n<EFBFBD>rera un code qui utilise un code d'op<6F>ration du 486
 | 
						||
	    pour des op<6F>rations de compare-and-swap mat<61>riel plus rapides. Le
 | 
						||
	    code r<>sultant est plus efficace en mati<74>re d'op<6F>rations atomiques,
 | 
						||
	    mais l'ex<65>cutable produit ne fonctionnera que sur des processeurs
 | 
						||
	    486 et sup<75>rieurs (et non sur des 386).
 | 
						||
        </li>
 | 
						||
 | 
						||
      </ul>
 | 
						||
 | 
						||
    
 | 
						||
 | 
						||
    <h3>Module mod_status et ExtendedStatus On</h3>
 | 
						||
 | 
						||
      
 | 
						||
 | 
						||
      <p>Si vous incluez le module <code class="module"><a href="../mod/mod_status.html">mod_status</a></code> <20> la
 | 
						||
      construction d'Apache et ajoutez <code>ExtendedStatus On</code> <20> sa
 | 
						||
      configuration, Apache va effectuer pour chaque requ<71>te deux appels <20>
 | 
						||
      <code>gettimeofday(2)</code> (ou <code>times(2)</code> selon votre
 | 
						||
      syst<73>me d'exploitation), et (pour les versions ant<6E>rieures <20> 1.3) de
 | 
						||
      nombreux appels suppl<70>mentaires <20> <code>time(2)</code>. Tous ces
 | 
						||
      appels sont effectu<74>s afin que le rapport de statut puisse contenir
 | 
						||
      des indications temporelles. Pour am<61>liorer les performances, utilisez
 | 
						||
      <code>ExtendedStatus off</code> (qui est le r<>glage par d<>faut).</p>
 | 
						||
 | 
						||
    
 | 
						||
 | 
						||
    <h3>accept Serialization - points de connexion <20> un programme (sockets) multiples</h3>
 | 
						||
 | 
						||
      
 | 
						||
 | 
						||
    <div class="warning"><h3>Mise en garde :</h3>
 | 
						||
      <p>Cette section n'a pas <20>t<EFBFBD> totalement mise <20> jour car elle ne tient pas
 | 
						||
      compte des changements intervenus dans la version 2.x du Serveur HTTP
 | 
						||
      Apache. Certaines informations sont encore pertinentes, il vous est
 | 
						||
      cependant conseill<6C> de les utiliser avec prudence.</p>
 | 
						||
    </div>
 | 
						||
 | 
						||
      <p>Ce qui suit est une br<62>ve discussion <20> propos de l'API des sockets
 | 
						||
      Unix. Supposons que votre serveur web utilise plusieurs directives
 | 
						||
      <code class="directive"><a href="../mod/mpm_common.html#listen">Listen</a></code> afin d'<27>couter
 | 
						||
      plusieurs ports ou de multiples adresses. Afin de tester chaque socket
 | 
						||
      pour voir s'il a une connexion en attente, Apache utilise
 | 
						||
      <code>select(2)</code>. <code>select(2)</code> indique si un socket a
 | 
						||
      <em>z<>ro</em> ou <em>au moins une</em> connexion en attente. Le mod<6F>le
 | 
						||
      d'Apache comporte plusieurs processus enfants, et tous ceux qui sont
 | 
						||
      inactifs testent la pr<70>sence de nouvelles connexions au m<>me moment.
 | 
						||
      Une impl<70>mentation rudimentaire de ceci pourrait ressembler <20>
 | 
						||
      l'exemple suivant
 | 
						||
      (ces exemples ne sont pas extraits du code d'Apache, ils ne sont
 | 
						||
      propos<6F>s qu'<27> des fins p<>dagogiques) :</p>
 | 
						||
 | 
						||
      <pre class="prettyprint lang-c">        for (;;) {
 | 
						||
          for (;;) {
 | 
						||
            fd_set accept_fds;
 | 
						||
 | 
						||
            FD_ZERO (&accept_fds);
 | 
						||
            for (i = first_socket; i <= last_socket; ++i) {
 | 
						||
              FD_SET (i, &accept_fds);
 | 
						||
            }
 | 
						||
            rc = select (last_socket+1, &accept_fds, NULL, NULL, NULL);
 | 
						||
            if (rc < 1) continue;
 | 
						||
            new_connection = -1;
 | 
						||
            for (i = first_socket; i <= last_socket; ++i) {
 | 
						||
              if (FD_ISSET (i, &accept_fds)) {
 | 
						||
                new_connection = accept (i, NULL, NULL);
 | 
						||
                if (new_connection != -1) break;
 | 
						||
              }
 | 
						||
            }
 | 
						||
            if (new_connection != -1) break;
 | 
						||
          }
 | 
						||
          process_the(new_connection);
 | 
						||
        }</pre>
 | 
						||
 | 
						||
 | 
						||
      <p>Mais cette impl<70>mentation rudimentaire pr<70>sente une s<>rieuse lacune.
 | 
						||
      Rappelez-vous que les processus enfants ex<65>cutent cette boucle au m<>me
 | 
						||
      moment ; ils vont ainsi bloquer sur <code>select</code> s'ils se trouvent
 | 
						||
      entre deux requ<71>tes. Tous ces processus bloqu<71>s vont se r<>activer et
 | 
						||
      sortir de <code>select</code> quand une requ<71>te va appara<72>tre sur un des
 | 
						||
      sockets (le nombre de processus enfants qui se r<>activent varie en
 | 
						||
      fonction du syst<73>me d'exploitation et des r<>glages de synchronisation).
 | 
						||
      Ils vont alors tous entrer dans la boucle et tenter un
 | 
						||
      <code>"accept"</code> de la connexion. Mais seulement un d'entre eux y
 | 
						||
      parviendra (en supposant qu'il ne reste q'une seule connexion en
 | 
						||
      attente), les autres vont se bloquer au niveau de <code>accept</code>.
 | 
						||
      Ceci verrouille vraiment ces processus de telle sorte qu'ils ne peuvent
 | 
						||
      plus servir de requ<71>tes que par cet unique socket, et il en sera ainsi
 | 
						||
      jusqu'<27> ce que suffisamment de nouvelles requ<71>tes apparaissent sur ce
 | 
						||
      socket pour les r<>activer tous. Cette lacune a <20>t<EFBFBD> document<6E>e pour la
 | 
						||
      premi<6D>re fois dans
 | 
						||
      <a href="http://bugs.apache.org/index/full/467">PR#467</a>. Il existe
 | 
						||
      au moins deux solutions.</p>
 | 
						||
 | 
						||
      <p>La premi<6D>re consiste <20> rendre les sockets non blocants. Dans ce cas,
 | 
						||
      <code>accept</code> ne bloquera pas les processus enfants, et ils
 | 
						||
      pourront continuer <20> s'ex<65>cuter imm<6D>diatement. Mais ceci consomme des
 | 
						||
      ressources processeur. Supposons que vous ayez dix processus enfants
 | 
						||
      inactifs dans <code>select</code>, et qu'une connexion arrive.
 | 
						||
      Neuf des dix processus vont se r<>activer, tenter un <code>accept</code>
 | 
						||
      de la connexion, <20>chouer, et boucler dans <code>select</code>, tout en
 | 
						||
      n'ayant finalement rien accompli. Pendant ce temps, aucun de ces processus
 | 
						||
      ne traite les requ<71>tes qui arrivent sur d'autres sockets jusqu'<27> ce
 | 
						||
      qu'ils retournent dans <code>select</code>. Finalement, cette solution
 | 
						||
      ne semble pas tr<74>s efficace, <20> moins que vous ne disposiez d'autant de
 | 
						||
      processeurs inactifs (dans un serveur multiprocesseur) que de processus
 | 
						||
      enfants inactifs, ce qui n'est pas une situation tr<74>s courante.</p>
 | 
						||
 | 
						||
      <p>Une autre solution, celle qu'utilise Apache, consiste <20> s<>rialiser les
 | 
						||
      entr<74>es dans la boucle interne. La boucle ressemble <20> ceci (les
 | 
						||
      diff<66>rences sont mises en surbrillance) :</p>
 | 
						||
 | 
						||
      <pre class="prettyprint lang-c">        for (;;) {
 | 
						||
          <strong>accept_mutex_on ();</strong>
 | 
						||
          for (;;) {
 | 
						||
            fd_set accept_fds;
 | 
						||
            
 | 
						||
            FD_ZERO (&accept_fds);
 | 
						||
            for (i = first_socket; i <= last_socket; ++i) {
 | 
						||
              FD_SET (i, &accept_fds);
 | 
						||
            }
 | 
						||
            rc = select (last_socket+1, &accept_fds, NULL, NULL, NULL);
 | 
						||
            if (rc < 1) continue;
 | 
						||
            new_connection = -1;
 | 
						||
            for (i = first_socket; i <= last_socket; ++i) {
 | 
						||
              if (FD_ISSET (i, &accept_fds)) {
 | 
						||
                new_connection = accept (i, NULL, NULL);
 | 
						||
                if (new_connection != -1) break;
 | 
						||
              }
 | 
						||
            }
 | 
						||
            if (new_connection != -1) break;
 | 
						||
          }
 | 
						||
          <strong>accept_mutex_off ();</strong>
 | 
						||
          process the new_connection;
 | 
						||
        }</pre>
 | 
						||
 | 
						||
 | 
						||
      <p><a id="serialize" name="serialize">Les fonctions</a>
 | 
						||
      <code>accept_mutex_on</code> et <code>accept_mutex_off</code>
 | 
						||
      impl<70>mentent un s<>maphore permettant une exclusion mutuelle. Un seul
 | 
						||
      processus enfant <20> la fois peut poss<73>der le mutex. Plusieurs choix se
 | 
						||
      pr<70>sentent pour impl<70>menter ces mutex. Ce choix est d<>fini dans
 | 
						||
      <code>src/conf.h</code> (versions ant<6E>rieures <20> 1.3) ou
 | 
						||
      <code>src/include/ap_config.h</code> (versions 1.3 ou sup<75>rieures).
 | 
						||
      Certaines architectures ne font pas ce choix du mode de verrouillage ;
 | 
						||
      l'utilisation de directives
 | 
						||
      <code class="directive"><a href="../mod/mpm_common.html#listen">Listen</a></code> multiples sur ces
 | 
						||
      architectures est donc peu s<>r.</p>
 | 
						||
 | 
						||
      <p>La directive <code class="directive"><a href="../mod/core.html#mutex">Mutex</a></code> permet
 | 
						||
      de modifier l'impl<70>mentation du mutex <code>mpm-accept</code> <20>
 | 
						||
      l'ex<65>cution. Des consid<69>rations sp<73>cifiques aux diff<66>rentes
 | 
						||
      impl<70>mentations de mutex sont document<6E>es avec cette directive.</p>
 | 
						||
 | 
						||
      <p>Une autre solution qui a <20>t<EFBFBD> imagin<69>e mais jamais impl<70>ment<6E>e, consiste
 | 
						||
      <20> s<>rialiser partiellement la boucle -- c'est <20> dire y faire entrer un
 | 
						||
      certain nombre de processus. Ceci ne pr<70>senterait un int<6E>r<EFBFBD>t que sur les
 | 
						||
      machines multiprocesseurs o<> plusieurs processus enfants peuvent
 | 
						||
      s'ex<65>cuter simultan<61>ment, et encore, la s<>rialisation ne tire pas
 | 
						||
      vraiment parti de toute la bande passante. C'est une possibilit<69>
 | 
						||
      d'investigation future, mais demeure de priorit<69> basse car les serveurs
 | 
						||
      web <20> architecture hautement parall<6C>le ne sont pas la norme.</p>
 | 
						||
 | 
						||
      <p>Pour bien faire, vous devriez faire fonctionner votre serveur sans
 | 
						||
      directives <code class="directive"><a href="../mod/mpm_common.html#listen">Listen</a></code> multiples
 | 
						||
      si vous visez les performances les plus <20>lev<65>es.
 | 
						||
      Mais lisez ce qui suit.</p>
 | 
						||
 | 
						||
    
 | 
						||
 | 
						||
    <h3>accept Serialization - point de connexion <20> un programme (sockets) unique</h3>
 | 
						||
 | 
						||
      
 | 
						||
 | 
						||
      <p>Ce qui pr<70>c<EFBFBD>de convient pour les serveurs <20> sockets multiples, mais
 | 
						||
      qu'en est-il des serveurs <20> socket unique ? En th<74>orie, ils ne
 | 
						||
      devraient pas rencontrer les m<>mes probl<62>mes car tous les processus
 | 
						||
      enfants peuvent se bloquer dans <code>accept(2)</code> jusqu'<27> ce qu'une
 | 
						||
      connexion arrive, et ils ne sont pas utilis<69>s <20> ne rien faire. En
 | 
						||
      pratique, ceci dissimule un m<>me comportement de bouclage
 | 
						||
      discut<75> plus haut dans la solution non-blocante. De la mani<6E>re dont
 | 
						||
      sont impl<70>ment<6E>es les piles TCP, le noyau r<>active v<>ritablement tous les
 | 
						||
      processus bloqu<71>s dans <code>accept</code> quand une seule connexion
 | 
						||
      arrive. Un de ces processus prend la connexion en compte et retourne
 | 
						||
      dans l'espace utilisateur, les autres bouclant dans l'espace du
 | 
						||
      noyau et se d<>sactivant quand ils s'aper<65>oivent qu'il n'y a pas de
 | 
						||
      connexion pour eux. Ce bouclage est invisible depuis le code de l'espace
 | 
						||
      utilisateur, mais il est quand-m<>me pr<70>sent. Ceci peut conduire <20> la
 | 
						||
      m<>me augmentation de charge <20> perte que la solution non blocante au cas
 | 
						||
      des sockets multiples peut induire.</p>
 | 
						||
 | 
						||
      <p>Pour cette raison, il appara<72>t que de nombreuses architectures se
 | 
						||
      comportent plus "proprement" si on s<>rialise m<>me dans le cas d'une socket
 | 
						||
      unique. Il s'agit en fait du comportement par d<>faut dans la plupart des
 | 
						||
      cas. Des exp<78>riences pouss<73>es sous Linux (noyau 2.0.30 sur un
 | 
						||
      biprocesseur Pentium pro 166 avec 128 Mo de RAM) ont montr<74> que la
 | 
						||
      s<>rialisation d'une socket unique provoque une diminution inf<6E>rieure <20> 3%
 | 
						||
      du nombre de requ<71>tes par secondes par rapport au traitement non
 | 
						||
      s<>rialis<69>. Mais le traitement non s<>rialis<69> des sockets uniques induit
 | 
						||
      un temps de r<>ponse suppl<70>mentaire de 100 ms pour chaque requ<71>te. Ce
 | 
						||
      temps de r<>ponse est probablement provoqu<71> par une limitation sur les
 | 
						||
      lignes <20> haute charge, et ne constitue un probl<62>me que sur les r<>seaux
 | 
						||
      locaux. Si vous voulez vous passer de la s<>rialisation des sockets
 | 
						||
      uniques, vous pouvez d<>finir
 | 
						||
      <code>SINGLE_LISTEN_UNSERIALIZED_ACCEPT</code> et les
 | 
						||
      serveurs <20> socket unique ne pratiqueront plus du tout la
 | 
						||
      s<>rialisation.</p>
 | 
						||
 | 
						||
    
 | 
						||
 | 
						||
    <h3>Fermeture en prenant son temps (Lingering close)</h3>
 | 
						||
 | 
						||
      
 | 
						||
 | 
						||
      <p>Comme discut<75> dans <a href="http://www.ics.uci.edu/pub/ietf/http/draft-ietf-http-connection-00.txt">
 | 
						||
      draft-ietf-http-connection-00.txt</a> section 8, pour impl<70>menter de
 | 
						||
      mani<6E>re <strong>fiable</strong> le protocole, un serveur HTTP doit fermer
 | 
						||
      les deux directions d'une communication ind<6E>pendamment (rappelez-vous
 | 
						||
      qu'une connexion TCP est bidirectionnelle, chaque direction <20>tant
 | 
						||
      ind<6E>pendante de l'autre).</p>
 | 
						||
 | 
						||
      <p>Quand cette fonctionnalit<69> fut ajout<75>e <20> Apache, elle causa une
 | 
						||
      avalanche de probl<62>mes sur plusieurs versions d'Unix <20> cause d'une
 | 
						||
      impl<70>mentation <20> courte vue. La sp<73>cification TCP ne pr<70>cise pas que
 | 
						||
      l'<27>tat <code>FIN_WAIT_2</code> poss<73>de un temps de r<>ponse mais elle ne
 | 
						||
      l'exclut pas. Sur les syst<73>mes qui n'introduisent pas ce temps de
 | 
						||
      r<>ponse, Apache 1.2 induit de nombreux blocages d<>finitifs de socket
 | 
						||
      dans l'<27>tat <code>FIN_WAIT_2</code>. On peut eviter ceci dans de nombreux
 | 
						||
      cas tout simplement en mettant <20> jour TCP/IP avec le dernier patch mis <20>
 | 
						||
      disposition par le fournisseur. Dans les cas o<> le fournisseur n'a
 | 
						||
      jamais fourni de patch (par exemple, SunOS4 -- bien que les utilisateurs
 | 
						||
      poss<73>dant une license source puissent le patcher eux-m<>mes), nous avons
 | 
						||
      d<>cid<69> de d<>sactiver cette fonctionnalit<69>.</p>
 | 
						||
 | 
						||
      <p>Il y a deux m<>thodes pour arriver <20> ce r<>sultat. La premi<6D>re est
 | 
						||
      l'option de socket <code>SO_LINGER</code>. Mais le sort a voulu que cette
 | 
						||
      solution ne soit jamais impl<70>ment<6E>e correctement dans la plupart des
 | 
						||
      piles TCP/IP. Et m<>me dans les rares cas o<> cette solution a <20>t<EFBFBD>
 | 
						||
      impl<70>ment<6E>e correctement (par exemple Linux 2.0.31), elle se
 | 
						||
      montre beaucoup plus gourmande (en temps processeur) que la solution
 | 
						||
      suivante.</p>
 | 
						||
 | 
						||
      <p>Pour la plus grande partie, Apache impl<70>mente cette solution <20> l'aide
 | 
						||
      d'une fonction appel<65>e <code>lingering_close</code> (d<>finie dans
 | 
						||
      <code>http_main.c</code>). La fonction ressemble approximativement <20>
 | 
						||
      ceci :</p>
 | 
						||
 | 
						||
      <pre class="prettyprint lang-c">        void lingering_close (int s)
 | 
						||
        {
 | 
						||
          char junk_buffer[2048];
 | 
						||
          
 | 
						||
          /* shutdown the sending side */
 | 
						||
          shutdown (s, 1);
 | 
						||
 | 
						||
          signal (SIGALRM, lingering_death);
 | 
						||
          alarm (30);
 | 
						||
 | 
						||
          for (;;) {
 | 
						||
            select (s for reading, 2 second timeout);
 | 
						||
            if (error) break;
 | 
						||
            if (s is ready for reading) {
 | 
						||
              if (read (s, junk_buffer, sizeof (junk_buffer)) <= 0) {
 | 
						||
                break;
 | 
						||
              }
 | 
						||
              /* just toss away whatever is here */
 | 
						||
            }
 | 
						||
          }
 | 
						||
          
 | 
						||
          close (s);
 | 
						||
        }</pre>
 | 
						||
 | 
						||
 | 
						||
      <p>Ceci ajoute naturellement un peu de charge <20> la fin d'une connexion,
 | 
						||
      mais s'av<61>re n<>cessaire pour une impl<70>mentation fiable. Comme HTTP/1.1
 | 
						||
      est de plus en plus pr<70>sent et que toutes les connexions sont
 | 
						||
      persistentes, la charge sera amortie par la multiplicit<69> des requ<71>tes.
 | 
						||
      Si vous voulez jouer avec le feu en d<>sactivant cette fonctionnalit<69>,
 | 
						||
      vous pouvez d<>finir <code>NO_LINGCLOSE</code>, mais c'est fortement
 | 
						||
      d<>conseill<6C>. En particulier, comme les connexions persistantes en
 | 
						||
      pipeline de HTTP/1.1 commencent <20> <20>tre utilis<69>es,
 | 
						||
      <code>lingering_close</code> devient une absolue n<>cessit<69> (et les
 | 
						||
      <a href="http://www.w3.org/Protocols/HTTP/Performance/Pipeline.html">
 | 
						||
      connexions en pipeline sont plus rapides</a> ; vous avez donc tout
 | 
						||
      int<6E>r<EFBFBD>t <20> les supporter).</p>
 | 
						||
 | 
						||
    
 | 
						||
 | 
						||
    <h3>Fichier tableau de bord (Scoreboard file)</h3>
 | 
						||
 | 
						||
      
 | 
						||
 | 
						||
      <p>Les processus parent et enfants d'Apache communiquent entre eux <20>
 | 
						||
      l'aide d'un objet appel<65> "Tableau de bord" (Scoreboard). Id<49>alement, cet
 | 
						||
      <20>change devrait s'effectuer en m<>moire partag<61>e. Pour les syst<73>mes
 | 
						||
      d'exploitation auxquels nous avons eu acc<63>s, ou pour lesquels nous avons
 | 
						||
      obtenu des informations suffisamment d<>taill<6C>es pour effectuer un
 | 
						||
      portage, cet <20>change est en g<>n<EFBFBD>ral impl<70>ment<6E> en utilisant la m<>moire
 | 
						||
      partag<61>e. Pour les autres, on utilise par d<>faut un fichier d'<27>change sur
 | 
						||
      disque. Le fichier d'<27>change sur disque est non seulement lent, mais
 | 
						||
      aussi peu fiable (et propose moins de fonctionnalit<69>s). Recherchez dans
 | 
						||
      le fichier <code>src/main/conf.h</code> correspondant <20> votre
 | 
						||
      architecture soit <code>USE_MMAP_SCOREBOARD</code>, soit
 | 
						||
      <code>USE_SHMGET_SCOREBOARD</code>. La d<>finition de l'un des deux
 | 
						||
      (ainsi que leurs compagnons respectifs <code>HAVE_MMAP</code> et
 | 
						||
      <code>HAVE_SHMGET</code>), active le code fourni pour la m<>moire
 | 
						||
      partag<61>e. Si votre syst<73>me propose une autre solution pour la gestion de
 | 
						||
      la m<>moire partag<61>e, <20>ditez le fichier <code>src/main/http_main.c</code>
 | 
						||
      et ajoutez la portion de code n<>cessaire pour pouvoir l'utiliser dans
 | 
						||
      Apache (Merci de nous envoyer aussi le patch correspondant).</p>
 | 
						||
 | 
						||
      <div class="note">Note <20> caract<63>re historique : le portage d'Apache sous Linux
 | 
						||
      n'utilisait pas la m<>moire partag<61>e avant la version 1.2. Ceci entra<72>nait
 | 
						||
      un comportement tr<74>s rudimentaire et peu fiable des versions ant<6E>rieures
 | 
						||
      d'Apache sous Linux.</div>
 | 
						||
 | 
						||
    
 | 
						||
 | 
						||
    <h3>DYNAMIC_MODULE_LIMIT</h3>
 | 
						||
 | 
						||
      
 | 
						||
 | 
						||
      <p>Si vous n'avez pas l'intention d'utiliser les modules charg<72>s
 | 
						||
      dynamiquement (ce qui est probablement le cas si vous <20>tes en train de
 | 
						||
      lire ce document afin de personnaliser votre serveur en recherchant le
 | 
						||
      moindre des gains en performances), vous pouvez ajouter la d<>finition
 | 
						||
      <code>-DDYNAMIC_MODULE_LIMIT=0</code> <20> la construction de votre serveur.
 | 
						||
      Ceci aura pour effet de lib<69>rer la m<>moire RAM allou<6F>e pour le
 | 
						||
      chargement dynamique des modules.</p>
 | 
						||
 | 
						||
    
 | 
						||
 | 
						||
  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
 | 
						||
<div class="section">
 | 
						||
<h2><a name="trace" id="trace">Appendice : Analyse d<>taill<6C>e d'une trace</a></h2>
 | 
						||
 | 
						||
    
 | 
						||
 | 
						||
    <p>Voici la trace d'un appel syst<73>me d'Apache 2.0.38 avec le MPM worker
 | 
						||
    sous Solaris 8. Cette trace a <20>t<EFBFBD> collect<63>e <20> l'aide de la commande :</p>
 | 
						||
 | 
						||
    <div class="example"><p><code>
 | 
						||
      truss -l -p <var>httpd_child_pid</var>.
 | 
						||
    </code></p></div>
 | 
						||
 | 
						||
    <p>L'option <code>-l</code> demande <20> truss de tracer l'ID du LWP
 | 
						||
    (lightweight process--la version de Solaris des threads niveau noyau) qui
 | 
						||
    invoque chaque appel syst<73>me.</p>
 | 
						||
 | 
						||
    <p>Les autres syst<73>mes peuvent proposer des utilitaires de tra<72>age
 | 
						||
    des appels syst<73>me diff<66>rents comme <code>strace</code>,
 | 
						||
    <code>ktrace</code>, ou <code>par</code>. Ils produisent cependant tous une
 | 
						||
    trace similaire.</p>
 | 
						||
 | 
						||
    <p>Dans cette trace, un client a demand<6E> un fichier statique de 10 ko au
 | 
						||
    d<>mon httpd. Le tra<72>age des requ<71>tes pour des contenus non statiques
 | 
						||
    ou comportant une n<>gociation de contenu a une pr<70>sentation
 | 
						||
    diff<66>rente (et m<>me assez laide dans certains cas).</p>
 | 
						||
 | 
						||
    <div class="example"><pre>/67:    accept(3, 0x00200BEC, 0x00200C0C, 1) (sleeping...)
 | 
						||
/67:    accept(3, 0x00200BEC, 0x00200C0C, 1)            = 9</pre></div>
 | 
						||
 | 
						||
    <p>Dans cette trace, le thread <20> l'<27>coute s'ex<65>cute <20> l'int<6E>rieur de
 | 
						||
    LWP #67.</p>
 | 
						||
 | 
						||
    <div class="note">Notez l'absence de la s<>rialisation d'<code>accept(2)</code>. Sur
 | 
						||
    cette plateforme sp<73>cifique, le MPM worker utilise un accept non s<>rialis<69>
 | 
						||
    par d<>faut sauf s'il est en <20>coute sur des ports multiples.</div>
 | 
						||
 | 
						||
    <div class="example"><pre>/65:    lwp_park(0x00000000, 0)                         = 0
 | 
						||
/67:    lwp_unpark(65, 1)                               = 0</pre></div>
 | 
						||
 | 
						||
    <p>Apr<70>s avoir accept<70> la connexion, le thread <20> l'<27>coute r<>active un
 | 
						||
    thread du worker pour effectuer le traitement de la requ<71>te. Dans cette
 | 
						||
    trace, le thread du worker qui traite la requ<71>te est associ<63> <20>
 | 
						||
    LWP #65.</p>
 | 
						||
 | 
						||
    <div class="example"><pre>/65:    getsockname(9, 0x00200BA4, 0x00200BC4, 1)       = 0</pre></div>
 | 
						||
 | 
						||
    <p>Afin de pouvoir impl<70>menter les h<>tes virtuels, Apache doit conna<6E>tre
 | 
						||
    l'adresse du socket local utilis<69> pour accepter la connexion. On pourrait
 | 
						||
    supprimer cet appel dans de nombreuses situations (par exemple dans le cas
 | 
						||
    o<> il n'y a pas d'h<>te virtuel ou dans le cas o<> les directives
 | 
						||
    <code class="directive"><a href="../mod/mpm_common.html#listen">Listen</a></code> contiennent des adresses
 | 
						||
    sans caract<63>res de substitution). Mais aucun effort n'a <20>t<EFBFBD> accompli <20> ce
 | 
						||
    jour pour effectuer ces optimisations.</p>
 | 
						||
 | 
						||
    <div class="example"><pre>/65:    brk(0x002170E8)                                 = 0
 | 
						||
/65:    brk(0x002190E8)                                 = 0</pre></div>
 | 
						||
 | 
						||
    <p>L'appel <code>brk(2)</code> alloue de la m<>moire dans le tas. Ceci est
 | 
						||
    rarement visible dans une trace d'appel syst<73>me, car le d<>mon httpd
 | 
						||
    utilise des allocateurs m<>moire de son cru (<code>apr_pool</code> et
 | 
						||
    <code>apr_bucket_alloc</code>) pour la plupart des traitements de requ<71>tes.
 | 
						||
    Dans cette trace, le d<>mon httpd vient juste de d<>marrer, et il doit
 | 
						||
    appeler <code>malloc(3)</code> pour r<>server les blocs de m<>moire
 | 
						||
    n<>cessaires <20> la cr<63>ation de ses propres allocateurs de m<>moire.</p>
 | 
						||
 | 
						||
    <div class="example"><pre>/65:    fcntl(9, F_GETFL, 0x00000000)                   = 2
 | 
						||
/65:    fstat64(9, 0xFAF7B818)                          = 0
 | 
						||
/65:    getsockopt(9, 65535, 8192, 0xFAF7B918, 0xFAF7B910, 2190656) = 0
 | 
						||
/65:    fstat64(9, 0xFAF7B818)                          = 0
 | 
						||
/65:    getsockopt(9, 65535, 8192, 0xFAF7B918, 0xFAF7B914, 2190656) = 0
 | 
						||
/65:    setsockopt(9, 65535, 8192, 0xFAF7B918, 4, 2190656) = 0
 | 
						||
/65:    fcntl(9, F_SETFL, 0x00000082)                   = 0</pre></div>
 | 
						||
 | 
						||
    <p>Ensuite, le thread de worker passe la connexion du client (descripteur
 | 
						||
    de fichier 9) en mode non blocant. Les appels <code>setsockopt(2)</code>
 | 
						||
    et <code>getsockopt(2)</code> constituent un effet de bord de la mani<6E>re
 | 
						||
    dont la libc de Solaris utilise <code>fcntl(2)</code> pour les sockets.</p>
 | 
						||
 | 
						||
    <div class="example"><pre>/65:    read(9, " G E T   / 1 0 k . h t m".., 8000)     = 97</pre></div>
 | 
						||
 | 
						||
    <p>Le thread de worker lit la requ<71>te du client.</p>
 | 
						||
 | 
						||
    <div class="example"><pre>/65:    stat("/var/httpd/apache/httpd-8999/htdocs/10k.html", 0xFAF7B978) = 0
 | 
						||
/65:    open("/var/httpd/apache/httpd-8999/htdocs/10k.html", O_RDONLY) = 10</pre></div>
 | 
						||
 | 
						||
    <p>Ce d<>mon httpd a <20>t<EFBFBD> configur<75> avec les options
 | 
						||
    <code>Options FollowSymLinks</code> et <code>AllowOverride None</code>. Il
 | 
						||
    n'a donc ni besoin d'appeler <code>lstat(2)</code> pour chaque r<>pertoire
 | 
						||
    du chemin du fichier demand<6E>, ni besoin de v<>rifier la pr<70>sence de fichiers
 | 
						||
    <code>.htaccess</code>. Il appelle simplement <code>stat(2)</code> pour
 | 
						||
    v<>rifier d'une part que le fichier existe, et d'autre part que c'est un
 | 
						||
    fichier r<>gulier, et non un r<>pertoire.</p>
 | 
						||
 | 
						||
    <div class="example"><pre>/65:    sendfilev(0, 9, 0x00200F90, 2, 0xFAF7B53C)      = 10269</pre></div>
 | 
						||
 | 
						||
    <p>Dans cet exemple, le d<>mon httpd peut envoyer l'en-t<>te de la r<>ponse
 | 
						||
    HTTP et le fichier demand<6E> <20> l'aide d'un seul appel syst<73>me
 | 
						||
    <code>sendfilev(2)</code>. La s<>mantique de sendfile varie en fonction des
 | 
						||
    syst<73>mes d'exploitation. Sur certains autres syst<73>mes, il faut faire un
 | 
						||
    appel <20> <code>write(2)</code> ou <code>writev(2)</code> pour envoyer les
 | 
						||
    en-t<>tes avant d'appeler <code>sendfile(2)</code>.</p>
 | 
						||
 | 
						||
    <div class="example"><pre>/65:    write(4, " 1 2 7 . 0 . 0 . 1   -  ".., 78)      = 78</pre></div>
 | 
						||
 | 
						||
    <p>Cet appel <20> <code>write(2)</code> enregistre la requ<71>te dans le journal
 | 
						||
    des acc<63>s. Notez qu'une des choses manquant <20> cette trace est un appel <20>
 | 
						||
    <code>time(2)</code>. A la diff<66>rence d'Apache 1.3, Apache 2.x utilise
 | 
						||
    <code>gettimeofday(3)</code> pour consulter l'heure. Sur certains syst<73>mes
 | 
						||
    d'exploitation, comme Linux ou Solaris, <code>gettimeofday</code> est
 | 
						||
    impl<70>ment<6E> de mani<6E>re optimis<69>e de telle sorte qu'il consomme moins de
 | 
						||
    ressources qu'un appel syst<73>me habituel.</p>
 | 
						||
 | 
						||
    <div class="example"><pre>/65:    shutdown(9, 1, 1)                               = 0
 | 
						||
/65:    poll(0xFAF7B980, 1, 2000)                       = 1
 | 
						||
/65:    read(9, 0xFAF7BC20, 512)                        = 0
 | 
						||
/65:    close(9)                                        = 0</pre></div>
 | 
						||
 | 
						||
    <p>Le thread de worker effectue une fermeture "en prenant son temps"
 | 
						||
    (lingering close) de la connexion.</p>
 | 
						||
 | 
						||
    <div class="example"><pre>/65:    close(10)                                       = 0
 | 
						||
/65:    lwp_park(0x00000000, 0)         (sleeping...)</pre></div>
 | 
						||
 | 
						||
    <p>Enfin, le thread de worker ferme le fichier qu'il vient de d<>livrer et
 | 
						||
    se bloque jusqu'<27> ce que le thread en <20>coute lui assigne une autre
 | 
						||
    connexion.</p>
 | 
						||
 | 
						||
    <div class="example"><pre>/67:    accept(3, 0x001FEB74, 0x001FEB94, 1) (sleeping...)</pre></div>
 | 
						||
 | 
						||
    <p>Pendant ce temps, le thread <20> l'<27>coute peut accepter une autre connexion
 | 
						||
    <20> partir du moment o<> il a assign<67> la connexion pr<70>sente <20> un thread de
 | 
						||
    worker (selon une certaine logique de contr<74>le de flux dans le MPM worker
 | 
						||
    qui impose des limites au thread <20> l'<27>coute si tous les threads de worker
 | 
						||
    sont occup<75>s). Bien que cela n'apparaisse pas dans cette trace,
 | 
						||
    l'<code>accept(2)</code> suivant peut (et le fait en g<>n<EFBFBD>ral, en situation
 | 
						||
    de charge <20>lev<65>e) s'ex<65>cuter en parall<6C>le avec le traitement de la
 | 
						||
    connexion qui vient d'<27>tre accept<70>e par le thread de worker.</p>
 | 
						||
 | 
						||
  </div></div>
 | 
						||
<div class="bottomlang">
 | 
						||
<p><span>Langues Disponibles: </span><a href="../en/misc/perf-tuning.html" hreflang="en" rel="alternate" title="English"> en </a> |
 | 
						||
<a href="../fr/misc/perf-tuning.html" title="Fran<61>ais"> fr </a> |
 | 
						||
<a href="../ko/misc/perf-tuning.html" hreflang="ko" rel="alternate" title="Korean"> ko </a> |
 | 
						||
<a href="../tr/misc/perf-tuning.html" hreflang="tr" rel="alternate" title="T<>rk<72>e"> tr </a></p>
 | 
						||
</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>
 | 
						||
<script type="text/javascript"><!--//--><![CDATA[//><!--
 | 
						||
var comments_shortname = 'httpd';
 | 
						||
var comments_identifier = 'http://httpd.apache.org/docs/trunk/misc/perf-tuning.html';
 | 
						||
(function(w, d) {
 | 
						||
    if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
 | 
						||
        d.write('<div id="comments_thread"><\/div>');
 | 
						||
        var s = d.createElement('script');
 | 
						||
        s.type = 'text/javascript';
 | 
						||
        s.async = true;
 | 
						||
        s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
 | 
						||
        (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
 | 
						||
    }
 | 
						||
    else {
 | 
						||
        d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
 | 
						||
    }
 | 
						||
})(window, document);
 | 
						||
//--><!]]></script></div><div id="footer">
 | 
						||
<p class="apache">Copyright 2017 The Apache Software Foundation.<br />Autoris<69> sous <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
 | 
						||
<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/quickreference.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[//><!--
 | 
						||
if (typeof(prettyPrint) !== 'undefined') {
 | 
						||
    prettyPrint();
 | 
						||
}
 | 
						||
//--><!]]></script>
 | 
						||
</body></html> |