RoR sur un kimsufi

Eric D. wrote the following on 13.03.2007 11:55 :

je precise que l’activite du site est proche de l’ancephalogramme plat,
de ram que ça et avec fluidité .

Prendre plus que 100Mo de ram pour ça c’est franchement innacceptable.

Comme je le disais, ce n’est pas Rails le plus gourmand dans cette
histoire, mais plutôt MySQL… Sur un mutualisé la base de données et
tout le reste sont déjà présents, tu peux donc compter environ 60M de
RAM.
Evidemment le tableau change lorsqu’on augmente le nombre de Mongrels ou
processus fastcgi…

Pire, pour ne rien gacher notre architecture est fixe : on a lancé 2
mongrels, qui seront toujours là qu’ils reçoivent 0 requêtes ou 50. Ca
aussi c’est innacceptable. Ca fait des années que les serveurs Web savent
gérer un processus léger permanent pour quand il n’y a aucune requête, et
en créer plein à la volée dès qu’il y en a besoin (et les supprimer dès
qu’il y en a trop d’inutilisés).

Rails ne permet pas d’avoir des processus légers et il n’y a pas grand
chose à faire de ce côté (le mieux serait de permettre de forker après
le chargement des librairies et avant l’établissement des connexions
avec la BD, mais c’est complexe et a des effets de bord). De toute
manière ce processus n’est pas intégrable dans le serveur web et
nécessiterait le dev d’un ‘super-mongrel’.

On revient en arrière de presque 12 ans là , tant que le ratio mémoire
utilisée / mémoire dispo que sur la capacité du serveur à s’adapter à sa
charge.

Si quelqu’un a une solution je veux bien, mais là on ne s’imposera pas
tant qu’on n’aura pas résolu le(s) problème(s)

Tout dépend du marché que tu adresses. J’ai une appli en production qui
aurait probablement coûté le double si elle avait été faite en PHP (on
passe de plus de 150k€ à 300k€ quand même) et elle tourne dans une
infrastructure qui me coûte moins de 100€ par mois (en comptant la
machine, la bande-passante, la supervision, le backup et une machine de
spare). Pour info, actuellement je m’en sors avec 120M tout compris
alors qu’en plus de lighttpd/rails/PostgreSQL j’ai besoin d’un serveur
Postfix dédié et d’un ordonnanceur en Ruby qui me coûtent 41,5M. En
comptant tout le système, ça fait moins de 80M pour une appli Rails avec
trois processus fastcgi traitant les requêtes HTTP en parallèle.

Je pense pouvoir dire qu’il y a très peu de chances que je dépense ne
serait-ce que 10% des 150k€ de différence en coûts d’hébergement
supplémentaires par rapport à toute autre solution technique…

Il faut positionner Rails face aux infrastructures J2EE qui elles
nécessitent encore plus de RAM (x10 ?) pour le ticket d’entrée, pas en
face de mod_php pour héberger des sites webs vaguement interractifs sur
serveurs mutualisés… Je ne pourrai tout simplement pas héberger une
appli J2EE sur mon infrastructure actuelle, ça me coûterait probablement
3 fois plus cher en hébergement.

Si tu vends Rails en tant que techno pour héberger un site perso chez
Free, il y a erreur de casting.

Lionel

Le 13/03/07, Eric D. a écrit :

On revient en arrière de presque 12 ans là , tant que le ratio mémoire
utilisée / mémoire dispo que sur la capacité du serveur à s’adapter à sa
charge.

Si quelqu’un a une solution je veux bien, mais là on ne s’imposera pas
tant qu’on n’aura pas résolu le(s) problème(s)

Personnellement je pense que c’est un faux problème car Rails n’a pas
vraiment les mêmes objectifs que PHP. Rails est à mon avis clairement
orienté professionnel. Je ne vois pas le grand public hébergé chez free,
apprendre l’objet et un modèle MVC juste pour son site perso. Par contre
un
professionnel a largement les moyens d’investir dans un serveur avec
suffisamment de RAM. Rails est au même niveau que Zope ou Java, il
nécessite
un minimum de ressources matériel, et on remarquera que Zope et Java ne
sont
clairement pas utilisé par le public.
Rails s’impose déjà :slight_smile:

