Le Raspberry Pi comme serveur, la fausse bonne idée ?

Le Raspberry Pi est-il un bon serveur web ou de fichier ? On compare.

9 minute de lecture
Par Stéphane
Le Raspberry Pi comme serveur, la fausse bonne idée ?

Je me suis laissé tenter, et j'ai installé mon blog (celui-ci donc) sur un Raspberry Pi 4 B 8Go sous Ghost. J'ai largement décris la configuration ici donc je ne vais pas revenir dessus.

Choisir un Raspberry Pi pour en faire un serveur, est-ce vraiment une bonne idée ? En effet, c'est quoi un Raspberry Pi ? Tout sauf un serveur en fait :

Le bon coté des choses c'est que correctement configuré :

  • Ça ne consomme (presque) rien
  • Ça ne prend pas de place
  • ... et c'est à peu près tout.

I Le concurrent

Face au RasPi, un mini PC, le Lenovo M900 de 2016, équipé d'un processeur Intel Core i5-6500T. Ceux qui pensent déjà ah mais c'est pas le même prix ! lisez jusqu'au bout.

Avantages de cette machine :

  • Petite pour un PC (volume 1L, mini ITX, 3cm x 18cm x 18cm)
  • Mémoire jusqu'à 32 Go (2 slots SO-DIMM DDR4-2133)
  • Un slot PCIe x4 format M.2 pour stockage NVMe
  • Un slot SATA pour un SSD
  • 6 ports USB 3.0
  • Supporte Windows et Unix
  • Possède un chip TPM 1.0 (Trusted Platform Module, pour la sécurité)
  • vPro, qui, à l'aide de l'Intel Manageability Commander, permet la gestion de la machine à distance (KVM) par le réseau.

Pour ceux qui aiment voir les entrailles des machines :

II Performances comparées

Les deux machines tournent Linux, le Raspberry Pi OS (ex Rasbian) sur le Pi et Ubuntu sur le x86. Les tests seront fait sans écran connecté : on parle ici d'utilisation en mode serveur.

Le processeur

J'ai choisi un benchmark simple et éprouvé : le test de la revue BYTE, natif et amélioré en 1997. Les sources se trouvent ici, et ça compile facilement (il suffit de taper make). Voici ce que ça donne :

BYTEmark* Native Mode Benchmark ver. 2 (10/95)
Index-split by Andrew D. Balsa (11/97)
Linux/Unix* port by Uwe F. Mayer (12/96,11/97)

TEST                : Iterations/sec.  : Old Index   : New Index
                    :                  : Pentium 90* : AMD K6/233*
--------------------:------------------:-------------:------------
NUMERIC SORT        :          1093.5  :      28.04  :       9.21
STRING SORT         :          140.27  :      62.68  :       9.70
BITFIELD            :      2.1144e+08  :      36.27  :       7.58
FP EMULATION        :          256.77  :     123.21  :      28.43
FOURIER             :           24592  :      27.97  :      15.71
ASSIGNMENT          :           19.45  :      74.01  :      19.20
IDEA                :          3928.7  :      60.09  :      17.84
HUFFMAN             :          1873.4  :      51.95  :      16.59
NEURAL NET          :          32.145  :      51.64  :      21.72
LU DECOMPOSITION    :          957.27  :      49.59  :      35.81
==========================ORIGINAL BYTEMARK RESULTS==========================
INTEGER INDEX       : 56.397
FLOATING-POINT INDEX: 41.527
Baseline (MSDOS*)   : Pentium* 90, 256 KB L2-cache, Watcom* compiler 10.0
==============================LINUX DATA BELOW===============================
CPU                 : 4 CPU ARMv7 Processor rev 3 (v7l)
L2 Cache            :
OS                  : Linux 5.10.17-v7l+
C compiler          : gcc version 8.3.0 (Raspbian 8.3.0-6+rpi1)
libc                : libc-2.28.so
MEMORY INDEX        : 11.216
INTEGER INDEX       : 16.685
FLOATING-POINT INDEX: 23.032
Baseline (LINUX)    : AMD K6/233*, 512 KB L2-cache, gcc 2.7.2.3, libc-5.4.38
* Trademarks are property of their respective holder.

