Comment passer d'une configuration à serveur unique


8

Je recherche des ressources sur la façon de développer notre configuration de serveur.

Nous avons actuellement un serveur dédié avec Rackspace au Royaume-Uni de la spécification suivante:

HPDL385_G2_PrevGen
HP Single Dual Core Opteron 2214 (2,2 GHz)
4 Go de RAM
2x 10000 disques SCSI en RAID 1

Notre trafic peut atteindre 550 000 UV par mois.

Le site fonctionne avec une configuration PHP et MySQL. La base de données obtient un martèlement absolu, nous avons de nombreuses requêtes complexes joignant des tables multilpe.

Nous utilisons APC pour la mise en cache PHP.

J'arrive au stade où j'ai fait autant d'optimisation des bases de données et des requêtes que possible et je me demande quelle devrait être la prochaine étape ...

J'ai regardé memcache, mais j'ai l'impression que son nécessite une grande quantité de RAM et idéalement une boîte dédiée ....

La prochaine étape est donc d'avoir deux cases; un pour la base de données, un pour Apache? Ou y a-t-il une étape que j'ai négligée.

Notre charge se situe généralement autour de la barre des 2, mais elle est actuellement à 20!

Quelques graphiques de Munin:

mysql CPU Mémoire


Je vais vérifier Erik, merci. Est-ce que quelqu'un pense que l'augmentation de la quantité de RAM aurait un effet important? Je pense que c'est cher chez Rackspace, 50 £ / Go / mois IIRC.

Faites-vous des lectures et des écritures MySQL ou l'une est-elle plus importante que l'autre?
wag2639

Je ne suis pas convaincu que cela aurait dû être déplacé de SO. La mise à l'échelle au-delà d'une seule boîte est autant un problème de programmation qu'un problème matériel. Plus encore, en fait. L'achat de matériel est facile. Il est difficile d'écrire du code qui l'utilise de manière évolutive horizontalement.
Frank Farmer

wag2639 la grande majorité des requêtes sont sélectionnées. Selon mon graphique Munin, les accès au cache représentent environ 50% du total .... est-il possible de publier une image? Pic à 2160 QPS, moyenne 522 QPS.
Jon M

Réponses:


3

Achetez du matériel, mais mettez-le dans votre laboratoire de test et non dans le centre de données. Insistez ensuite votre application sur diverses combinaisons matériel / logiciel jusqu'à ce que vous en trouviez une raisonnable qui fera ce que vous voulez.

Bien sûr, vous devrez concevoir quelque chose qui peut créer un faux trafic sur une base de données de type production exécutant une copie de test de votre application. Mais qui a dit que ce serait facile.

Si vous ne faites pas cela et faites simplement des choses en production, vous ne savez pas si cela va fonctionner ou non, et vous avez peut-être dépensé BEAUCOUP d'efforts d'ingénierie pour implémenter des choses comme les caches (qui viendront avec leur juste part). de bugs!) sur quelque chose qui n'aide pas.

Testez, testez et testez plus. N'effectuez pas de modifications matérielles / logicielles en production tant que vous ne disposez pas de bonnes données de performances montrant qu'elles sont susceptibles d'améliorer considérablement les choses. L'effort d'ingénierie est coûteux, le matériel de test ne l'est pas (en particulier).


Memcached n'est qu'une option, et vous n'aurez probablement pas à l'envisager jusqu'à ce que la mise en cache de la base de données fonctionne de manière optimale. Cela signifie le placer sur une boîte dédiée (64 bits, bien sûr) avec une quantité raisonnable de RAM (pas 4G - les ordinateurs portables en ont de nos jours; la 32G est certainement abordable) et le régler de manière appropriée.

Vous n'avez pas mentionné la taille de votre base de données, mais si cela est possible, vous voudrez essayer de l'obtenir entièrement en RAM (ou au moins les bits chauds). Obtenir votre base de données entièrement dans ram fera complètement disparaître les opérations d'E / S de lecture et cessera donc d'être un goulot d'étranglement.

Profilez vos requêtes de base de données. Il existe des outils pour faire cela - vous devriez pouvoir simuler la charge de production dans votre environnement de test. L'astuce consiste à éviter les requêtes lentes et à garantir que les requêtes fréquemment exécutées sont rapides.

Si vos problèmes de performances sont liés aux synchronisations d'E / S, parce que vous effectuez simplement trop de transactions pour la base de données, assurez-vous que vous utilisez un contrôleur RAID de batterie qui se comporte correctement (parlez-en à votre fournisseur). Ils donnent beaucoup plus d'opérations d'écriture d'E / S que celles qui ne sont pas sauvegardées par la batterie (car les données doivent uniquement être mises en cache avant que le système d'exploitation n'obtienne la confirmation). Sinon, si vos données importent peu, pensez à assouplir les paramètres de durabilité de la base de données (synchronisation innodb lors de la validation).