Le Mar 13 mars 2007 10:54, Guillaume B. a écrit :

“production”.
On a vraiment un énorme problème avec l’hébergement de rails. Voir comme
un succès qu’une appli sans utilisateur tienne sur un serveur dédié avec
256 Mo de ram ça m’horrifie. Je me rappelle encore il y a 10 ans où
on
faisait tourner des serveurs PHP sur des pentium pro 200 Mghz avec moins
de ram que ça et avec fluidité .

Prendre plus que 100Mo de ram pour ça c’est franchement innacceptable.

Pire, pour ne rien gacher notre architecture est fixe : on a lancé 2
mongrels, qui seront toujours là qu’ils reçoivent 0 requêtes ou 50. Ca
aussi c’est innacceptable. Ca fait des années que les serveurs Web savent
gérer un processus léger permanent pour quand il n’y a aucune requête, et
en créer plein à la volée dès qu’il y en a besoin (et les supprimer
dèsqu’il y en a trop d’inutilisés).

On revient en arrière de presque 12 ans là, tant que le ratio mémoire
utilisée / mémoire dispo que sur la capacité du serveur à s’adapter à sa
charge.

Si quelqu’un a une solution je veux bien, mais là on ne s’imposera pas
tant qu’on n’aura pas résolu le(s) problème(s)


Éric Daspet
http://eric.daspet.name/

Mais il est clairement beaucoup plus lourd que PostgreSQL…