En résumé, le processeur du Raspberry Pi 4B est entre 11 et 23 fois plus rapide que le AMD K6/233 de 1997.

BYTEmark* Native Mode Benchmark ver. 2 (10/95)
Index-split by Andrew D. Balsa (11/97)
Linux/Unix* port by Uwe F. Mayer (12/96,11/97)

TEST                : Iterations/sec.  : Old Index   : New Index
                    :                  : Pentium 90* : AMD K6/233*
--------------------:------------------:-------------:------------
NUMERIC SORT        :          1366.9  :      35.05  :      11.51
STRING SORT         :          1567.4  :     700.34  :     108.40
BITFIELD            :      7.2841e+08  :     124.95  :      26.10
FP EMULATION        :          649.42  :     311.62  :      71.91
FOURIER             :      1.4687e+05  :     167.04  :      93.82
ASSIGNMENT          :          52.735  :     200.67  :      52.05
IDEA                :           12288  :     187.94  :      55.80
HUFFMAN             :          5666.2  :     157.12  :      50.17
NEURAL NET          :          153.52  :     246.61  :     103.73
LU DECOMPOSITION    :          2942.8  :     152.45  :     110.09
==========================ORIGINAL BYTEMARK RESULTS==========================
INTEGER INDEX       : 178.011
FLOATING-POINT INDEX: 184.488
Baseline (MSDOS*)   : Pentium* 90, 256 KB L2-cache, Watcom* compiler 10.0
==============================LINUX DATA BELOW===============================
CPU                 : 4 CPU Intel(R) Core(TM) i5-6500T CPU @ 2.50GHz 2877MHz
L2 Cache            : 6144 KB
OS                  : Linux 5.8.0-43-generic
C compiler          : gcc version 10.2.0 (Ubuntu 10.2.0-13ubuntu1)
libc                : libc-2.32.so
MEMORY INDEX        : 52.806
INTEGER INDEX       : 39.018
FLOATING-POINT INDEX: 102.325
Baseline (LINUX)    : AMD K6/233*, 512 KB L2-cache, gcc 2.7.2.3, libc-5.4.38
* Trademarks are property of their respective holder.

Le Core i5-6500T est entre 39 et 102 fois plus rapide que l'AMD K6 233.

Agrégeons les deux tables

| TEST                 | RasPi (ARM v7)  | PC (x86_64) | Coeff. |
|----------------------|-----------------|-------------|--------|
| NUMERIC SORT         | 1093.5          | 1366.9      |   1.25 |
| STRING SORT          | 140.27          | 1567.4      |  11.17 |
| BITFIELD             | 2.1144e+08      | 7.2841e+08  |   3.44 |
| FP EMULATION         | 256.77          | 649.42      |   2.53 |
| FOURIER              | 24592           | 1.4687e+05  |   5.97 |
| ASSIGNMENT           | 19.45           | 52.735      |   2.71 |
| IDEA                 | 3928.7          | 12288       |   3.13 |
| HUFFMAN              | 1873.4          | 5666.2      |   3.02 |
| NEURAL NET           | 32.145          | 153.52      |   4.78 |
| LU DECOMPOSITION     | 957.27          | 2942.8      |   3.07 |
|                      |                 |             |        |
| INTEGER INDEX        | 56.397          | 178.011     |   3.16 |
| FLOATING-POINT INDEX | 41.527          | 184.488     |   4.44 |
| MEMORY INDEX         | 11.216          | 52.806      |   4.71 |
| INTEGER INDEX        | 16.685          | 39.018      |   2.34 |
| FLOATING-POINT INDEX | 23.032          | 102.325     |   4.44 |

Sans surprise le PC est beaucoup plus rapide (regardez les 5 dernières lignes avec les index). Toutefois on remarque que l'unité de calcul du Pi est très bonne, cadencée à 1,5Ghz elle n'est pas si loin du X86 à 2,5 Ghz. C'est sans doute normal pour un processeur conçu 5 an plus tard que l'Intel.

