Suivez moi sur GitHub

Guirec Corbel

Mon blog

Benchmark : digital ocean vs scalingo

| Comments

Il y a peu, j’ai parlé avec Yann Klis, de Scalingo, sur le forum de Human Coders. Suite à cette discussion, j’ai souhaité effectuer un benchmark pour comparer les performances de Digital Ocean et de Scalingo. Dans cet article, je vais exposer les résultats des tests ainsi que ma méthodologie.

L’application

Voici l’application testée : https://www.associatedartcollectors.com/fr. Il s’agit d’une application Rails optimisée, avec un système de mise en cache, des assets sur un CDN, etc. Il s’agit d’une vraie application (encore en développement). J’ai préféré l’utiliser plutôt que d’en faire une uniquement pour des tests afin de mieux représenter la réalité.

Les serveurs

Le serveur Digital Ocean est situé à Francfort et coûte 10$ par mois pour 1Go de RAM. Scalingo, quant à lui, est situé en France et coûte 14.40€ pour 512Mb. Scalingo est donc légèrement plus cher pour moins de puissance.

Scalingo étant beaucoup plus facile à gérer, je pense que le temps économisé au niveau de la gestion du serveur vaut largement le léger surplus de prix. En effet, dans son utilisation, Scalingo ressemble davantage à Heroku qu’a Digital Ocean. J’ai choisi de ne pas comparer Scalingo à Heroku, car, selon de précédents tests, Digital Ocean offre une meilleure performance. J’ai voulu comparer Scalingo au meilleur.

Note

Je ne suis pas administrateur système. Il est probablement possible de faire mieux que ce que j’ai fait sur Digital Ocean. Ceci dit, je suis probablement dans la même situation qu’un bon nombre de développeurs. L’intérêt des systèmes similaires à Heroku ou Scalingo est également ne pas s’occuper du système. On créer l’application en 2 minutes, on pousse l’application et ça marche. C’est tout.

Les tests

La plus grosse part de marché de Scalingo est située en France. J’ai souhaité commencer mes tests proches de la France. Pour cela, j’ai choisi de créer un droplet Digital Ocean à Londres.

Mon objectif a été de simuler un certain nombre de requêtes et ceux de manière concurrente. J’ai donc créé un code qui lance plusieurs processus simultanément. Chaque processus effectue un certain nombre de requêtes. Le temps effectué par chaque processus permet de comparer la performance. Plus les requêtes se sont complétées rapidement, plus le serveur est efficace.

Le code

Le code n’est probablement pas le meilleur que j’ai écrit de ma vie, mais est largement suffisant pour faire ce que je souhaitais.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
require 'benchmark'
require 'net/http'
require 'openssl'

NUMBER_OF_THREADS = 10
NUMBER_OF_REQUESTS_PER_THREAD = 100
URL = 'https://stagingcollectionneurs.scalingo.io/fr/provider_registrations/new'

threads = []
NUMBER_OF_THREADS.times do
  threads << Thread.new do
    Benchmark.bm do |x|
      x.report do
        NUMBER_OF_REQUESTS_PER_THREAD.times do |i|
          uri = URI(URL)
          http = Net::HTTP.new(uri.host, uri.port)
          http.use_ssl = true
          http.verify_mode = OpenSSL::SSL::VERIFY_NONE
          http.start do
            http.request_get(uri.path) do |res|
              p res.code + " : " + i.to_s
            end
          end
        end
      end
    end
  end
end

Ce code permet d’entrer un nombre de processus simultané et le nombre de requêtes fait pour chaque processus. De plus, il permet d’indiquer la page appelée par le code. Pour les tests, j’ai choisi des pages différentes qui sont représentatives de l’application.

Le code permet également d’afficher le statut de la requête envoyé, afin de s’assurer qu’elles sont toutes valides, ainsi que le numéro de la requête effectuée, juste pour voir la progression.

J’ai eu un problème avec le protocole SSL sur Digital Ocean. Pour le test, j’ai simplement désactivé la vérification.

Test 1

Le premier test consiste uniquement à visiter une page. Pour l’affichage de cette page, 11 requêtes SQL sont exécutées.

Digital Ocean :

Threads : 10
Requests per thread : 100

