1 votes

Traitement plus rapide des demandes multiples

Contexte

Je suis en train de construire un jeu qui surveille les actions externes (tweets, likes FB, etc.) et met à jour les utilisateurs à intervalles réguliers avec ces informations (toutes les 10 secondes environ via AJAX). À un moment donné, tous les utilisateurs seront déposés dans Google Streetview et ils devront courir pour trouver des marqueurs. L'idée du jeu est que les marqueurs sont cachés jusqu'à ce que l'utilisateur soit près d'eux, et pour cette raison, nous ne pouvons pas les stocker en JS (trop facile à voir dans la source). Nous avons donc une requête AJAX qui envoie la latitude et la longitude à chaque fois que l'utilisateur se déplace afin de pouvoir afficher le marqueur s'il se trouve dans la bonne zone.

Problème

Nous avons quelques centaines de personnes qui jouent à ce jeu à tout moment, et nous en attendons davantage. Les temps de réponse sont d'environ 10/20 ms, et nous utilisons l'APC, mais lorsque nous atteignons quelques centaines d'utilisateurs, le temps de réponse du serveur ralentit considérablement (surtout lorsque ces personnes courent dans Streetview et font une ou deux demandes par seconde).

Question

Nous sommes sur une pile LAMP, avec 4 Go de RAM (nous pouvons changer cela car nous sommes sur un nuage), mais je me demandais s'il y avait une meilleure façon, plus évolutive, de gérer cela. J'ai lu beaucoup de choses sur Nginx, alors serait-il un ajout approprié à notre architecture pour traiter plus de demandes simultanément ? Comment les autres gèrent-ils ce type d'interrogation en utilisant la pile LAMP ?

2voto

entymon Points 71

En gros, il y a deux façons de traiter plus de demandes et de servir plus rapidement. La première consiste à écrire un code extrêmement efficace. L'autre consiste à avoir un service (serveur) extrêmement efficace. Vous pouvez essayer d'obtenir le meilleur des deux, mais c'est difficile à réaliser. La plupart des sites se situent quelque part entre ces deux extrêmes. Pour ces deux approches, je peux recommander de passer complètement à nginx, si ce n'est pour servir uniquement vos fichiers statiques, car nginx surpasse Apache dans ces deux domaines d'un ordre de grandeur. nginx est un serveur non bloquant et n'a pas la surcharge de php pour servir les fichiers non php, contrairement à Apache.

Les nouveaux programmeurs et les amateurs ont tendance à développer avec des cadres et des plateformes préétablis. Ces codes ne sont pas optimaux car ils sont destinés à servir un large public. Ce groupe de personnes adopte le point de vue de l'optimisation de leur service (serveurs) car ils ne peuvent pas quitter leur cadre et donc ne peuvent pas optimiser entièrement leur code. Dans cette approche, dans le contexte de nginx sur linux, vous pouvez régler votre serveur pour en tirer le maximum de performances :

  1. Vous devriez optimiser votre pile tcp qui est fournie avec votre système d'exploitation.

  2. Augmenter le nombre de descripteurs de fichiers ouverts.

  3. Vous pourriez vouloir placer votre répertoire www sur un disque RAM.

  4. Si vous décidez d'utiliser nginx, vous voudrez augmenter les connexions et les processus des travailleurs dans nginx et le nombre de travailleurs.

  5. Vous voudrez probablement mettre en place une mise en cache pour compenser un code mal écrit.

  6. Vous utilisez actuellement APC qui est un cache d'objet, vous pourriez vouloir mettre en place une page en utilisant APC également, ce qui vous permettra d'obtenir des améliorations d'un ordre de grandeur.

  7. Vous pourriez vouloir mettre en mémoire les requêtes de votre base de données, ce qui devrait permettre d'éliminer les goulots d'étranglement de la base de données.

  8. Utilisez des tampons plus grands dans votre serveur web et de base de données.

L'autre groupe, généralement des programmeurs expérimentés qui écrivent leur propre code depuis le début, ou qui peuvent le faire plus tard, essaient d'écrire un code super efficace et de faire preuve de minimalisme dans leurs efforts de "conception" pour obtenir des réponses http allégées qui fonctionnent de manière optimale sur n'importe quelle pile. Je n'ai pas de conseils à donner ici mais simplement à suggérer de suivre les meilleures pratiques des autorités dans le domaine respectif. Cependant, je peux vous raconter l'histoire de Facebook à cet égard.

Facebook est une histoire emblématique de la progression de l'optimisation des serveurs vers l'optimisation du code. Construit à l'origine en PHP avec Apache, le site a rapidement rencontré des problèmes de performance, et c'est à ce moment-là qu'il a commencé à optimiser fortement ses serveurs. Le système d'exploitation, la pile PHP, tout a été optimisé. Bientôt, ils ont dû commencer à utiliser memcache, ce qui était assez récent dans ma mémoire. Mais à peine ont-ils commencé à connaître à nouveau des interruptions de service. À ce moment-là, comme ils ne pouvaient plus optimiser PHP lui-même, ils l'ont compilé en code machine ! Ce qui est la fin de la ligne en ce qui concerne les améliorations. Maintenant ils peuvent seulement ajouter plus de serveurs. A moins qu'ils ne changent de langage. Ce qui, à un moment donné, cessera également d'apporter des avantages.

Ce sont donc les deux options qui s'offrent à vous. Choisissez sagement !

Enfin, je peux ajouter que vous devriez suivre l'ensemble des règles et directives pratiques de Yahoo Yslow et Google Pagespeed pour améliorer les performances. Minimisez vos JS, HTML, PHP, CSS, et placez-les en haut et en bas de page en conséquence. Utilisez un CDN. Concevez des pages plus légères, etc. Bonne chance !

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