On entend souvent dire que ruby on rails est lent, et que pour un hébergement mutualité, ce n'est pas viable.
Or, si la lenteur est évidente comparé à une simple page php, le framework est très performant à la vue des nombreuses fonctionnalités qu'il propose. Ruby n'est pas plus lent que php ou python, et avec l'arrivée du nouvel interpréteur Yarv (benchmark, ruby 1.9), et d'une machine virtuelle comme java (ruby 2), ruby sera même plus performant.
Ruby on rails dans sa grande facilité permet de coder proprement, comme de coder très salement. Après la lecture de cet article sur rails-edge, voici ce que l'on peut lire comme conseils:
- Ne pas faire d'erreurs ridicules
- Ne pas faire 50 requêtes sql par page
- Mettre en cache ce qui peut l'être
- Mettre le serveur sql sur une autre machine
- Lancer énormément de fois mongrel
- Ajouter des serveurs, et faire de la réplication
L'article original donne comme conseil de lancer plusieurs fois le serveur httpd mongrel, et donne un exemple avec 40 mongrels. La configuration du serveur explose alors, il faut 4 cpu, et 3gb de ram… Alors avant de réduire à néant la réactivité de votre serveur, prenez le temps de chercher (et trouver) une meilleure configuration.
Pour moi, il ne fait pas de doutes que mongrel soit lent. Je l'utilise en développement, et j'accepte sa lenteur. Mais en production cette lenteur devient vite énervante. Là où mongrel est le plus lent, c'est pour le transfert de fichiers (images, feuilles de styles, javascript, etc…). Désactivez le cache de votre navigateur, naviguez rapidement sur votre site. On a l'impression que mongrel ne peux délivrer qu'une seule requête à la fois (d'où la nécessité de le lancer 40 fois).
J'utilise en production lighttpd et fastcgi. Pour le transfert de fichiers, lighttpd est souvent cité comme l'un des plus rapides. Aucun problème de ce cotés là. Fastcgi, est lui aussi très performant, et il détermine automatiquement le nombre de démons à avoir en fonction de la charge. Pas la peine de le lancer 40 fois. Alors oui, c'est plus compliqué à configurer (en restant relativement facile), mais c'est aussi beaucoup plus performant.
J'ajoute quelques conseils:
- Toujours penser un minimum aux performances lorsque l'on code
- Prendre le temps de configurer un serveur httpd performant
- Utiliser des proxys
- Un proxy http (squid par exemple)
- Et tester un proxy sql (mysql proxy par exemple)
- Lire cet article très intéressant: 10 astuces pour ruby on rails (en anglais)
Voilà, avec tout ça, vous devrez avoir une application bien plus performante, sans avoir recours à un puissant serveur.
Le 19/08/2007 à 14:13
Mongrel
Mongrel ne peut effectivement servir qu'une requête à la fois. Mais je ne pense pas qu'il soit lent, pour servir une application Rails, il est, il me semble, le meilleur choix. Mais il est très mauvais pour les fichiers statiques (images, css, js, ...), il faut donc faire en sorte que le proxy qui se trouve devant ( Apache dans mon cas ) serve lui-même les fichiers statiques ( avec Apache on fait ça avec une règle mod_rewrite ).