L’application Rails hébergée sur le passager * péniblement * lente, mais le serveur est une bête

Je me suis efforcé de déployer une application Rails relativement grande (Rails 2.3.5) et, récemment, nous avons effectué des tests de charge. Nous avons découvert que le débit du site était bien inférieur au niveau de trafic attendu.

Nous utilisions un serveur standard de 32 bits, 3 Go de RAM avec Centos, et nous exécutions Ruby Enterprise Edition (dernière version), Passenger (dernière version) et Nginx (dernière version) – lorsque le site ne comporte qu’un ou deux utilisateurs. bien (comme on peut s’y attendre) cependant, lorsque nous essayons de faire monter la charge à environ 50 requêtes simultanées, elle meurt complètement. (Rapport Apache Bench ~ 2,3 req / sec, ce qui est terrible )

Nous exécutons RPM et essayons de déterminer où se trouve le problème de charge, mais il est dissortingbué de manière assez uniforme entre Rails, SQL et Memcached. Nous sums donc plus ou moins en train d’examiner et d’optimiser la base de code.

En désespoir de cause, nous avons créé une grande instance EC2 (Ubuntu 9.10, 7,5 Go de RAM, 2 unités de calcul / cœurs) et configuré la même configuration que le serveur d’origine.

Donc, après avoir passé trop de temps à essayer d’optimiser, à jouer avec la configuration de la mise en cache, etc., j’ai décidé de tester le débit de certains mongrels, et ta-da, ils sont beaucoup plus performants que Passenger.

Actuellement, la configuration est de 15x Mongrels par proxy via Nginx, et nous semblons répondre à nos exigences de charge, mais cela ne suffit pas pour me familiariser avec la mise en ligne … Je me demandais si quelqu’un connaissait certaines causes possibles …?

Ma configuration pour passagers / nginx était:

  • Travailleurs Nginx: essayé entre 1 et 10, généralement trois.
  • Taille maximale du passager: 10 – 30 (oui, ces chiffres sont assez élevés)
  • Mise en queue globale des passagers: mise en marche et arrêt simultanés.
  • NGinx GZip sur: oui

Il pourrait être intéressant de noter que nous avons augmenté la taille du corps du client nginx max à 200 m pour permettre le téléchargement de fichiers volumineux.

Quoi qu’il en soit, les suggestions seraient vraiment appréciées, alors que les métis fonctionnent bien, cela change beaucoup notre façon de faire et je préférerais vraiment utiliser Passenger – d’ailleurs, n’était-il pas censé rendre cela plus facile et performant?

Peut-être que la taille de votre piscine SQL est trop petite? Cela limite essentiellement le parallélisme des charges de travail de firebase database dans votre application, qui à son tour augmente considérablement la charge dès que vous mettez du travail sur votre stack d’applications …

Dans un premier temps, je déploierais une application Rails de type “Hello World” minimale sur votre environnement et je verrais quel débit vous obtenez avec cela. Cela vous dira au moins si votre problème concerne l’environnement ou quelque part dans votre application.