Le compilateur GCC sont les versions par défaut sur chacune des plateformes. Je doute que cela fasse une différence.

Les entrées/sorties disque

Les deux machines ont un SSD de 120 Go. Celui sur mes Raspberry Pi sont récents, celui dans le M900 date de 2016.

$ sudo hdparm -tT /dev/sda1

/dev/sda1:
 Timing cached reads:   1548 MB in  2.00 seconds = 774.33 MB/sec
 Timing buffered disk reads: 256 MB in  0.95 seconds = 270.46 MB/sec
hdparm sur le Raspberry Pi
$ sudo hdparm -tT /dev/sda1

/dev/sda1:
 Timing cached reads:   23354 MB in  1.99 seconds = 11751.59 MB/sec
 Timing buffered disk reads: 512 MB in  0.96 seconds = 533.77 MB/sec
hdparm sur le x86

Ce test est sans appel. Une barrette NVMe, en replacement du SSD sur le x86 donnerait sans aucune doute une valeur supérieure.

Les entrées/sorties réseau

J'envoie des données à partir de mon PC qui a une interface à 2.5Gb/s, tandis que le Pi et le x86 sont à 1 Gbps.

$ dd if=/dev/zero bs=1M count=1000 | ssh pi@pi 'dd of=/dev/null bs=1M'
pi@pi's password:
1000+0 enregistrements lus
1000+0 enregistrements écrits
1048576000 bytes (1,0 GB, 1000 MiB) copied, 27,4966 s, 38,1 MB/s
0+31707 records in
0+31707 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 22.1504 s, 47.3 MB/s
Envois de données vers le RasPi.
$ dd if=/dev/zero bs=1M count=1000 | ssh xx@lenovo 'dd of=/dev/null bs=1M'
xx@lenovo's password:
1000+0 enregistrements lus
1000+0 enregistrements écrits
1048576000 bytes (1,0 GB, 1000 MiB) copied, 14,9765 s, 70,0 MB/s
0+31965 records in
0+31965 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 12.521 s, 83.7 MB/s
Envois des données vers le x86.

47MB/s, soit 376 Mbit/s pour le RasPi vs, 664 Mbit/s pour le X86...

La consommation

Voyons si les alimentations peuvent nous donner des indications :

| Modèle       | RasPi | PC   | Coeff. |
|--------------|-------|------|--------|
| alimentation | 35W   | 90W  | 2.57   |
| Tension      | 5.1V  | 20V  |        |
| Ampérage     | 3A    | 4.5A |        |

L'alimentation du M900 est capable de fournir 2,57 fois plus de courant que celle du RasPi. Il semblerait qu'elle soit surdimensionnée parce qu'il est possible d'utiliser un processeur sans le suffixe T donc avec une consommation plus importante (50W ou 65W par example).

J'ai mesuré la consommation réelle du M900 sous plusieurs charge :

| État / Conso | Watt | LoadAv |
|--------------|------|--------|
| Off          | ~1,2 |        |
| Boot         | ~18  |        |
| Idle         | < 9  | 0.00   |
| 1 processus  | < 25 | 1      |
| 2 processus  | < 36 | 2      |
| 3 processus  | < 42 | 3      |
| 4 processus  | < 48 | 3      |
| 5 processus  | < 48 | > 4    |

La charge en question étant généré par une simple boucle while true; do true; done car elle peut facilement être lancée en arrière-plan et stoppée/relancée  (^Z ,  fg % , bg % ). La charge est 100% utilisateur (pas de temps passé dans le noyau).

Je n'ai pas donné les chiffres de la commande stress -c car elle génère de la charge en faisant appel à la fonction sqrt (racine carrée) et donc sollicite la FPU, les chiffres (Watts) sont toujours inférieurs à ceux que j'ai relevé avec ma boucle shell.

La commande top -d 1 avec 4 processus en cours.

