Shiny happy people coding

Codons avec le sourire

Thin, le buzz qui se justifie

| Comments

C’est quoi Thin ?

Depuis maintenant 3 mois seulement un nouveau gem est apparu comme webserver. Sa logique est simple. Prendre tout ce qu’il y a de meilleur partout, de compiler tout çà et d’en faire un meilleur produit. Ce gem, c’est Thin. Il se dit “Yet Another WebServer”. Je pense que le titre est en référence à YARV. Mais je n’en ai aucune preuve.

Depuis la version 0.7.0 de thin, le buzz a pris de l’ampleur sur les bienfaits de ce WebServer. Étant un peu aventurier, j’ai décidé de tenter l’aventure. J’ai migré mes 3 applications de mongrel_cluster vers Thin. Voici donc comment faire cette migration car il n’y a rien de plus simple.

Installer Thin

Il faut déjà installer le gem thin

#gem install thin

Le meilleur moyen pour lancer les commandes de lancement de Thin, il faut allez dans le répertoire de son application Rails. Dans ce répertoire, faire :

$thin config -C config/thin.yml

Avec cette commande thin va préparer un fichier de configuration complet il ne vous restera plus qu’à le modifier. J’ai mis ce fichier dans config/thin.yml pour être homogène avec mongrel_cluster. Il n’y a aucune obligation de nomage ou d’emplacement. Le fichier de base est du type suivant :

---
pid: tmp/pids/thin.pid
log: log/thin.log
port: 3000
max_conns: 1024
timeout: 30
environment: development
max_persistent_conns: 512
chdir: /var/rails/typo-5-0-stable
address: 0.0.0.0

Il ressemble ainsi très fortement au fichier de mongrel_cluster.yml. Il ne reste plus qu’a le modifier pour qu’il fasse ce que l’on souhaite. En général, on modifie le port et l’environnement. Ensuite, on peux définir le nombre d’instance de thin dédiés à cette application. Pour cela on a juste à rajouter la clé servers: et donner le nombre d’instance. Mon fichier est ainsi devenu :

---
pid: tmp/pids/thin.pid
log: log/thin.log
port: 44000
max_conns: 1024
timeout: 30
environment: production
max_persistent_conns: 512
chdir: /var/rails/typo-5-0-stable
address: 0.0.0.0
servers: 2

Enfin pour démarrer ou arreter ces instances, rien de plus simple.

démarrage :

$ thin start -C config/thin.yml

arrêt :

$ thin stop -C config/thin.yml

Et maintenant l’intérêt ?

Intérêt de thin

Au niveau de la mémoire, il n’y a pas vraiment de différence entre mongrel et thin. Ils utilisent a peu près la même mémoire d’après ce que j’ai pu constater. Par contre, au niveau de la vitesse de réponse, thin est un peu plus rapide. Ainsi voici les résultats d’un benchmark rapide que j’ai réalisé sur ma dédibox.

Pour mongrel

hello:~/$ ab -n 1000 -c 10 http://dev.shingara.fr/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking dev.shingara.fr (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Finished 1000 requests


Server Software:        nginx/0.6.26
Server Hostname:        dev.shingara.fr
Server Port:            80

Document Path:          /
Document Length:        4640 bytes

Concurrency Level:      10
Time taken for tests:   81.920747 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      4995000 bytes
HTML transferred:       4640000 bytes
Requests per second:    12.21 [#/sec] (mean)
Time per request:       819.207 [ms] (mean)
Time per request:       81.921 [ms] (mean, across all concurrent requests)
Transfer rate:          59.53 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       36   38   1.5     38      76
Processing:    94  778 726.4    644    4108
Waiting:       92  774 723.3    641    4106
Total:        131  816 726.4    681    4146

Percentage of the requests served within a certain time (ms)
  50%    681
  66%   1273
  75%   1344
  80%   1382
  90%   1669
  95%   1924
  98%   2634
  99%   3011  
 100%   4146 (longest request)

Pour thin

hello:~/$ ab -n 1000 -c 10 http://dev.shingara.fr/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking dev.shingara.fr (be patient)
Completed 100 requests                                                                                                                                 
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Finished 1000 requests


Server Software:        nginx/0.6.26
Server Hostname:        dev.shingara.fr
Server Port:            80

Document Path:          /
Document Length:        4640 bytes

Concurrency Level:      10
Time taken for tests:   67.245564 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      4986008 bytes
HTML transferred:       4646330 bytes
Requests per second:    14.87 [#/sec] (mean)
Time per request:       672.456 [ms] (mean)
Time per request:       67.246 [ms] (mean, across all concurrent requests)
Transfer rate:          72.41 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       36   44 133.9     38    3035
Processing:    93  621 462.3    518    1946
Waiting:       91  548 389.6    473    1665
Total:        132  666 483.9    561    4278

Percentage of the requests served within a certain time (ms)
  50%    561
  66%    878
  75%   1017
  80%   1098
  90%   1309
  95%   1580
  98%   1703
  99%   1795
 100%   4278 (longest request)

Ca veux dire quoi ?

Il y a une petite avance pour thin qui permet de faire 14,87 requêtes par seconde contre 12,21 requêtes pour mongrel. Tout cela avec 10 instances simultanés et un total de 1000 requêtes. Mais après tout thin n’a que 3 mois. Il est encore jeune et n’a pas de version 1.0. Ça devrait pouvoir encore s’améliorer.

Coté parano ?

Je n’ai pas encore pu tester la stabilité de thin. En effet, on peux se demander à juste titre si il est vraiment stable. Pour cela il faudra attendre.