Mise à l'échelle de l'application Web dans plusieurs services

Nous développons notre application Web et nous avons travaillé à réduire nos time de chargement. Lorsque nous avons commencé à développer l'application, nous nous sums inscrits avec un fournisseur d'hébergement bien connu offrant des «solutions dédiées» sur le cloud. Par conséquent, nous avons un server dédié pour notre application Web et un server dédié à notre database. Les deux servers ont été configurés avec la même quantité de RAM, la même CPU et les disques SSD. Même en investissant du time et de l'argent dans notre infrastructure, nous avons remarqué des time de chargement de 8 à 10 secondes.

Nous avons été informés par une autre société d'hébergement que nous devrions réduire et mettre tout sur un server (au lieu de le split). Ils ont mentionné que le fait de séparer les servers entraînerait des time de chargement plus élevés en raison de la latence du réseau et a déclaré que PHP communiquerait plus rapidement avec SQL via des sockets que sur le réseau. Ce que je sais est vrai, mais je ne m'attendais pas aux résultats obtenus. Immédiatement après avoir transféré tout à notre server d'application d'origine, nos time de chargement ont plongé à 3-4 secondes de 8 à 10!

Le problème est que nous examinons maintenant un nouveau fournisseur d'hébergement et nous avons conseillé d'utiliser un cluster avec un équilibreur de charge, un server de database, un server d'applications et une échelle à partir de là. La préoccupation est que si nous séparons à nouveau l'application et le server de la database, nous reviendrons sur la première place.

D'après tout ce que j'ai lu, il est presque toujours recommandé de répartir ces servers plutôt que de les regrouper. Existe-t-il une amélioration de la performance avec ce qui se passe lorsque la configuration est correcte, ou est-ce simplement pour une évolutivité à long terme?

J'apprécie l'aide!

Votre question est très large, alors je mentionne quelques aspects:

  • I / O de prise locale est plus rapide que TCP, mais pour la plupart des applications, cela devrait être minime par rapport à toutes les autres parties de votre timeout (équilibreur de charge, traitement PHP, traitement des requêtes DB …)

  • Les systèmes fractionnés permettent une meilleure caching, par exemple, le server DB peut conserver plus d'indices dans la RAM.

  • éventuellement un point d'évolutivité: les systèmes fractionnés sont plus faciles à configurer, par exemple pour déployer une nouvelle version de logiciel ou une mise à jour PHP, vous pouvez simplement append un nouveau server d'applications, le tester et finalement enlever l'ancien.

  • pour enquêter sur vos problèmes: vérifiez le nombre de connections DB ouvertes pour chaque request Web. Une explication pour vos mesures serait une application qui utilise de nombreuses requêtes SQL sans connections persistantes, de sorte qu'une nouvelle connection TCP est ouverte pour chaque access DB.

Je ne sais pas ce que vous faites pour get des time de chargement de 8 à 10 secondes (en supposant que vous définissez "time de chargement" comme "le time entre la request HTTP arrive et la page est construite et envoyée au browser").

Vous ne devriez pas être en mesure d'get vos CPU à 100% d'utilisation avec un server Web et une database, et même si vous gérez cela en quelque sorte, le server Web et la database sur un seul server n'auraient pas d'aide.

En outre, tout type de surcharge sur le server DB ne serait pas atténué en déplaçant les deux servers sur le même matériel.

Donc, le problème doit presque avoir quelque chose à voir avec

  • beaucoup d'énoncés SQL très petits qui sont envoyés à la DB individuellement, donc même la petite latence sur un réseau local s'accumule (imaginez que vous avez 10000 instructions SQL par page et une latence du réseau de 0.1 msec. Cela entraînera votre charge de 10 secondes time).
  • énormes blobs stockés dans la database qui doivent accéder au server Web via la connection sql, qui est généralement plus lent qu'un protocole conçu pour le transfert de files, en particulier sur le réseau
  • la connection réseau entre vos hôtes est artificiellement limitée d'une manière ou d'une autre

Peut-être que c'est autre chose que je ne peux pas imaginer pour le moment, car il est très rare qu'une application Web typique devienne plus lente lorsque vous la dissortingbuez à plus de CPU, pourvu que ces CPU aient une connection réseau rapide entre elles.

Tant que vous ne trouvez pas ce qui a causé ou causé des problèmes sur des hôtes séparés, vous pourriez avoir le même problème à nouveau, ou vous ne le feriez peut-être pas.

J'ai eu le premier type de problème l'année dernière – un client de ma part a contraint une tierce partie à développer un logiciel pour eux. Une opération typique sur un ordinateur portable de démonstration a pris environ 4 heures pour terminer. Lorsque mon client a déplacé le logiciel vers l'environnement de production prévu (server d'applications BIG, cluster de database GRAND), la même chose a pris un peu plus de 16 heures. Au fur et à mesure des searchs effectuées, nous avons constaté que l'application avait fait environ 15 000 sélections par seconde sur le système dev, et la latence de 0,3 ms entre le server d'applications et la database a limité cette valeur à un peu plus de 3000 sélections par seconde. Les développeurs ont été invités à changer la façon dont ils ont accédé à la database (faire une jointure sur 2 tables au lieu d'une sélection sur une, puis une sélection de ligne unique sur chacun des résultats), ce qui a entraîné une opération entière de less de 30 minutes.

Le problème est que le type de problème que vous rencontrez est inhabituel, que votre logiciel risque de se comporter de manière inhabituelle, et vous devriez vraiment enquêter sur ce qui se passe ici et pourquoi le 2-machine-setup était tellement plus lent.

Le fractionnement dans 2 machines devrait normalement améliorer les performances, car vous avez plus de CPU pour faire le travail. Cela augmente également la maintenabilité. Votre database peut avoir besoin d'un paramètre de kernel ou d'un niveau de patch spécial pour bien fonctionner; votre server Web peut avoir des exigences contradictoires. Et, chaque fois que vous faites une mise à niveau, il est tellement plus facile de pouvoir mettre à niveau l'un des deux systèmes sans toucher l'autre.