Magie de RubyOnRails, me voici déjà avec un système PostgreSQL qui
tourne (-:

Les stats sont déjà bcp plus flatteuses ! Bon, je vais le laisser
tourner qques
jours, pour voir si il devient plus gourmand.

free -m

          total       used       free     shared    buffers 

cached
Mem: 217 179 37 0 12
72
-/+ buffers/cache: 94 122
Swap: 509 1 508

ps aux

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 1444 444 ? S Mar12 0:06 init
[3]
root 2 0.0 0.0 0 0 ? S Mar12 0:00
[keventd]
root 3 0.0 0.0 0 0 ? SN Mar12 0:00
[ksoftirqd_CPU0]
root 4 0.0 0.0 0 0 ? S Mar12 0:01
[kswapd]
root 5 0.0 0.0 0 0 ? S Mar12 0:00
[bdflush]
root 6 0.0 0.0 0 0 ? S Mar12 0:00
[kupdated]
root 7 0.0 0.0 0 0 ? S< Mar12 0:00
[mdrecoveryd]
root 8 0.0 0.0 0 0 ? S Mar12 0:00
[kjournald]
root 28831 0.0 0.0 0 0 ? S Mar12 0:00
[kjournald]
root 28212 0.0 0.3 2096 768 ? Ss Mar12 0:00
/usr/sbin/syslog-ng
root 19476 0.0 0.3 5840 888 ? Ss Mar12 0:00 nginx:
master
process /usr/sbin
nginx 21495 0.0 0.8 6000 1924 ? S Mar12 0:00 nginx:
worker
process
root 361 0.0 0.4 3832 928 ? Ss Mar12 0:01
/usr/sbin/sshd
root 27104 0.0 0.3 1968 676 ? Ss Mar12 0:00
/usr/sbin/cron
root 17547 0.0 0.1 1432 380 tty1 Ss+ Mar12 0:00
/sbin/agetty
root 9336 0.0 0.1 1432 380 tty2 Ss+ Mar12 0:00
/sbin/agetty
root 20245 0.0 0.1 1432 380 tty3 Ss+ Mar12 0:00
/sbin/agetty
root 20953 0.0 0.1 1432 380 tty4 Ss+ Mar12 0:00
/sbin/agetty
root 31338 0.0 0.1 1432 380 tty5 Ss+ Mar12 0:00
/sbin/agetty
root 26134 0.0 0.1 1432 380 tty6 Ss+ Mar12 0:00
/sbin/agetty
root 28377 0.0 1.0 6832 2336 ? Ss 09:57 0:01 sshd:
root
25733 0.0 0.8 3144 1796 ttyp0 Ss 09:57 0:00 -bash
postgres 31621 0.0 2.6 23152 5956 ? Ss 13:11 0:00
/usr/bin/postmaster -D /var/lib
postgres 8259 0.0 3.0 23284 6832 ? S 13:11 0:00
postgres:
writer process
postgres 16353 0.0 1.0 8420 2400 ? S 13:11 0:00
postgres: stats
buffer process
postgres 2750 0.0 1.3 8048 2932 ? S 13:11 0:00
postgres: stats
collector proce
root 25181 0.3 13.6 32820 30444 ? S 13:38 0:02
/usr/bin/ruby18
/usr/bin/mongre
root 18007 0.3 13.8 33172 30880 ? S 13:38 0:02
/usr/bin/ruby18
/usr/bin/mongre
postgres 25969 0.0 3.7 24040 8432 ? S 13:40 0:00
postgres:
elevage elevage 127.0
postgres 5178 0.0 4.0 24136 8952 ? S 13:40 0:00
postgres:
elevage elevage 127.0
root 18452 0.0 0.4 2292 904 ttyp0 R+ 13:52 0:00 ps aux

gUI

La différence de 10€ n’est à mon avis pas suffisante, l’écart entre la
taille mémoire est trop énorme. 256 Mo de RAM c’est vraiment trop faible.

Je pense que 10€ (HT en plus) c’est quand meme bcp comme différence.
Faut pas
oublier que le dedibox se trouve à 50% plus cher qu’un kimsufi, ou le
kimsufi Ã
30% moins cher que le dedibox.

Ensuite, la qualité de la connexion est apparemment pas la meme (là , je
me base
sur ce que je lis sur les forums), ainsi que le processeur (d’ailleurs
au
passage j’ai un Celeron 2.6GHz, et non pas 2GHz comme écrit sur le
site).

Et pour finir, un kimsufi se paye par CB, chaque mois si on veut (alors
que
dedibox c’est RIB, sinon amende !!!). Pas besoin de résilier, suffit de
pas payer !

En fait il manque pile-poil la prestation au milieu : un petit serveur
(Celeron
pourquoi pas) avec 512Mo de RAM. 256Mo de RAM ça limite les utilisations
(c’est
de toutes façons clairement dit sur le site), et pour du Rails, ça
devrait
servir à faire tourner une maquette, ou alors un tout petit site en
production.

gUI

2007/3/13, Guillaume B. :

Magie de RubyOnRails, me voici déjà avec un système PostgreSQL qui tourne
(-:

Les stats sont déjà bcp plus flatteuses ! Bon, je vais le laisser tourner
qques
jours, pour voir si il devient plus gourmand.

A propos de PostgreSQL il existe ce bouquin récent que je viens de
commander
:
http://www.amazon.fr/PostgreSQL-8-1-Administration-exploitation-données/dp/2746034689/

Pour ceux intéressés par une vraie base de données … :slight_smile:

A propos de PostgreSQL il existe ce bouquin récent que je viens de
commander :

Si il y a un chapitre sur l’optimisation mémoire, je t’autorise à m’en faire
un
résumé (((-:

gUI


Guillaume B. : (05 61) 19 40 65 / bureau 602N

Guillaume B. wrote the following on 13.03.2007 13:54 :

Mais il est clairement beaucoup plus lourd que PostgreSQL…

Magie de RubyOnRails, me voici déjà avec un système PostgreSQL qui
tourne (-:

Les stats sont déjà bcp plus flatteuses ! Bon, je vais le laisser
tourner qques jours, pour voir si il devient plus gourmand.

Pour le dev et des petites démos, ça n’a guère d’importance, mais si tu
utilises PostgreSQL en prod, tu auras intérêt à faire tourner
pg_autovacuum. Ca te prendra probablement moins d’un mega de RAM mais
c’est un excellent investissement (PostgreSQL a besoin d’avoir des stats
à jour sur ses tables pour bien utiliser ses indexes et pg_autovacuum
automatise cela, MySQL a l’avantage de faire ça automatiquement).

Lionel.

Rails fonctionne aussi avec il me semble.

oui, et c’est d’ailleurs ce que j’utilise en dev. on m’a dit qu’il a
l’inconvénient de ne pas pouvoir faire d’accès concurrents, donc je voulais
voir
avec un vrai SGBD. Vu que PostgreSQL a l’air d’etre pas trop gourmand,
je
pense que je vais le garder le temps de faire un peu plus d’essais.

gUI


Guillaume B. : (05 61) 19 40 65 / bureau 602N

Le 13/03/07, Lionel B. a écrit :

Pour le dev et des petites démos, ça n’a guère d’importance, mais si tu
utilises PostgreSQL en prod, tu auras intérêt à faire tourner
pg_autovacuum. Ca te prendra probablement moins d’un mega de RAM mais
c’est un excellent investissement (PostgreSQL a besoin d’avoir des stats
à jour sur ses tables pour bien utiliser ses indexes et pg_autovacuum
automatise cela, MySQL a l’avantage de faire ça automatiquement).

J’en saurais plus avec le bouquin mais je suis presque sûr que le vacuum
est
automatique depuis les version 8.x

J’en saurais plus avec le bouquin mais je suis presque sûr que le vacuum
est automatique depuis les version 8.x

En tous cas il était présent lors d’une simple installation Gentoo “emerge
postgresql”. Je viens de l’activer…

gUI


Guillaume B. : (05 61) 19 40 65 / bureau 602N

Le 13/03/07, Guillaume B. a écrit :

A propos de PostgreSQL il existe ce bouquin récent que je viens de
commander :

Si il y a un chapitre sur l’optimisation mémoire, je t’autorise à m’en
faire un
résumé (((-:

On verra :slight_smile:
Mais bon si tu tiens vraiment à utiliser une base de données sur un
serveur
très limité en RAM utilise Sqlite … Rails fonctionne aussi avec il me
semble.

Rails ne permet pas d’avoir des processus légers et il n’y a pas grand
chose à faire de ce côté (le mieux serait de permettre de forker après
le chargement des librairies et avant l’établissement des connexions
avec la BD, mais c’est complexe et a des effets de bord). De toute
manière ce processus n’est pas intégrable dans le serveur web et
nécessiterait le dev d’un ‘super-mongrel’.

Mea cupla sur le vocabulaire, j’aurai du dire “pas trop lourd en mémoire”.
J’entendais bien un modèle de type prefork.

Et à vrai dire je n’ai même pas besoin d’avoir un fork complexe à la
super-mongrel. Déjà pouvoir adapter le nombre de fils à la charge serait
super. Après si on doit se taper une ou deux requêtes lentes le temps que
rails initialise tout ce n’est pas le plus gênant.

Je ne demande pas un serveur threadé et toutes les bibliothèques et cache
en mémoire partagé. Ca serait bien mais on n’en est pas là. Si déjà le
serveur savait s’adapter à la charge au lieu d’imposer le démarrage d’un
nombre de fils fixes, ça serait bien.

Il faut positionner Rails face aux infrastructures J2EE qui elles
nécessitent encore plus de RAM (x10 ?) pour le ticket d’entrée, pas en
face de mod_php pour héberger des sites webs vaguement interractifs sur
serveurs mutualisés…

Oulà, ça vient peut être de mon expérience, mais pour moi Rails est bien
plus proche de PHP que de Java. Les sites Web PHP ne sont pas plus
“vaguement” interactifs que les Java ou Rails.

Pour voir comment sont utilisées et conçues les applications Web autour de
moi, je peux t’assurer qu’un problème d’hébergement est un problème
critique. Qu’on soit en entreprise n’y change rien. Au contraire j’aurai
presque tendance à dire : l’amateur bidouillera pour faire fonctionner,
pas le professionnel.

Je ne pourrai tout simplement pas héberger une
appli J2EE sur mon infrastructure actuelle, ça me coûterait probablement
3 fois plus cher en hébergement.

Oui, peut être (quoi que), mais les procédures sont claires et les
déploiements automatisés. Je n’ai pas à installer un proxy, puis décider
combien de fils lancer, puis me rendre compte que mon serveur ne répond
pas à certaine parce que même si la charge moyenne est bonne j’ai eu le
malheur d’avoir N+1 requêtes à un instant T avec seulement N processus.

Ca c’est franchement bloquant.
Et d’ailleurs ça c’est cher à l’hébergement, car ça demande des
administrateurs qui manuellement vont toucher à ce genre de détails et
connaissent l’architecture.


Eric

Le 13/03/07, Guillaume B. a écrit :

J’en saurais plus avec le bouquin mais je suis presque sûr que le vacuum
est automatique depuis les version 8.x

En tous cas il était présent lors d’une simple installation Gentoo “emerge
postgresql”. Je viens de l’activer…

Depuis la 8.1 c’est un paramètre à activer dans le postgresql.conf :
autovacuum = on
Avant la 8.0 l’autovaccum n’existait pas.

Frédéric Logier wrote the following on 13.03.2007 14:19 :

automatise cela, MySQL a l'avantage de faire ça automatiquement).

J’en saurais plus avec le bouquin mais je suis presque sûr que le
vacuum est automatique depuis les version 8.x

Oui, à partir de la 8.1. Mais d’après le ‘ps aux’ il n’est pas activé
sur l’installation de Guillaume s’il utilise la 8.1. J’ai l’impression
qu’il a une Gentoo (syslog-ng, ce n’est pas si courant que ça comme
démon syslog), donc la 8.1 n’est pas encore dispo dans les versions
stables pour lui.

Lionel

Le 13/03/07, Lionel B. a écrit :

stables pour lui.

D’après le chan irc #postgresqlfr l’autovaccum n’est plus dans un
process
séparé depuis la 8.1 mais dans le moteur. Donc je doute que tu puisse le
voir dans la liste des process. De plus la 8.2 est sortie depuis peu
avec
certains avantages à la Oracle comme insert into … returning id :slight_smile:

Le 13/03/07, Eric D. a écrit :

Oulà , ça vient peut être de mon expérience, mais pour moi Rails est bien
plus proche de PHP que de Java. Les sites Web PHP ne sont pas plus
“vaguement” interactifs que les Java ou Rails.

Je ne comprend pas pourquoi tu tiens à comparer PHP et Rails. Compare
Ruby
et PHP, et là l’avantage de Ruby est plutôt faible. Idem pour Java, on
ne
développe pas un site en Java mais on utilise un framework type Struts.
Les
problèmatiques des framework n’ont rien à voir avec celles d’un simple
langage inclus dans Apache via un mod_tonlangage.
Après le tuning d’une plateforme Rails peut être effectivement plus
complexe
qu’un bon vieux framework rodé depuis des années, mais le mieux en
attendant
une amélioration ne serait-il pas de sous-traiter cela à des
spécialistes du
genre Typhon ou Telecom Italia ?

Eric D. wrote the following on 13.03.2007 14:34 :

Et à vrai dire je n’ai même pas besoin d’avoir un fork complexe à la
super-mongrel. Déjà pouvoir adapter le nombre de fils à la charge serait
super.

Le problème n’est pas Rails alors, mais le serveur web. lighttpd a un
bug dans mod_fastcgi qui bien que permettant la configuration de nombre
de processus fastcgi min et max lance toujours le max. Mais c’est un bug
de lighttpd qui devrait être corrigé, pas un bug de Rails. Je me demande
si Apache et/ou nginx ne gère(nt) pas correctement ce genre de choses.

Après si on doit se taper une ou deux requêtes lentes le temps que
rails initialise tout ce n’est pas le plus gênant.

Fais attention que si c’est pour faire du mutualisé, le serveur web
risque de passer plus de temps à lancer des processus qu’à traiter les
requêtes.
Si c’est pour un serveur dédié, je ne vois pas l’intérêt de forker à la
demande, ton serveur a une capacité, la dépasser ne sert à rien et ne
pas pré-lancer un mongrel te coûtera au moment où tu en auras besoin :
dans ce cas on lance le nombre qui correspond à la capacité du serveur
et on ajoute un serveur supplémentaire lorsque le premier est victime du
succès de l’application.

[…]
Oulà , ça vient peut être de mon expérience, mais pour moi Rails est bien
plus proche de PHP que de Java. Les sites Web PHP ne sont pas plus
“vaguement” interactifs que les Java ou Rails.

Je parle surtout PHP en tant que Personal Home Page sur serveurs
mutualisés. Après il y a effectivement la catégorie des applications pro
en PHP, mais je ne vois pas l’intérêt du pre-fork dans ce cas là pour
les même raisons que celles évoquées ci-dessus. La signature mémoire est
alors équivalente à celle de Rails.

Je ne pourrai tout simplement pas héberger une
appli J2EE sur mon infrastructure actuelle, ça me coûterait probablement
3 fois plus cher en hébergement.

Oui, peut être (quoi que),

Il n’y a pas de “quoi que”, essayer de démarrer une JVM sur un serveur
virtuel n’ayant que 128-160M de RAM libre pour faire tourner un
Jboss/Jonas/Websphere c’est tout simplement une perte de temps.

mais les procédures sont claires et les
déploiements automatisés. Je n’ai pas à installer un proxy, puis décider
combien de fils lancer, puis me rendre compte que mon serveur ne répond
pas à certaine parce que même si la charge moyenne est bonne j’ai eu le
malheur d’avoir N+1 requêtes à un instant T avec seulement N processus.

Comme indiqué plus haut, cela n’a pas de sens. D’abord lorsque tu es Ã
N+1 requêtes le serveur ne te jettera pas, il te mettra en attente.
Cette attente n’est pas grave tant que cet un état transient
relativement court. Lorsque ça va jusqu’au timeout ou que ça devient
récurrent/permanent, il y a un vrai problème de charge. A ce moment ton
serveur n’est tout simplement pas assez puissant, point barre.

Ca c’est franchement bloquant.
Et d’ailleurs ça c’est cher à l’hébergement, car ça demande des
administrateurs qui manuellement vont toucher à ce genre de détails et
connaissent l’architecture.

Pour moi une appli pro vient avec ses procédures
d’install/maintenance/backup/…, ses abaques pour la configuration de
l’infra à tels et tels niveaux de charges. Un admin sys n’a pas Ã
toucher à ce genre de choses, son boulot c’est de maintenir
l’environnement sous-jacent, de valider puis d’appliquer les procédures
qu’on lui donne.

Lionel.

Frédéric Logier wrote the following on 13.03.2007 14:48 :

démon syslog), donc la 8.1 n'est pas encore dispo dans les versions
stables pour lui.

D’après le chan irc #postgresqlfr l’autovaccum n’est plus dans un
process séparé depuis la 8.1 mais dans le moteur.

Ils se trompent. Cf doc postgreSQL.

Le Mar 13 mars 2007 13:21, Frédéric Logier a écrit :

Personnellement je pense que c’est un faux problème car Rails n’a pas
vraiment les mêmes objectifs que PHP. Rails est à mon avis clairement
orienté professionnel. Je ne vois pas le grand public hébergé chez free,
apprendre l’objet et un modèle MVC juste pour son site perso. Par contre
un professionnel a largement les moyens d’investir dans un serveur avec
suffisamment de RAM.

Je déteste ce faux distingo entre public et professionnel. Les contraintes
ne sont pas identiques mais sont plus proches qu’on ne le pense.

Les deux veulent des solutions pas chères, performantes et simples. Le
gros succès de PHP en entreprise tient aussi à ça.

Rails est au même niveau que Zope ou Java, il
nécessite un minimum de ressources matériel, et on remarquera que Zope et
Java ne sont clairement pas utilisé par le public.

Ne disons pas qu’il demande un minimum de ressources matériel dans le même
thread où on débat de difficultés à le faire tourner sur un serveur dédié
d’entrée de gamme. A coté PHP ferait tourner à moindre coût une infinité
de sites sur la même plateforme (la limitation étant la fréquentation, pas
le nombre d’applications PHP).

Certes, Java aussi a de grosses contraintes matérielles, mais Java aussi
apporte par défaut sans rien toucher bien des choses qu’on n’a pas avec
Rails au niveau des services Web, de la connexion avec le métier Java
existant, des transactions XA, des couches métier distantes …
Du coup on accepte bien plus facilement d’avoir du gros matos sur du
Java,
parce qu’on a pas/peu le choix.

Si on vise du frontal Web uniquement comme Rails, demander des gros
serveurs dans le cadre de petites applis, c’est contre productif.

Rails s’impose déjà :slight_smile:

Il ne s’agit pas de dire que Rails est mauvais, je ne serai pas là sinon.
Mais il s’agit de constater qu’il y a encore de très gros défauts. Et pour
moi un serveur qui s’adapte à la charge ça reste dans le domaine et du
besoin et du réalisable (la consommation mémoire c’est une autre affaire).


Éric Daspet
http://eric.daspet.name/