2010-01-25 4 views
11

Après avoir demandé this question, J'ai commencé à utiliser Sinatra comme un moyen de servir des pages Web.Pourquoi mon site web Sinatra est-il si lent?

Ce soir, un de mes amis et moi avons commencé à tester la vitesse du serveur.

Le fichier journal dans ressemble:

require 'rubygems' 
require 'sinatra' 
require 'haml' 

enable :sessions #for cookies! 

get '/' do 
    haml :index 
end 

Et le index.haml ressemble:

%title 
    First Page 

%header 
    %h2 First Page 

Il est assis sur un ordinateur portable récent, comme moi, avec un 802.11n d'Apple routeur entre nous deux. Nous avons tous les deux exécuté Windows 7. J'ai également essayé ces mêmes fichiers sur un ordinateur portable exécutant Ubuntu 9.10 x64 avec Sinatra et tous les fichiers pertinents installés à partir d'apt-get.

Sinatra prend 7 secondes pour répondre à une seule requête, quel que soit le système d'exploitation du serveur, Windows ou Linux. Je vois que here l'auteur a réussi à obtenir plus de 400 demandes/seconde traitées. Ce qui donne? (ou devrait-il être sur SuperUser ou similaire?)

+0

Il peut s'agir du serveur utilisé par votre configuration. Il y a des différences majeures entre WEBrick, Thin et Mongrel par exemple. Comment lancez-vous votre application sinatra? – daddz

+0

Depuis la ligne de commande; Fondamentalement, nous courons «ruby TestServer.rb» et ensuite se connecter au port 4567. Je suis un n00b total à cela, donc s'il y a un guide pour ce genre de chose, lemme savoir. – mmr

Répondre

9

I » ll mis de côté des opinions sur le moment où vous devriez optimiser votre application web.

Configurez différentes configurations dans votre application Sinatra pour le développement et la production car certaines de ces suggestions ne vous seront pas toujours utiles. En fait, vous devriez probablement aller de l'avant et installer et environnement similaire à la façon dont vous déploieriez en production. Vous ne pouvez pas déployer en exécutant simplement ruby app.rb. Vous voudriez mettre apache ou nginx devant votre Mongrel. Mongrel va servir vos fichiers statiques, mais ce n'est vraiment conseillé que pour le mode développement. En déploiement, un serveur Web va faire beaucoup mieux pour cela. En bref, votre environnement déployé sera plus rapide que votre environnement de développement autonome.

À ce stade, je ne m'inquiéterais pas de Mongrel contre Thin. Si Thin est deux fois plus rapide - ce n'est pas le cas - alors vos 7 secondes deviennent 3.5. Cela sera-t-il suffisant?

Quelques choses à essayer ...

Je sais que je viens de vous dire de mettre en place un environnement de déploiement, mais peut-être ce n'est pas du côté du serveur. Avez-vous essayé d'exécuter YSlow ou PageSpeed sur vos pages? I/O va prendre plus de ces 7 secondes (Disclaimer: je suppose qu'il n'y a rien de mal avec votre réseau mis en place) que le serveur. YSlow - Firebug en fait - vous dira combien de temps chaque partie de votre page prend pour arriver au navigateur. L'une des choses que YSlow m'a dit de faire était de mettre un en-tête Expires loin en avant sur mes actifs statiques, ce que je savais mais je quittais l'optimisation jusqu'à la fin. C'est à ce moment-là que j'ai réalisé qu'il y avait au moins 3 different places that I could specify that header. Je me convaincs que le faire dans nginx est le bon endroit pour le mettre.

Si vous êtes satisfait de ces résultats, vous pouvez consulter le serveur. Du haut de ma tête, donc pas exhaustive

  1. Activer les réponses gzip.
  2. Combinez vos feuilles de style de manière à ce qu'il n'y en ait qu'une par requête. Il y a peut-être un Middleware Rack pour cela, si vous ne le faites pas manuellement.
  3. Cache. J'essaie Rack::Cache.
  4. Utilisez les sprites pour réduire le nombre de téléchargements d'images que vous utilisez.
  5. Réduisez votre Javascript. Encore une fois, peut-être via Rack Middleware.

Rack L'intergiciel est net, mais il utilise le processeur. Ainsi, la réduction manuelle de votre Javascript ajoute une nouvelle étape à votre flux de travail, mais sur le serveur, c'est plus rapide que le middleware. C'est un compromis.

Désolé si c'était un rambly.

+0

Merci pour la réponse complète! Tu m'as perdu à 'Expiration en tête, loin en avant', après ça, j'apprends les profondeurs de mon ignorance. J'ai beaucoup de rattrapage à faire, je pense. – mmr

+0

C'est un terme que j'ai choisi de Yahoo! YSlow site. http://developer.yahoo.com/performance/rules.html. Cela signifie simplement de définir l'en-tête Expires à un moment donné dans le futur. Comme 20 ans, disons. – dbrown0708

+2

Je choisis ceci comme réponse parce qu'il m'a permis d'apprendre beaucoup sur l'optimisation une fois que j'ai dépassé Hello World.Le correctif, dans ce cas, consistait à désactiver le débogage dans webrick. – mmr

4

Essayez d'utiliser Thin comme serveur. J'ai remarqué une augmentation des performances par rapport à WEBrick et Mongrel.

gem install thin 

Lorsque vous exécutez votre application en utilisant ruby TestServer.rb vous verrez les éléments suivants:

Sinatra/0.10.1 a pris la scène sur 4567 pour le développement avec la sauvegarde de Thin

+0

La version de sinatra que je reçois de gem est 0.9.4; devrais-je obtenir une autre version plus récente? – mmr

+0

J'ai reçu la version 0.10.1 de github. gem install sinatra-sinatra --source = http: //gems.github.com – Trevor

+0

juste comme une note de côté, mince ne fonctionne pas sur Windows sans nmake (c'est-à-dire, pas de version Windows 64 bits, apparemment). Mongrel devrait bien fonctionner. – mmr

5

J'ai eu ce problème lors de l'exécution Sinatra avec fusil de chasse, mais pas lors de l'exécution de mon application directement (par exemple, ruby -rubygems app.rb). C'est parce que shotgun forks et recharge l'application pour chaque demande.

J'ai trouvé un thread in Sinatra's mailing list qui a discuté de ce problème et les gens ont conseillé d'utiliser rerun au lieu du fusil de chasse. Je suis heureux de dire que cela a résolu ce problème pour moi. Je cours Sinatra à l'intérieur de VMWare Fusion avec Vagrant

+0

Merci! La ré-exécution juste installée et l'application se chargent normalement encore. Je pensais que le shotgun ralentirait les choses, mais pas qu'il rechargeait réellement l'application pour chaque requête (y compris tous les actifs, ce qui détruisait les performances même juste pour tester en mode dev). –

1

Mon application fonctionnait lentement (environ dix secondes pour répondre à une demande). Ensuite, j'ai trouvé ce petit bijou:

Webrick is very slow to respond. How to speed it up?

Il semble que WEBrick était (par défaut) configuré pour inverser dns recherche sur chaque demande, et qu'il ralentissais.