J'en conclu que cette machine, dans sa configuration actuelle, ne consommera jamais plus de 50W. A plein régime, le capot est à peine chaud, et on entend pas le ventilateur.

Je doute qu'avec seulement mon serveur web elle arrive à consommer autant.

Le Raspberry Pi consomme au maximum 6.4W (sans adaptateur SATA ni SSD). Avec, on peut sans doute rajouter 5W, pour atteindre donc un maximum de 12W.

Le mini PC est donc 4 fois plus gourmand que le Raspberry Pi.

La consommation en soit n'est pas un facteur très important au niveau financier, mais peu avoir des repercussions sur la durée d'autonomie de l'onduleur.

Le volume occupé

175 cm3 pour un RasPi : associé à un SSD, le volume total a la superficie d'un SSD multiplié par la hauteur d'un RasPi (donc environ 7 x 10 x 2,5cm). Le PC a comme volume 1L, il est donc 5,71 fois plus volumineux.

Prix

Le Raspberry Pi 4B n'est pas aussi bon marché qu'on le pense, car il faut accumuler les coûts :

  • Raspberry Pi 4B 8Go : 80 €
  • Alimentation : 8 €
  • Boitier : 5 €
  • Adaptateur SATA : 15 €

Nous sommes donc au delà de 100 € sans compter qu'il faut dépenser un peu plus pour un boitier ventilé (extrêmement recommandé pour un 4B !) voire un boitier pour le SSD. Pour ceux qui voudraient s'équiper rapidement, des kits complets sont vendus sur Amazon.

Pour le Lenovo M900, j'ai payé 150 €, complet. C'est une machine d'occasion, mais comme neuve, avec encore les stickers dessus, et propre à l'intérieur (pas de poussières sur le ventilateur).

Conclusion

Ceux qui font la promotion du Raspberry Pi comme serveur NAS ont (à mon avis) tord. La machine n'est pas assez puissante, et ne possède pas assez de ports USB pour contrôler plus de 2 disques.Les performances globales de la machine ne lui permette pas de tenir la charge : ce sera ou les entrées/sorties disques ou le réseau !

Le Lenovo M900 à de gros avantages : non seulement il est possible de mettre 6 disques USB dessus, mais en plus le système peut tenir sur un SSD interne et le slot NVMe (très rapide) peut accueillir un gros cache disque en amont du RAID sur les USB. Linux saura mettre à profit la large capacité de mémoire RAM possible.

Pour d'autres types de serveurs, par exemple DNS filtrant (Pi-hole, AdGuard Home, etc.), le Raspberry Pi peut faire l'affaire : la charge ne sera jamais élevée, tout tient en mémoire grâce aux configurations 4 et 8 Go.

Au sujet du Lenovo M900

Le Lenovo M900 est une machine de 2016. Le processeur Core i5-6500T n'est pas particulièrement efficace. Il peut être changé par un modèle i5-6600T mais surtout par un i7-6700T. Ce dernier possède 4 cœurs mais 8 threads (contre 4c/4t pour les i5). En terme de Passmark, la différence est importante (50% de puissance en plus), toujours dans une enveloppe de 35W.

6500 - 6600 +17%; 6600 - 6700 +29.5%; - 6500 - 6700 +51.6%

Le problème étant bien sur de trouver un Core i7-6700T à un prix abordable, ce qui est aujourd'hui compliqué, étant donné qu'il se vend 190USD aux États-Unis (ebay).

Ci-dessous les descriptifs des M900 et du M710.

Pour ceux qui veulent aller plus loin : le M710 supporte le Core i7-7700T (+10% par rapport au 6700T avec un score de 7894). Mais il n'est pas vPro, donc pas de console à distance !

Enfin, sachez que j'ai eu la chance de trouver un Lenovo, mais que des modèles similaires existent chez HP (gamme EliteDesk par exemple), ou des modèles avec des AMD Ryzen si vous préférez ce constructeur.

Mise à jour mai 2021

Deux de mes serveurs sont passés du Intel Core i5-6500T au i7-6700T. Plus puissant. et hyperthreadé. Voyez ce que ça donne ici.