4 votes

Essayer de comprendre comment fonctionne le keep-alive

Aujourd'hui, nous avons rencontré un problème sur le serveur, lorsque les fichiers/scripts prenaient plus de 3 secondes à charger. La solution était simple - il suffisait d'augmenter MaxClients à la limite de mémoire estimée. Mais je m'inquiète de l'évolutivité de cette solution et elle ne semble pas très fiable - si la charge augmente légèrement, le problème se reproduira.

La nature du service Web que nous développons - un petit jeu en ligne - nous oblige à intégrer un mécanisme AJAX qui envoie une balise toutes les 15 secondes pour indiquer que le client est en ligne.

Imaginons la configuration suivante. Apache 2 (mpm_prefork), MaxClients = 150, KeepAlive = on, KeepAliveTimeout = 5. Il y a 300 utilisateurs en ligne. Si je comprends bien, si les 300 utilisateurs envoient une balise simultanément (en récupérant simplement beacon.php script en utilisant POST), les 150 premiers clients obtiendront une réponse presque instantanément tandis que les 150 autres devront attendre 5 secondes avant d'obtenir une réponse ?

Et deuxième question. Quelle est la meilleure solution dans mon cas ? Désactiver complètement la fonction "keep alive" ?

5voto

Wizo Points 206

MaxClients dans apache 2 est le nombre maximum de requêtes simultanées qui seront servies à travers tous les processus apache. Avec la mpm prefork, c'est également le nombre maximum de processus apache qui s'exécuteront en même temps et le nombre maximum de connexions réseau entrantes ouvertes sur votre serveur web.

L'objectif de KeepAlive est de réduire les frais généraux liés à l'établissement de nouvelles connexions TCP pour chaque requête HTTP lors de l'accès à un site, car chaque nouvelle page peut potentiellement nécessiter des dizaines de documents (html initial, css, javascript, images, etc.). Le résultat final est des pages qui se chargent plus rapidement.

MaxKeepAliveTimeout indique combien de temps le serveur web attendra une demande hHT supplémentaire d'un client inactif avant de fermer la connexion, ce qui lui permettra de traiter les nouvelles connexions entrantes.

Dans votre cas, si vous avez 150 clients qui envoient le beacon en même temps avec KeepAlive activé, alors oui, il faudra 5 secondes de plus avant que d'autres utilisateurs puissent envoyer le beacon. En supposant qu'il faille envoyer une balise toutes les 15 secondes, cela représente 450 utilisateurs concourants maximum.

Solutions :

  • vous pourriez réduire le MaxKeepAliveTimeout à 2 secondes, il y a des rendements décroissants quand il est augmenté. L'avantage maximal se situe au niveau du chargement initial des pages, et il n'y a pratiquement aucun délai entre ces requêtes.

  • vous pourriez désactiver complètement KeepAlive, ce qui augmenterait le temps de chargement de toutes vos pages, en partant du principe que la plupart des utilisateurs passent le plus de temps dans le jeu.

  • keepalive doit être activé côté client ainsi que côté serveur pour être utilisé. En supposant que vous maîtrisez votre javascript côté client, il est possible de désactiver keepalive côté client pour une requête spécifique, en utilisant :

    connection.setRequestProperty("Connection", "close");
  • De même, vous pouvez désactiver la fonction Keepalive pour certaines requêtes http côté serveur en manipulant l'en-tête de réponse Connection.

J'espère que cela vous aidera !

2voto

dsmsk80 Points 5707

L'ensemble du concept de fonctionnement du mécanisme keep-alive d'Apache2 est très bien décrit dans cet article. Optimisation d'Apache

Vous devez trouver un équilibre entre MaxClients y KeepAliveTimeout pour utiliser cette fonction. Il faut soit augmenter la première valeur en fonction de la mémoire disponible sur le serveur, soit diminuer la seconde.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X