Suivez moi sur GitHub

Guirec Corbel

Mon blog

Digitalocean vs heroku - round 2

| Comments

Dans un article précédent, j’ai publier une comparaison entre un serveur DigitalOcean à 10$ pour 1go de RAM et la version gratuite de Heroku comportant 512mo de RAM. Plusieurs personnes m’ont demandé de faire le même test en augmentant le nombre de dyno de Heroku. Voici donc les résultats des tests demandés.

Un dino? Non, un dyno.

Avant d’aller plus loin, j’ai voulu comprendre le concept de dyno. Avant de connaitre Heroku, ce que je connaissais qui s’en rapprochait le plus c’était ça :

Pour Heroku, un dyno n’a rien à voir avec notre ami Denver. Un dyno est un processus qui va répondre à une requête. Plus on a de dyno, plus on va être capable de répondre à plusieurs requêtes en même temps.

Les tests

Comment dans l’article précédent, j’ai effectué les tests avec cette application. J’ai également utilisé les mêmes outils et les mêmes scénarios qu’auparavant. Encore une fois, il s’agit de la même application pour DigitalOcean et pour Heroku.

Les chiffres

Les tests en quelques chiffres : 50 visiteurs simulés utilisant 3 scénarios différents pendant 5 minutes.

DigitalOcean

Petit rappel sur les chiffres obtenus avec DigitalOcean :

Un temps de réponse plutôt correct.

Avec DigitalOcean, j’utilise un swapfile de 2go et voici ma config Unicorn :

worker_processes 3
timeout 120
preload_app true

Heroku

Et voilà le moment tant attendu. Voici les mêmes tests faits avec 2 dyno de 512mo :

Quoi?????? Je ne m’attendais vraiment pas à ça. J’ai essayé avec 1 dyno de 1go et 2 dyno de 1go et j’ai toujours sensiblement le même résultat. Le temps offert par Heroku est vraiment désastreux. Comme on peut le voir, le temps est majoritairement passé dans la queue.

Pour en savoir plus, j’ai contacté le support Heroku. Tout d’abord, pour avoir de meilleur log au niveau de la mémoire, ils m’ont conseillé d’utiliser log-runtime-metrics. J’ai fait un test en allant sur 5 pages de mon site et voici le résultat :

2014-04-12T11:27:41.246260+00:00 heroku[web.1]: State changed from starting to up

2014-04-12T11:27:44.647222+00:00 heroku[web.1]: source=web.1 dyno=heroku.16040091.5565eaf7-72e9-4184-b1d8-46a1612f8e49 sample#memory_total=229.98MB sample#memory_rss=229.96MB sample#memory_cache=0.01MB sample#memory_swap=0.00MB sample#memory_pgpgin=64372pages sample#memory_pgpgout=5498pages

2014-04-12T11:27:52.633087+00:00 app[web.1]: Started GET "/fr/pages/accueil" for 208.114.164.25 at 2014-04-12 11:27:52 +0000
2014-04-12T11:27:56.361888+00:00 app[web.1]: Started GET "/fr/pages/accueil" for 208.114.164.25 at 2014-04-12 11:27:56 +0000
2014-04-12T11:28:03.386496+00:00 app[web.1]: Started GET "/fr/pages/acheter-vendre" for 208.114.164.25 at 2014-04-12 11:28:03 +0000

2014-04-12T11:28:04.772151+00:00 heroku[web.1]: source=web.1 dyno=heroku.16040091.5565eaf7-72e9-4184-b1d8-46a1612f8e49 sample#memory_total=423.66MB sample#memory_rss=423.34MB sample#memory_cache=0.33MB sample#memory_swap=0.00MB sample#memory_pgpgin=113959pages sample#memory_pgpgout=5501pages

2014-04-12T11:28:08.154309+00:00 app[web.1]: Started GET "/fr/pages/services-aux-collectionneurs" for 208.114.164.25 at 2014-04-12 11:28:08 +0000
2014-04-12T11:28:13.728267+00:00 app[web.1]: Started GET "/fr/pages/faq" for 208.114.164.25 at 2014-04-12 11:28:13 +0000