La 32G n'est pas vraiment abordable lorsque vous louez du matériel. Et la location de matériel est généralement plus économique lorsque vous n'avez qu'une ou deux boîtes.
Frank Farmer

MarkR / Frank, pouvez-vous donner plus d'informations sur la base des graphiques que j'ai publiés ci-dessus? Ma dernière offre de RAM supplémentaire était de ~ 50 £ / Go / mois!
Jon M

1

En recherchant des solutions de mise en cache, comme beaucoup d'autres l'ont suggéré ici, vous pouvez vous attendre à finir avec environ 10% de la charge que vous avez aujourd'hui, peut-être moins.

Cependant, cela dépend du type de services que vous exécutez sur votre machine. Vous pouvez faire beaucoup de choses avec memcached sans beaucoup de RAM.

Vous devez essayer de profiler les requêtes de base de données qui prennent le plus de temps, soit en utilisant le journal des requêtes lentes de MySQL (ou l'équivalent pour votre base de données), soit en utilisant un outil tel que mytop . De plus, la EXPLAIN SELECTsyntaxe de MySQL peut être utile.

La mise en cache des résultats de quelques requêtes MySQL sélectionnées (même pour une courte période) peut vraiment améliorer considérablement vos performances.


Merci Vegard. Oui, je consulte régulièrement le journal des requêtes lentes et explique la commande sur mes requêtes. Le serveur exécute à peu près juste des instances Apache et MySQL, mais nous faisons également quelques choses comme la conversion vidéo, que je suis en train de passer à un serveur cloud.

Si votre problème est vraiment à court de threads apache, vous pouvez alléger assez facilement une partie de la charge en installant nginx (ou un autre proxy inverse léger) devant apache. Nginx peut alors servir du contenu statique, et prendre en charge la tâche d'alimenter lentement les clients en cuillère, libérant apache pour faire ce dont il a vraiment besoin: agir comme un conteneur d'application PHP. Pour un aperçu plus complet de ce concept, voir: modperlbook.org/html/…
Frank Farmer

Merci Frank, cela semble certainement raisonnable, j'ai déménagé autant que possible sur Amazon S3, au départ c'était juste UGC, mais j'essaie maintenant de mettre tous les éléments graphiques et CSS là-dessus aussi. Je suis sûr qu'il y a quelques ajustements Apache et MySQL à faire.
Jon M

1

Je fais beaucoup de performances et de travail d'évolution et ce que j'ai découvert, c'est que:

Chaque charge d'application est unique

Les réponses génériques comme ajouter plus de RAM, obtenir un autre serveur, faire y, essayer x sont souvent des leçons de frustration et laisser aux configurations alambiquées.

Mesurer les bonnes choses

L'un des plus grands défis consiste à déterminer quels repères sont importants. Cela nécessite souvent un pas en arrière et vous devez vous mettre à la place de votre client. Parfois, la conception simplifiée du site change et signifie d'énormes avantages pour le visiteur Web. C'est pourquoi j'aime les outils comme YSlow! qui se concentrent davantage sur l'expérience de l'utilisateur final plutôt que sur le niveau du serveur. Une fois que vous avez décidé quelle est la bonne référence pour votre site, vous pouvez commencer à l'optimiser. Les repères peuvent être le temps total de chargement de la page, la taille totale de la page, l'efficacité du cache, la latence du site, etc. Vous devez choisir celui qui convient à votre application.

Écrous et boulons

Celui que vous suivez les bons repères, commencez à un niveau très bas. J'aime utiliser sysstat. Vous pouvez obtenir une multitude d'informations de sysstat et vous aider à déterminer quel système peut limiter les performances globales de l'application. Généralement, je résume les problèmes de performances dans:

  • pile réseau
  • pile de mémoire
  • disque io
  • couche d'application
  • couche os

À l'aide de sysstat et d'autres outils, vous pouvez commencer à diviser les cheveux et trouver le système qui limite les performances.

Par exemple, j'ai vu des serveurs très chargés échouer en raison de la configuration de leur application. Une mauvaise mise en cache, le manque d'en-têtes expirés sur le contenu statique, l'utilisation de HTTP par rapport aux inclusions de fichiers, etc. ont toutes contribué aux mauvaises performances de l'application. La résolution de ces problèmes d'application n'a nécessité aucune modification matérielle. Dans d'autres cas, j'ai vu les disques au maximum malgré des tonnes de mise en cache. Le passage à des disques plus rapides a résolu le problème.

Rincer et répéter

Souvent, lors du réglage des applications, vous déboucherez un goulot d'étranglement pour n'en trouver qu'un autre. C'est pourquoi je recommande d'essayer de surveiller ce que vous syntonisez.

Par exemple, supposons que vous résolviez un problème d'E / S disque mais que votre application soit toujours lente. Vous pensez peut-être que vous avez gaspillé vos efforts, mais ce qui se passe, c'est que vous avez simplement frappé un autre goulot d'étranglement. En surveillant attentivement les E / S de disque, vous pouvez être sûr que vous améliorez les E / S de disque même si vos analyseurs de performances d'application importants ne changent pas.

Obtenez les bons outils

Assurez-vous que vous utilisez les bons outils pour le travail. La surveillance, les tests, l'analyse comparative, le profilage et d'autres techniques d'optimisation disposent tous d'une variété d'outils. Trouvez l'outil qui correspond le mieux à votre situation.

Règles de base

Bien que chaque application soit unique, je trouve certains points de départ standard:

  • bases de données de mémoire aiment la mémoire
  • disque io tout sauf raid 10 peut tuer les performances de la base de données
  • mauvaises optimisations - les grandes valeurs ne se traduisent pas par de grandes performances
  • application - blâmer le serveur pour la mauvaise conception de l'application

Vos prochaines étapes

Si vous ne trouvez pas votre goulot d'étranglement, l'ajout d'un serveur peut ne pas aider beaucoup. Pour résoudre les E / S sur disque, vous pouvez avoir besoin d'un autre serveur ou SAN. Si vous avez un goulot d'étranglement, un autre serveur résoudra le problème uniquement en ce qu'il ajoute plus de RAM. Déplacement assez coûteux par rapport à l'ajout de plus de RAM à votre serveur existant.

Solution rapide

Plus de déploiement. J'ai dû faire cela quand il semble que la pile d'applications soit le problème. Charge essentiellement le CPU, la RAM et le disque IO (RAID 10, 15K SCSI ou SSD). Allez gros sur le matériel, puis commencez à régler. Cela vous maintient à flot jusqu'à ce que vous résolviez les problèmes.


0

Je dirais que la prochaine étape devrait être la mise en cache (mise en cache des données et / ou mise en cache des pages en fonction de vos fonctionnalités). Si memcached semble trop complexe, vous pouvez commencer avec des solutions de mise en cache de données simples comme PEAR Cache Lite qui ne nécessitent que quelques lignes de code mais qui pourraient faire une énorme différence. La mise en cache des pages (ou parties de page) est prise en charge par le moteur de modèle Smarty par exemple.

Une fois que la mise en cache ne le coupe plus, vous pouvez augmenter la quantité de serveur car il ne reste plus rien.


Merci pour vos conseils Serg, je suis déjà en train de mettre en cache HTML à divers endroits et j'utilise des requêtes de base de données du jour au lendemain pour remplir quelques tables de "recherche rapide".

0

Si vous avez suffisamment de RAM libre, memcached vous aidera même sur la même boîte. Essayez de mettre en cache plusieurs requêtes les plus lourdes et de voir ce qui se passera. De plus, Apache est trop lourd, utilisez plutôt nginx ou lighttpd (avec une application PHP fonctionnant via FastCGI, voir php-fpm ).


Si vous avez suffisamment de RAM libre et que mysql est lent à répondre aux requêtes de lecture, vous n'avez pas réglé correctement mysql. utilisez plutôt le ram pour la base de données. La mise en cache de MySQL sera entièrement transparente pour l'application, n'introduira pas de bogues et ne retournera jamais de données périmées.
MarkR

Le cache de requêtes mysql est, pour de nombreuses charges de travail, invalidé beaucoup trop agressivement pour être utile. La mise à jour d'une seule ligne sur une table invalide chaque requête sur cette table.
Frank Farmer

0

Commencez la mise en cache, mais ignorez MySQL pour le moment. Sérieusement.

La règle devrait être - arrêtez une demande LE PLUS TÔT POSSIBLE. Ainsi, un proxy inverse ou une mise en cache appropriée au niveau Apache va vous obtenir les meilleurs résultats, puis la mise en cache des résultats au niveau sql DANS l'application, puis la mise en cache au niveau sql;)

Plus vous arrêtez une demande tôt, moins vous avez de frais généraux. Niveau de cache de sortie - même PHP n'a pas besoin de s'exécuter, pour ainsi dire.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.