[APACHE DOCUMENTATION]

Apache HTTP Server Version 1.3

Apache et les descripteurs de fichiers

Un descripteur, appelé aussi communément un identificateur de flux ou de fichier est un objet qu'un programme utilise pour lire ou écrire dans un fichier, un socket réseau, ou un parmi une grande variété d'autres services, au préalablement ouvert. Il est représenté par un entier, et les plus familiers sont les descripteurs stdin, stdout, et stderr de valeurs respectives 0, 1, et 2. Apache utilie un descripteur pour chacun des ses ficheirs de trace, plus un pour chacun des sockets réseau qu'il doit écouter, plus encore un certain nombre. Les librairies que le code d'Apache utilise peut aussi consommer des descripteurs. Les programmes courants n'ouvrent pas un très grand nombre de descripteurs, et il subsiste de ce fait un problème latent dont vous pourriez faire les frais si vous démarrez un Apache qui en nécessite beaucoup (par exemple avec de très nombreuses définitions d'hôtes virtuels).

Le système d'exploitation lui-même impose des limites sur le nombre de descripteurs que peut simultanément ouvrir une seule instance deprogramme. Typiquement, ces limites sont au nombre de trois. L'une est une limite donnée par le kernel, et il dépendra de votre système d'exploitation que vous puissiez augmenter ce nombre (Le paramètre ou la constante symbolique associée à cet usage s'appelle souvent FD_SETSIZE). Certains autres systèmes vous laisseeront vous débrouiller avec un nombre de descripteurs assez bas, et fixe. La seconde limite est connue comme la limite matérielle en ressources, et est parfois définissable par root dans un obscur fichier système, mais apparaît souvent comme étant la même limite que celle donnée par le kernel. La trosiième limite est la limite logicielle en ressources. Cette limite logique est toujours inférieure ou au plus égale à la limite matérielle. Par exemple, la limite matérielle peut être donnée pour 1024, et la limite logicielle pour seulement 64. Tout utilisateur peut augmenter sa limite logicielle jusqu'à la valeur de la limite matérielle courant sur ce système. Root peut lui-même augmenter la limite matérielle jusqu'à la limite absolue en ressources du système. La limite logicielle est celle qui est effectivement prise en compte pour le calcul du nombre maximal de ressources ouvertes par un processus.

Pour résumer :

  #ressources ouvertes  <=  limite logicielle  <=  limite matérielle  <=  limite absolue du kernel

Vous pouvez contrôler les limites matérielles et logicielles par la commande unix limit (csh) ou ulimit (sh). Reportez-vous aux pages man respectives pour plus d'information. Vous pourrez probablement utiliser ulimit -n unlimited pour donner à votre limite logicielle la valeur de la limite matérielle courante. Vous pourrez inclure cette commande dans un script shell qui démarre votre serveur Web.

Malheureusement, ce n'est pas toujours aussi trivial. Comme il est mentionné ci-dessus, vous arriverez peut être à certaines situations dans lesquelles il vous faudra de toutes façon contourner ce problème. Un travail avait été fait en version 1.2.1 pour amélioirer quelque peu les choses. Voici une liste partielle des systèmes et des solutions (en supposant que vous exécutez une version supérieure ou égale à la 1.2.1) :

BSDI 2.0
Sous BSDI 2.0, vous pourrez compiler Apache en lui faisant accepter plus de dscripteurs par l'ajout du code -DFD_SETSIZE=nnn aux EXTRA_CFLAGS (dans lequel nnn est le nombre de descripteurs qu'Apache doit être capable de supporter, ce nombre doit être inférieur à la limite matérielle). Mais cela ne marchera plus si vous inscrivez plus d'environ 240 directives Listen. Ceci pourra être corrigé en reconstruisant votre kernel avec une valeur supérieure du #define FD_SETSIZE.

FreeBSD 2.2, BSDI 2.1+
Idem à BSDI 2.0, il vous est possible de redéfinir FD_SETSIZE et reconstruire le kernel. La limite additionnelle à propos de la directive Listen n'intervient pas.

Linux
Par défaut, Linux n'autorise qu'un maximum de 256 descripteurs ouverts par prcessus. Il existe plusieurs patches pour les versions 2.0.x qui permettent de repousser cette limite à 1024 et au-delà, lesquels pourront être trouvés dans les sections "unofficial patches" du site the Linux Information HQ. Aucun de ces patches n'est parfait, et il semblerait qu'une approche totalement différente devrait être prise pour le développement des séries 2.1.x. Appliquer ces patches augmentera la limite FD_SETSIZE servant à la compilation de tous les programmes, et à moins de reconstruire toutes vos librairies, nous vous dissuadons d'exécuter tout autre programme dépassant la limite logicielle de 256. Au jour d'aujourd'hui (date de l'édition originale), les patches disponibles n'ont effectivement pas été conçus en ce sens. Il est d'ailleurs possibles que sur certains serveurs web dédiés vous n'ayez jamais à faire face à ce problème.

Solaris jusqu'à 2.5.1
Solaris impose une limite matérielle absolue de 1024 (peut être inférieure dans des versions antérieures). Mais il existe une autre limite qui stipule que les fichiers exploités via la librairie <stdio> ne peuvent avoir un descripteur supérieur à 255. Apache exploite la librairie <stdio> dans le traitement des directives ErrorLog. Lorsque vous définissez plus d'environ 110 hôtes virtuels (utilisant chacun leur propre error_log et access_log), il vous faudra recompiler Apache en ajoutant le code -DHIGH_SLACK_LINE=256 aux EXTRA_CFLAGS. Le nombre d'error_logs sera limité à environ 240 dans ce cas.

AIX
La version 3.2 d'AIX (??) fait apparaître une limite absolue de 128 descripteurs. Fin de la course !. La version 4.1.5 quant à elle a une limite absolue matérielle de 2000.

Autres
Si vous disposez d'informations détaillées à propos d'autres systèmes d'exploitation, n'hésitez pas à nous les indiquer via la page de rapport de bogues.

Hormis les problèmes décrits ci-avant, il en existe d'autres relatifs aux librairies qu'utilise Apache. L'exemple le plus commun est la librairie de résolution DNS qui est utilisée sur pratiquement tous les systèmes Unix, et qui échoue lorsque les descripteurs passent au dessus de 256. Nous suspectons que d'autres librairies peuvent présenter des limitations similaires. De ce fait, le code de la version 1.2.1 prend des mesures défensives, et essaie de préserver des descripteurs inférieurs à 16 pour le traitement des requêtes. Nous appelons cela la low slack line.

Notez que ceci ne gaspille pas des descripteurs. Si vous repoussez réellement les limites de sorte qu'Apache ne puisse récupérer un descripteur supérieur à 16, alors il consommera quand même un de ces descripteurs inférieurs à 16.

Dans des cas extrèmes, you may want to lower the low slack line, but you shouldn't ever need to. For example, lowering it can increase the limits 240 described above under Solaris and BSDI 2.0. But you'll play a delicate balancing game with the descriptors needed to serve a request. Should you want to play this game, the compile time parameter is LOW_SLACK_LINE and there's a tiny bit of documentation in the header file httpd.h.

Finally, if you suspect that all this slack stuff is causing you problems, you can disable it. Add -DNO_SLACK to EXTRA_CFLAGS and rebuild. But please report it to our Bug Report Page so that we can investigate.


Apache HTTP Server Version 1.3

Index Home