Temps de réponse :
  163.755285
  163.906003
  164.070419
  164.222361
  164.379131
  164.520751
  164.717367
  164.894695
  165.059584
  165.245484

Scalingo :

Threads : 10
Requests per thread : 100

Temps de réponse :
  110.868637
  110.982509
  111.086731
  111.195775
  111.377322
  111.482194
  111.590034
  111.697870
  111.821420
  111.938271

Ce premier test montre clairement que Scalingo offre un temps de réponse plus rapide. Scalingo est quasiment deux fois plus rapide.

Test 2

Dans ce deuxième test, j’ai voulu tester le comportement avec plus de requêtes concurrentes.

Digital Ocean :

Threads : 100
Requests per thread : 10

Temps de réponse :
  150.062375
  150.365437
  150.532612
  165.780870
  165.941798
  166.111019

Scalingo :

Threads : 100
Requests per thread : 10

Temps de réponse :
   92.787676
   92.877818
   92.959175
  ...
  102.423316
  102.525122
  102.622236

Encore cette fois, Scalingo est nettement supérieur. Pendant que les tests s’effectuaient, je suis allé sur les deux sites avec mon navigateur. Même si cela ne se reflète par sur les résultats du benchmark, j’ai constaté une grande dégradation de performance pour les deux fournisseurs.

Test 3

Par la suite, j’ai souhaité tester une autre page un peu plus complexe. Sur cette page, plus de requêtes SQL sont effectuées et il y a plus de code à exécuter.

Digital Ocean :

Thread : 10
Request : 100

Temps de réponse :
  204.311959
  204.509295
  204.683958
  204.864534
  205.055946
  205.240614
  205.440767
  205.621924
  205.807302
  206.020173

Scalingo :

Thread : 10
Request : 100

Temps de réponse :
  143.032002
  143.170704
  143.322095
  143.458987
  143.596800
  143.742877
  143.877174
  144.017422
  144.161915
  144.303397

Sans surprise, le résultat est le même dans ce cas.

Test 4

Enfin, j’ai voulu tester une page encore plus complexe. Il s’agit du formulaire d’inscription d’un utilisateur. J’utilise des gems comme SimpleForm pour gérer le formulaire. Les listes des services, des pays et des régions sont disponibles ce qui correspond à autant de requête SQL et de donnée à traiter.

Digital Ocean :

Thread : 10
Request : 100

Temps de réponse :
  420.542306
  420.998163
  421.375207
  421.724786
  422.231918
  422.618054
  422.983907
  423.442330
  423.815438
  424.163915

Scalingo :

Thread : 10
Request : 100

Temps de réponse :
  669.174683
  669.800881
  670.571744
  671.256995
  671.949939
  672.582819
  673.282322
  673.983594
  674.634513
  675.310771

Cette fois, Digital Ocean est plus rapide. Je pense que c’est là que la différence de puissance du serveur se fait sentir. Étant donné qu’il y a plus de code a exécuter, le traitement nécessite plus de ressource, et donc, Digital Ocean est avantagé. Ceci dit, cette page n’est pas l’une des plus utilisées et je pense que la performance est plus importante pour les pages permettant uniquement l’affichage.

Conclusion

Je pense que Scalingo gagne le duel. En plus d’offrir une performance plus qu’honorable, la gestion du serveur est grandement simplifiée. Je conseille vivement d’essayer cet outil si vous n’avez pas besoin d’avoir un accès complet à la machine. Comme moi, les développeurs ne sont pas toujours des administrateurs systèmes. Je trouve beaucoup plus simple de laisser la gestion du serveur à quelqu’un d’autre. En plus d’être probablement mieux configuré que ce que j’ai fait, c’est également plus sécuritaire, car, si une faille de sécurité est découverte, le problème sera géré par des professionnels dans le domaine.

Pour cet article, mes tests ont été effectués depuis Londres afin de représenter la clientèle européenne. Pour ma part, je me situe au Québec. Dans une seconde étape, je vais tester depuis des serveurs en Amérique du Nord et à partir d’autres endroits dans le monde pour observer le comportement selon les lieux.

Dans un prochain article, je vais faire la comparaison entre Clever Cloud et Scalingo. Surveillez mes prochains articles pour connaitre les résultats de mon prochain benchmark.

Comments