2014-04-12T11:28:25.099729+00:00 heroku[web.1]: source=web.1 dyno=heroku.16040091.5565eaf7-72e9-4184-b1d8-46a1612f8e49 sample#load_avg_1m=0.00
2014-04-12T11:28:25.100040+00:00 heroku[web.1]: source=web.1 dyno=heroku.16040091.5565eaf7-72e9-4184-b1d8-46a1612f8e49 sample#memory_total=444.60MB sample#memory_rss=444.18MB sample#memory_cache=0.42MB sample#memory_swap=0.00MB sample#memory_pgpgin=119319pages sample#memory_pgpgout=5501pages
2014-04-12T11:28:44.717755+00:00 heroku[web.1]: source=web.1 dyno=heroku.16040091.5565eaf7-72e9-4184-b1d8-46a1612f8e49 sample#load_avg_1m=0.00
2014-04-12T11:28:44.718017+00:00 heroku[web.1]: source=web.1 dyno=heroku.16040091.5565eaf7-72e9-4184-b1d8-46a1612f8e49 sample#memory_total=445.48MB sample#memory_rss=445.06MB sample#memory_cache=0.42MB sample#memory_swap=0.00MB sample#memory_pgpgin=119550pages sample#memory_pgpgout=5507pages
2014-04-12T11:29:04.898773+00:00 heroku[web.1]: source=web.1 dyno=heroku.16040091.5565eaf7-72e9-4184-b1d8-46a1612f8e49 sample#load_avg_1m=0.00
2014-04-12T11:29:04.899057+00:00 heroku[web.1]: source=web.1 dyno=heroku.16040091.5565eaf7-72e9-4184-b1d8-46a1612f8e49 sample#memory_total=445.48MB sample#memory_rss=445.06MB sample#memory_cache=0.42MB sample#memory_swap=0.00MB sample#memory_pgpgin=119550pages sample#memory_pgpgout=5507pages

Comme on peut le voir, juste après le démarrage, 230mo étaient utilisés. J’ai visité les 5 pages et la mémoire c’est chargée à 444mo. Ensuite, j’ai eu rapidement des Memory quota exceeded. Je n’ai aucun problème similaire avec DigitalOcean.

Le support m’a ensuite indiqué que mon application était gourmande en mémoire. Ils m’ont conseillé d’utiliser la gem oink. Cette gem permet d’indiquer quels sont les actions les plus utilisées. Je n’ai pas appris plus grand-chose de plus qu’avec NewRelic.

Un problème dans mon application?

Il y a effectivement plusieurs éléments qui peuvent prendre de la mémoire. Tout d’abord, c’est une application Rails. Rails n’est certainement pas ce qu’il y a de plus léger au monde. Ensuite, j’utilise beaucoup de cache. J’imagine qu’il y a beaucoup d’éléments stockés en mémoire dans ces cas-là. Ensuite, il s’agit d’une application d’une bonne taille avec plusieurs requêtes SQL par page maire rien d’extrême.

Comme je l’ai dit plus tôt, j’ai comparé les deux serveurs avec la même application. Si j’avais vraiment un problème de mémoire dans celle-ci, j’imagine que les problèmes auraient dû être les mêmes. Or, je n’ai aucune erreur de mémoire dans Digital Ocean.

Conclusion

Je crois qu’il est assez clair que Heroku perd la bataille. Si quelqu’un à d’autres résultats ou aimerai m’indiquer comment corriger d’éventuels problèmes.

Un autre avantage que je trouve à DigitalOcean est le fait d’avoir une plus grande accessibilité au système. Au début, le fait d’avoir un environnement prêt en quelques secondes avec Heroku est génial, mais lorsque l’on veut aller plus loin, je trouve que l’on rencontre beaucoup de limites. Avec DigitalOcean, nous avons le plein contrôle de l’OS. De plus, si l’on suit un bon guide, déployer une application n’est pas bien compliqué.

Pour finir, la chanson que j’ai dans la tête depuis le début de l’écriture de l’article :

Comments