diff --git a/doc/charts/chart_protocols.png b/doc/charts/chart_protocols.png new file mode 100644 index 0000000000000000000000000000000000000000..d108de15820ea1103558812f7142244a981e754c --- /dev/null +++ b/doc/charts/chart_protocols.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6562672f98e6fa7ce49b2c3bddc6109e26de7ce653b87143d5b92363cd402446 +size 6780 diff --git a/doc/charts/chart_protocols.svg b/doc/charts/chart_protocols.svg new file mode 100644 index 0000000000000000000000000000000000000000..602f1856d090de25ed0bf86e2c3a1bedb78aba55 --- /dev/null +++ b/doc/charts/chart_protocols.svg @@ -0,0 +1,219 @@ +<?xml version="1.0" encoding="utf-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" + "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Created with matplotlib (https://matplotlib.org/) --> +<svg height="345.6pt" version="1.1" viewBox="0 0 460.8 345.6" width="460.8pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <defs> + <style type="text/css"> +*{stroke-linecap:butt;stroke-linejoin:round;} + </style> + </defs> + <g id="figure_1"> + <g id="patch_1"> + <path d="M 0 345.6 +L 460.8 345.6 +L 460.8 0 +L 0 0 +z +" style="fill:#ffffff;"/> + </g> + <g id="axes_1"> + <g id="patch_2"> + <path d="M 57.6 307.584 +L 414.72 307.584 +L 414.72 41.472 +L 57.6 41.472 +z +" style="fill:#ffffff;"/> + </g> + <g id="matplotlib.axis_1"/> + <g id="matplotlib.axis_2"> + <g id="ytick_1"> + <g id="line2d_1"> + <defs> + <path d="M 0 0 +L -3.5 0 +" id="mbf7378a3ce" style="stroke:#000000;stroke-width:0.8;"/> + </defs> + <g> + <use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mbf7378a3ce" y="271.296"/> + </g> + </g> + <g id="text_1"> + <!-- −0.04 --> + <defs> + <path d="M 10.59375 35.5 +L 73.1875 35.5 +L 73.1875 27.203125 +L 10.59375 27.203125 +z +" id="DejaVuSans-8722"/> + <path d="M 31.78125 66.40625 +Q 24.171875 66.40625 20.328125 58.90625 +Q 16.5 51.421875 16.5 36.375 +Q 16.5 21.390625 20.328125 13.890625 +Q 24.171875 6.390625 31.78125 6.390625 +Q 39.453125 6.390625 43.28125 13.890625 +Q 47.125 21.390625 47.125 36.375 +Q 47.125 51.421875 43.28125 58.90625 +Q 39.453125 66.40625 31.78125 66.40625 +z +M 31.78125 74.21875 +Q 44.046875 74.21875 50.515625 64.515625 +Q 56.984375 54.828125 56.984375 36.375 +Q 56.984375 17.96875 50.515625 8.265625 +Q 44.046875 -1.421875 31.78125 -1.421875 +Q 19.53125 -1.421875 13.0625 8.265625 +Q 6.59375 17.96875 6.59375 36.375 +Q 6.59375 54.828125 13.0625 64.515625 +Q 19.53125 74.21875 31.78125 74.21875 +z +" id="DejaVuSans-48"/> + <path d="M 10.6875 12.40625 +L 21 12.40625 +L 21 0 +L 10.6875 0 +z +" id="DejaVuSans-46"/> + <path d="M 37.796875 64.3125 +L 12.890625 25.390625 +L 37.796875 25.390625 +z +M 35.203125 72.90625 +L 47.609375 72.90625 +L 47.609375 25.390625 +L 58.015625 25.390625 +L 58.015625 17.1875 +L 47.609375 17.1875 +L 47.609375 0 +L 37.796875 0 +L 37.796875 17.1875 +L 4.890625 17.1875 +L 4.890625 26.703125 +z +" id="DejaVuSans-52"/> + </defs> + <g transform="translate(19.954687 275.095219)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-8722"/> + <use x="83.789062" xlink:href="#DejaVuSans-48"/> + <use x="147.412109" xlink:href="#DejaVuSans-46"/> + <use x="179.199219" xlink:href="#DejaVuSans-48"/> + <use x="242.822266" xlink:href="#DejaVuSans-52"/> + </g> + </g> + </g> + <g id="ytick_2"> + <g id="line2d_2"> + <g> + <use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mbf7378a3ce" y="222.912"/> + </g> + </g> + <g id="text_2"> + <!-- −0.02 --> + <defs> + <path d="M 19.1875 8.296875 +L 53.609375 8.296875 +L 53.609375 0 +L 7.328125 0 +L 7.328125 8.296875 +Q 12.9375 14.109375 22.625 23.890625 +Q 32.328125 33.6875 34.8125 36.53125 +Q 39.546875 41.84375 41.421875 45.53125 +Q 43.3125 49.21875 43.3125 52.78125 +Q 43.3125 58.59375 39.234375 62.25 +Q 35.15625 65.921875 28.609375 65.921875 +Q 23.96875 65.921875 18.8125 64.3125 +Q 13.671875 62.703125 7.8125 59.421875 +L 7.8125 69.390625 +Q 13.765625 71.78125 18.9375 73 +Q 24.125 74.21875 28.421875 74.21875 +Q 39.75 74.21875 46.484375 68.546875 +Q 53.21875 62.890625 53.21875 53.421875 +Q 53.21875 48.921875 51.53125 44.890625 +Q 49.859375 40.875 45.40625 35.40625 +Q 44.1875 33.984375 37.640625 27.21875 +Q 31.109375 20.453125 19.1875 8.296875 +z +" id="DejaVuSans-50"/> + </defs> + <g transform="translate(19.954687 226.711219)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-8722"/> + <use x="83.789062" xlink:href="#DejaVuSans-48"/> + <use x="147.412109" xlink:href="#DejaVuSans-46"/> + <use x="179.199219" xlink:href="#DejaVuSans-48"/> + <use x="242.822266" xlink:href="#DejaVuSans-50"/> + </g> + </g> + </g> + <g id="ytick_3"> + <g id="line2d_3"> + <g> + <use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mbf7378a3ce" y="174.528"/> + </g> + </g> + <g id="text_3"> + <!-- 0.00 --> + <g transform="translate(28.334375 178.327219)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-48"/> + <use x="63.623047" xlink:href="#DejaVuSans-46"/> + <use x="95.410156" xlink:href="#DejaVuSans-48"/> + <use x="159.033203" xlink:href="#DejaVuSans-48"/> + </g> + </g> + </g> + <g id="ytick_4"> + <g id="line2d_4"> + <g> + <use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mbf7378a3ce" y="126.144"/> + </g> + </g> + <g id="text_4"> + <!-- 0.02 --> + <g transform="translate(28.334375 129.943219)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-48"/> + <use x="63.623047" xlink:href="#DejaVuSans-46"/> + <use x="95.410156" xlink:href="#DejaVuSans-48"/> + <use x="159.033203" xlink:href="#DejaVuSans-50"/> + </g> + </g> + </g> + <g id="ytick_5"> + <g id="line2d_5"> + <g> + <use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mbf7378a3ce" y="77.76"/> + </g> + </g> + <g id="text_5"> + <!-- 0.04 --> + <g transform="translate(28.334375 81.559219)scale(0.1 -0.1)"> + <use xlink:href="#DejaVuSans-48"/> + <use x="63.623047" xlink:href="#DejaVuSans-46"/> + <use x="95.410156" xlink:href="#DejaVuSans-48"/> + <use x="159.033203" xlink:href="#DejaVuSans-52"/> + </g> + </g> + </g> + </g> + <g id="patch_3"> + <path d="M 57.6 307.584 +L 57.6 41.472 +" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> + </g> + <g id="patch_4"> + <path d="M 414.72 307.584 +L 414.72 41.472 +" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> + </g> + <g id="patch_5"> + <path d="M 57.6 307.584 +L 414.72 307.584 +" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> + </g> + <g id="patch_6"> + <path d="M 57.6 41.472 +L 414.72 41.472 +" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> + </g> + </g> + </g> +</svg> diff --git a/doc/csv2barchart.py b/doc/csv2barchart.py new file mode 100755 index 0000000000000000000000000000000000000000..43a2db3f8c4347243df51bf2ba12a0a2e2d855f0 --- /dev/null +++ b/doc/csv2barchart.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 +import csv +from sys import stdin, argv +from typing import TextIO + +import matplotlib.pyplot as plt + + +def csv_to_barchart(file: TextIO) -> plt.Figure: + next(file) # skip header + csv_reader = csv.reader(file, delimiter=';', quoting=csv.QUOTE_NONNUMERIC) + xs=[] + xticks=[] + ys=[] + for (x, (xtick, y)) in enumerate(csv_reader): + xs.append(x) + xticks.append(xtick) + ys.append(y) + + fig = plt.figure() + plt.bar(xs, ys) + plt.xticks(xs, xticks) + + return fig + +if __name__ == '__main__': + filenames = argv[1:] + fig = csv_to_barchart(stdin) + + for filename in filenames: + fig.savefig(filename) \ No newline at end of file diff --git a/doc/gitlab-markdown.gpp b/doc/gitlab-markdown.gpp index 1af2eef4f4c6d0f477e91c8746673c4b5a6102d8..dbe433393e27417e0f58f9682b5b4756abde84ac 100644 --- a/doc/gitlab-markdown.gpp +++ b/doc/gitlab-markdown.gpp @@ -34,3 +34,11 @@ !!define{!!acronymdescription{short}}{!!exec{cat acronyms.md | sed -n 's/^- \*\*!!short\*\*\: //p' | pandoc --from=markdown --to=plain | tr '\n' ' '}} !!define{!!acronym{short}}{!!defeval{tmp_acronymdescription}{!!acronymdescription{!!short}}!!ifeq{!!tmp_acronymdescription}{}!!warning{No definition found for acronym '!!short'}!!endif<abbr title="!!tmp_acronymdescription">!!short</abbr>} + +!!define{!!inlinemath{content}}{$`!!content`$} + +!!define{!!displaymath{content}}{ +```math +!!content +``` +} \ No newline at end of file diff --git a/doc/markdown.gpp b/doc/markdown.gpp index cc72c61dfd3958ac90fbb82c52f73f16d69ff2e7..1807d5f94ef02b9418f3a1ed5a15d24348acb11a 100644 --- a/doc/markdown.gpp +++ b/doc/markdown.gpp @@ -23,4 +23,8 @@ EOF-DEFACRONYM-GPP-MACRO !!define{!!comment}{} +!!define{!!barchart{ref_id}{description}{chartdata}}{!!exec{>/dev/null ./csv2barchart.py "charts/!!ref_id.png" "charts/!!ref_id.svg" << 'EOF_BARCHART_MACRO' +!!chart_data +EOF_BARCHART_MACRO}!!svgref{!!ref_id}{!!description}{charts/!!ref_id}} + !!endif \ No newline at end of file diff --git a/doc/pandoc-pdf-markdown.gpp b/doc/pandoc-pdf-markdown.gpp index 9304201f0c365cdac442381ffad153e45120b02a..b1786b1d38b2efbea419a47182ec850a12b54804 100644 --- a/doc/pandoc-pdf-markdown.gpp +++ b/doc/pandoc-pdf-markdown.gpp @@ -25,3 +25,7 @@ } !!define{!!acronym{short}}{[!!short](#acronym__!!short)} + +!!define{!!inlinemath{content}}{$!!content$} + +!!define{!!displaymath{content}}{$$ !!content $$} \ No newline at end of file diff --git a/doc/rapport.gpp.md b/doc/rapport.gpp.md index 3bcc609e66d544387b9a7ef1025056f613afbed7..4ff8c524f6211d30f566396e66ee1ebaf0a099bb 100644 --- a/doc/rapport.gpp.md +++ b/doc/rapport.gpp.md @@ -70,13 +70,22 @@ abstract: | !!defacronym{PC}{_Personal Computer_: ordinateur personnel} !!defacronym{PXE}{_Pre-boot eXecution Environment_: environnement d'exécution pré-démarrage} !!defacronym{MBR}{_Master Boot Record_: enregistrement d'amorcage maître} -!!defacronym{GRUB}{_GRand Unified Bootloader} -!!defacronym{BIOS}{_Basic Input Output System_} +!!defacronym{GRUB}{_GRand Unified Bootloader_} +!!defacronym{BIOS}{_Basic Input Output System_: système de base d'entrée sortie} !!defacronym{UEFI}{_Unified Extensible Firmware Interface_: interface micrologicielle extensible unifiée} !!defacronym{DHCP}{_Dynamic Host Configuration Protocol_: protocole de configuration dynamique des hôtes } !!defacronym{TFTP}{_Trivial File Transfer Protocol_: protocole simplifié de transfert de fichiers} !!defacronym{NFS}{_Network File System_: système de fichiers en réseau} !!defacronym{NAT}{_Network Address Translation_: traduction d'adresse réseau} +!!defacronym{SCP}{_Secure CoPy_: protocole de copie sécurisée sur le réseau} +!!defacronym{SSH}{_Secure SHell_: protocole de terminal à distance securisé} +!!defacronym{HTTP}{_HyperText Transfer Protocol_: protocole de transfert hypertexte} +!!defacronym{WWW}{_World Wide Web_: toile mondiale / réseau mondial } +!!defacronym{HTTPS}{_HyperText Transfer Protocol Secure_: protocole de transfert hypertexte sécurisé} +!!defacronym{FTP}{_File Transfer Protocol_: protocole de transfert de fichier} +!!defacronym{IPFS}{_InterPlanetary File System_: système de fichier inter-planétaire} +!!defacronym{SMB}{_Server Message Block_} + !!tableofcontents !!newpage @@ -486,8 +495,9 @@ il comporte de nombreuses limitations auxquelles il faudrait palier: commande, ce n'est pas très facile à utiliser. - Les scripts de déploiement sont fragiles et gèrent mal les erreurs. - Il n'y a pas de système de personnalisation d'image. Si on veut faire - $n$ personnalisation partant sur la base du même !!acronym{OS}, il - faut faire $n$ images: une pour chaque personnalisation. + !!inlinemath{n} personnalisation partant sur la base du même + !!acronym{OS}, il faut faire !!inlinemath{n} images: une pour chaque + personnalisation. - L'installation de nouveaux outils sur le système d'exploitation de l'!!acronym{OS} de déploiement créé avec _Buildroot_ peut être compliqué si l'outil a beaucoup de dépendances. @@ -511,11 +521,495 @@ il comporte de nombreuses limitations auxquelles il faudrait palier: ## Amélioration de la vitesse de transfert des images -**TODO: expliquer, détailler et comparer (tableaux, diagrammes) les -différentes mesures qui ont conduit à garder NFS pour le transfert des -images. Aussi expliquer les limites probables de NFS avec beaucoup de -postes simultanés et donner des pistes d'amélioration (multicast, -bittorrent+http, optimisations NFS).** +Le protocole !!acronym{NFS} est utilisé dans le système initial pour +transférer une image depuis le client vers le serveur. Peut-être que la +vitesse de transfert des images à travers le réseau pourrait être +améliorée en utilisant un autre protocole. Pour décider si le choix de +ce protocole est adapté ou si au contraire il serait bénéfique d'en +utiliser un autre, la vitesse de transfert d'une grosse image a été +mesurée sur différents protocoles de transfert de fichier. + +### Protocoles considérés +Les différents protocoles qui ont été mesurés sont: + +- !!acronym{SCP}: ce protocole, utilisable avec le programme éponyme + `scp`, permet le transfert de fichiers sécurisé entre un client et un + serveur utilisant le protocole d'accès à distance sécurisé + !!acronym{SSH}. Bien que le chiffrage de la communication n'est pas + nécessaire dans notre cas, il est intéressant d'observer si ce dernier + a un impact sur le temps de transfert. +- !!acronym{HTTP}: c'est le protocole client-serveur utilisé sur le + World Wide Web (!!acronym{WWW}) pour la communication entre en les + navigateurs (client) et les serveurs. Il est souvent utilisé pour le + téléchargement de fichiers sur internet et offre probablement des + performances acceptables. Il existe aussi une version chiffrée de ce + protocole, !!acronym{HTTPS}, mais uniquement la version non-chiffrée + sera testée ici, car le chiffrement de la communication ne semble pas + nécessaire et pourrait impacter les performances. +- !!acronym{FTP}: ce protocole standard fait exactement ce que nous + avons besoin: transférer des fichiers à travers le réseau. Il y a de + forte chances qu'il offre de très bonnes performances. +- !!acronym{NFS}: le protocole standard pour monter à distance des + dossiers partagés entre des !!acronym{OS} Linux. C'est ce système qui + est utilisé par le projet initial, mais ce n'est probablement pas le + plus rapide, car permet de faire plus qu'un simple transfert de + fichiers. +- !!acronym{SMB}: le protocole standard pour monter à distance des + dossier partagés entre des !!acronym{OS} Windows. Une implémentation + existe sous linux, _Samba_, et elle est courremment utilisée pour une + meilleure compatiblité avec les systèmes Windows que sont équivalent + !!acronym{NFS}. +- !!acronym{IPFS}: ce protocole pair à pair décentralisé permet à chacun + de des pairs de mettre à disposition ou de télécharger des fichiers. + Il pourrait être intéressant d'utiliser ce protocole pour soulager la + charge du serveur, car tous les clients connectés peuvent se partager + des parties d'images qu'ils ont déjà. Le serveur de déploiement ne + serait qu'un pair de plus, qui dispose de toutes les images. Il est + cependant possible que ce protocole ne soit pas le plus performant à + cause de sa jeunesse et de son mode de fonctionnement complexe qui + apporte un surcout à l'échange, en tout cas dans le cas ou il n'y a + que deux pairs. + +### Environnement des tests de performance des protocoles de transfert de fichiers + +Deux machines de test identiques ont été utilisées: il s'agit de mini-PC +DELL Optiplex 7060 micro avec les spécifications suivantes: + +- Processeur: Intel® Core™ i7-8700 CPU cadencé à 3.20GHz, +- Mémoire vive: 8 GiB (2 barettes 4GiB SODIMM DDR4 Synchronous 2666 MHz + (0.4 ns)) +- Disque: TOSHIBA KSG60ZMV SSD 476GiB (512GB) +- Réseau: Intel e1000e Gigabit Ethernet + +Les deux machines de test sont connectées en réseau avec un switch +Gigabit Ethernet. Le système d'exploitation Debian 10.4.0 (nom de code +_buster_) AMD64 a été installé sur deux machines de test, +sans interface graphique. La première machine est nommée `debian1` et la seconde +`debian2`. Les noms `debian1.home` et `debian2.home` permettent aux deux +machines de communiquer entre elles en faisant abstraction de leur +adresse !!acronym{IP}. L'utilisateur `debian` avec le mot de passe +`debian` est utilisé sur chacune des deux machines. + +Le fichier à copier, `win10.tar.gz` est une image brute de windows 10 +compressée avec `gzip`, qui fait une taille totale de +13743592907 B (12.8 GiB). Il est présent dans le dossier `/home/debian` +de la machine `debian1`. + +La commande `perf` est utilisée pour tester 4 exécutions d'une commande +de copie lancée depuis la machine `debian2`. Elle est installée à l'aide +de la commande suivante: + +```bash +apt install linux-perf +``` + +Pour faire fonctionner la commande sans être root, le kernel doit être +configuré avec la commande suivante: + +```bash +echo 1 > /proc/sys/kernel/perf_event_paranoid +``` + +Les sections suivantes détaillent les configurations spécifiques à +chaque protocole effectuées sur chacune des machines et les résultats du +test. La dernière section récapitule les résultats et explique quel +protocole est choisi pour la suite du travail et pourquoi. + +### Tests de performance du protocole de transfert de fichiers !!acronym{SCP} + +Tout d'abord, des clés SSH ont été générées sur chaque machine avec la +commande suivante: + +```bash +ssh-keygen +``` + +Ensuite, les clés ont été échangées. Sur `debian1`, la commande suivante +a été utilisée: + +```bash +ssh-copy-id debian2.home +``` + +Sur `debian2`, la commande suivante a été utilisée: + +```bash +ssh-copy-id debian1.home +``` + +Finalement, le benchmark de la copie a été lancé sur `debian2`: + +```console +$ perf stat -r 4 -d scp debian1.home:/home/debian/win10.tar.gz /home/debian/win10.tar.gz +win10.tar.gz 100% 13GB 109.6MB/s 01:59 +win10.tar.gz 100% 13GB 109.6MB/s 01:59 +win10.tar.gz 100% 13GB 109.7MB/s 01:59 +win10.tar.gz 100% 13GB 109.6MB/s 01:59 + + Performance counter stats for 'scp debian1.home:/home/debian/win10.tar.gz /home/debian/win10.tar.gz' (4 runs): + + 60,349.20 msec task-clock # 0.504 CPUs utilized ( +- 3.61% ) + 808,243 context-switches # 0.013 M/sec ( +- 0.26% ) + 16 cpu-migrations # 0.000 K/sec ( +- 14.73% ) + 16,862 page-faults # 0.279 K/sec ( +- 18.95% ) + 191,612,352,176 cycles # 3.175 GHz ( +- 0.33% ) (50.09%) + 406,400,076,305 instructions # 2.12 insn per cycle ( +- 0.25% ) (62.64%) + 13,334,327,547 branches # 220.953 M/sec ( +- 1.42% ) (62.43%) + 246,499,018 branch-misses # 1.85% of all branches ( +- 3.10% ) (62.36%) + 64,653,696,732 L1-dcache-loads # 1071.326 M/sec ( +- 0.44% ) (62.40%) + 4,559,992,550 L1-dcache-load-misses # 7.05% of all L1-dcache hits ( +- 0.41% ) (62.43%) + 784,218,339 LLC-loads # 12.995 M/sec ( +- 0.64% ) (50.01%) + 121,317,304 LLC-load-misses # 15.47% of all LL-cache hits ( +- 0.52% ) (50.29%) + + 119.8094 +- 0.0182 seconds time elapsed ( +- 0.02% ) +``` + +### Tests de performance du protocole de transfert de fichiers !!acronym{HTTP} + +Le serveur !!acronym{HTTP} _Apache_ a été installé sur la machine +`debian1` et le fichier a été mis à disposition sur ce serveur avec les +commandes suivantes: + +```bash +apt install apache2 +cp win10.tar.gz /var/www/html/ +``` + +Finalement, le benchmark du téléchargement du fichier avec la commande +`wget` a été lancé sur `debian2`: + +```console +$ perf stat -r 4 -d wget http://debian1.home/win10.tar.gz +--2020-05-20 09:53:53-- http://debian1.home/win10.tar.gz +Resolving debian1.home (debian1.home)... 2a02:120b:c3e2:cab0:e6b9:7aff:feed:e0cd, 192.168.1.29 +Connecting to debian1.home (debian1.home)|2a02:120b:c3e2:cab0:e6b9:7aff:feed:e0cd|:80... connected. +HTTP request sent, awaiting response... 200 OK +Length: 13743592907 (13G) [application/x-gzip] +Saving to: ‘win10.tar.gz.2’ + +win10.tar.gz.2 100%[==============================================>] 12.80G 110MB/s in 2m 0s + +2020-05-20 09:55:53 (110 MB/s) - ‘win10.tar.gz.2’ saved [13743592907/13743592907] + +--2020-05-20 09:55:53-- http://debian1.home/win10.tar.gz +Resolving debian1.home (debian1.home)... 2a02:120b:c3e2:cab0:e6b9:7aff:feed:e0cd, 192.168.1.29 +Connecting to debian1.home (debian1.home)|2a02:120b:c3e2:cab0:e6b9:7aff:feed:e0cd|:80... connected. +HTTP request sent, awaiting response... 200 OK +Length: 13743592907 (13G) [application/x-gzip] +Saving to: ‘win10.tar.gz.3’ + +win10.tar.gz.3 100%[==============================================>] 12.80G 108MB/s in 2m 0s + +2020-05-20 09:57:52 (109 MB/s) - ‘win10.tar.gz.3’ saved [13743592907/13743592907] + +--2020-05-20 09:57:52-- http://debian1.home/win10.tar.gz +Resolving debian1.home (debian1.home)... 2a02:120b:c3e2:cab0:e6b9:7aff:feed:e0cd, 192.168.1.29 +Connecting to debian1.home (debian1.home)|2a02:120b:c3e2:cab0:e6b9:7aff:feed:e0cd|:80... connected. +HTTP request sent, awaiting response... 200 OK +Length: 13743592907 (13G) [application/x-gzip] +Saving to: ‘win10.tar.gz.4’ + +win10.tar.gz.4 100%[==============================================>] 12.80G 108MB/s in 2m 1s + +2020-05-20 09:59:53 (109 MB/s) - ‘win10.tar.gz.4’ saved [13743592907/13743592907] + +--2020-05-20 09:59:53-- http://debian1.home/win10.tar.gz +Resolving debian1.home (debian1.home)... 2a02:120b:c3e2:cab0:e6b9:7aff:feed:e0cd, 192.168.1.29 +Connecting to debian1.home (debian1.home)|2a02:120b:c3e2:cab0:e6b9:7aff:feed:e0cd|:80... connected. +HTTP request sent, awaiting response... 200 OK +Length: 13743592907 (13G) [application/x-gzip] +Saving to: ‘win10.tar.gz.5’ + +win10.tar.gz.5 100%[==============================================>] 12.80G 110MB/s in 2m 0s + +2020-05-20 10:01:52 (110 MB/s) - ‘win10.tar.gz.5’ saved [13743592907/13743592907] + + + Performance counter stats for 'wget http://debian1.home/win10.tar.gz' (4 runs): + + 46,792.73 msec task-clock # 0.390 CPUs utilized ( +- 0.64% ) + 417,641 context-switches # 0.009 M/sec ( +- 0.31% ) + 18 cpu-migrations # 0.000 K/sec ( +- 8.25% ) + 292 page-faults # 0.006 K/sec ( +- 0.30% ) + 61,311,321,905 cycles # 1.310 GHz ( +- 0.25% ) (49.71%) + 55,652,602,418 instructions # 0.91 insn per cycle ( +- 0.20% ) (61.93%) + 10,835,524,321 branches # 231.564 M/sec ( +- 0.14% ) (62.04%) + 229,073,690 branch-misses # 2.11% of all branches ( +- 1.03% ) (62.77%) + 16,218,621,768 L1-dcache-loads # 346.606 M/sec ( +- 0.16% ) (62.94%) + 1,767,713,664 L1-dcache-load-misses # 10.90% of all L1-dcache hits ( +- 0.17% ) (62.78%) + 392,258,789 LLC-loads # 8.383 M/sec ( +- 1.79% ) (50.19%) + 113,116,138 LLC-load-misses # 28.84% of all LL-cache hits ( +- 0.25% ) (49.57%) + + 119.871 +- 0.235 seconds time elapsed ( +- 0.20% ) +``` + +### Tests de performance du protocole de transfert de fichiers !!acronym{FTP} + +Le serveur !!acronym{FTP} `vsftpd` a été installé sur la machine +`debian1` avec la commande suivante: + +```bash +apt install vsftpd +``` + +Le client !!acronym{FTP} `ftp` a été installé sur la machine `debian2` +avec la commande suivante: + +```bash +apt install ftp +``` + +Par défaut, un utilisateur se connecte sur son dossier `home` sur le +serveur, donc il n'y a pas besoin de créer de configuration spéciale car +le fichier à `win10.tar.gz` est déjà présent dans le dossier +`/home/debian`. La commande suivante est lancée pour mesurer le temps de +transfert: + +```console +$ perf stat -r 4 -d lftp -u debian,debian -e "get -e win10.tar.gz;quit" debian1.home +13743592907 bytes transferred in 120 seconds (109.61 MiB/s) +13743592907 bytes transferred in 120 seconds (109.11 MiB/s) +13743592907 bytes transferred in 120 seconds (108.81 MiB/s) +13743592907 bytes transferred in 120 seconds (109.01 MiB/s) + + Performance counter stats for 'lftp -u debian,debian -e get -e win10.tar.gz;quit debian1.home' (4 runs): + + 43,760.05 msec task-clock # 0.364 CPUs utilized ( +- 3.19% ) + 416,480 context-switches # 0.010 M/sec ( +- 0.21% ) + 20 cpu-migrations # 0.000 K/sec ( +- 17.44% ) + 768 page-faults # 0.018 K/sec ( +- 1.76% ) + 50,319,107,200 cycles # 1.150 GHz ( +- 1.87% ) (49.42%) + 41,925,907,326 instructions # 0.83 insn per cycle ( +- 2.58% ) (61.97%) + 8,345,354,967 branches # 190.707 M/sec ( +- 2.51% ) (62.63%) + 192,939,322 branch-misses # 2.31% of all branches ( +- 3.57% ) (62.66%) + 12,148,795,763 L1-dcache-loads # 277.623 M/sec ( +- 2.11% ) (63.06%) + 1,646,404,955 L1-dcache-load-misses # 13.55% of all L1-dcache hits ( +- 0.76% ) (62.79%) + 516,891,020 LLC-loads # 11.812 M/sec ( +- 0.79% ) (49.87%) + 112,961,435 LLC-load-misses # 21.85% of all LL-cache hits ( +- 0.29% ) (49.56%) + + 120.151 +- 0.213 seconds time elapsed ( +- 0.18% ) +``` + +### Tests de performance du protocole de transfert de fichiers !!acronym{NFS} + +Le serveur !!acronym{NFS} est installé et configuré avec les commandes +suivantes sur `debian1`: + +```bash +apt install nfs-kernel-server +mkdir /nfsroot +cp win10.tar.gz /nfsroot/ +echo '/nfsroot/ *(rw,fsid=0,no_root_squash,no_subtree_check,async,insecure)' >> /etc/exports +systemctl restart nfs-server +``` + +Le client partage est monté sur le client `debian2` avec les commandes +suivantes: + +```bash +su +apt install nfs-common +mkdir /nfsroot +mount -t nfs debian1.home:/nfsroot /nfsroot +exit +``` + +Finalement, le benchmark de la copie a été lancé sur `debian2`: + +```console +$ perf stat -r 4 -d cp -f /nfsroot/win10.tar.gz ~/win10.tar.gz + + Performance counter stats for 'cp -f /nfsroot/win10.tar.gz /home/debian/win10.tar.gz' (4 runs): + + 17,076.43 msec task-clock # 0.142 CPUs utilized ( +- 7.26% ) + 13,716 context-switches # 0.803 K/sec ( +- 3.93% ) + 3 cpu-migrations # 0.000 K/sec ( +- 22.88% ) + 360 page-faults # 0.021 K/sec ( +- 0.24% ) + 29,329,681,962 cycles # 1.718 GHz ( +- 0.84% ) (50.10%) + 39,303,308,222 instructions # 1.34 insn per cycle ( +- 0.27% ) (62.64%) + 7,592,336,916 branches # 444.609 M/sec ( +- 0.28% ) (62.68%) + 79,751,186 branch-misses # 1.05% of all branches ( +- 0.28% ) (62.46%) + 10,749,309,904 L1-dcache-loads # 629.482 M/sec ( +- 0.40% ) (62.54%) + 1,097,825,933 L1-dcache-load-misses # 10.21% of all L1-dcache hits ( +- 1.45% ) (62.44%) + 230,105,352 LLC-loads # 13.475 M/sec ( +- 1.25% ) (49.92%) + 13,665,720 LLC-load-misses # 5.94% of all LL-cache hits ( +- 8.55% ) (49.87%) + + 120.417 +- 0.119 seconds time elapsed ( +- 0.10% ) +``` + +### Tests de performance du protocole de transfert de fichiers !!acronym{SMB} + +Le serveur !!acronym{SMB} `samba` est installé et configuré avec les +commandes suivantes sur `debian1`: + +```bash +apt install samba +smbpasswd -a debian +cat '[debian] +path = /home/debian +valid users = debian +read only = no' >> /etc/samba/smb.conf +systemctl restart smbd +``` + +Le client !!acronym{SMB} `samba` est installé sur le client avec la +commande suivante: + +```bash +apt install samba-client +``` + +Finalement, le benchmark de la copie est lancé sur `debian2`: + +```command +$ perf stat -r 4 -d smbclient -U debian%debian //debian1.home/debian -c 'get win10.tar.gz' +Unable to initialize messaging context +getting file \win10.tar.gz of size 13743592907 as win10.tar.gz (109684.9 KiloBytes/sec) (average 109684.9 KiloBytes/sec) +Unable to initialize messaging context +getting file \win10.tar.gz of size 13743592907 as win10.tar.gz (109443.4 KiloBytes/sec) (average 109443.4 KiloBytes/sec) +Unable to initialize messaging context +getting file \win10.tar.gz of size 13743592907 as win10.tar.gz (110095.1 KiloBytes/sec) (average 110095.1 KiloBytes/sec) +Unable to initialize messaging context +getting file \win10.tar.gz of size 13743592907 as win10.tar.gz (109244.7 KiloBytes/sec) (average 109244.7 KiloBytes/sec) + + Performance counter stats for 'smbclient -U debian%debian //debian1.home/debian -c get win10.tar.gz' (4 runs): + + 35,488.67 msec task-clock # 0.290 CPUs utilized ( +- 0.49% ) + 352,535 context-switches # 0.010 M/sec ( +- 0.24% ) + 14 cpu-migrations # 0.000 K/sec ( +- 19.12% ) + 3,915 page-faults # 0.110 K/sec ( +- 3.20% ) + 35,420,663,303 cycles # 0.998 GHz ( +- 0.45% ) (50.50%) + 35,124,728,140 instructions # 0.99 insn per cycle ( +- 2.40% ) (62.99%) + 6,843,251,403 branches # 192.829 M/sec ( +- 2.43% ) (62.60%) + 115,346,267 branch-misses # 1.69% of all branches ( +- 1.05% ) (62.27%) + 9,922,177,546 L1-dcache-loads # 279.587 M/sec ( +- 1.82% ) (61.98%) + 1,307,137,276 L1-dcache-load-misses # 13.17% of all L1-dcache hits ( +- 0.23% ) (62.22%) + 437,456,998 LLC-loads # 12.327 M/sec ( +- 4.03% ) (50.00%) + 159,643,085 LLC-load-misses # 36.49% of all LL-cache hits ( +- 8.69% ) (50.44%) + + 122.565 +- 0.215 seconds time elapsed ( +- 0.18% ) +``` + +### Tests de performance du protocole de transfert de fichiers !!acronym{IPFS} + +Sur chacune des machines, le langage _Go_ doit être installé avec les +commandes suivantes: + +```bash +wget https://dl.google.com/go/go1.14.3.linux-amd64.tar.gz +tar -C /usr/local -xzf go1.14.3.linux-amd64.tar.gz +echo 'export PATH=$PATH:/usr/local/go/bin' >> /etc/profile +export PATH=$PATH:/usr/local/go/bin +``` + +Ensuite, !!acronym{IPFS} est installé sur chacune des machines: + +```bash +wget https://dist.ipfs.io/go-ipfs/v0.5.1/go-ipfs_v0.5.1_linux-amd64.tar.gz +tar xvzf go-ipfs_v0.5.1_linux-amd64.tar.gz +mv go-ipfs/ipfs /usr/local/bin/ipfs +``` + +Un noeud !!acronym{IPFS} est ensuite initialisé sur chacune des +machines: + +```bash +IPFS_PATH=~/.ipfs ipfs init +``` + +Pour avoir un réseau IPFS privé, on génère une clé de _swarm_ sur +`debian1` et on la copie sur `debian2`, en lançant les commandes +suivantes sur la machine `debian1`: + +```bash +echo -e "/key/swarm/psk/1.0.0/\n/base16/\n`tr -dc 'a-f0-9' < /dev/urandom | head -c64`" > ~/.ipfs/swarm.key +scp /home/debian/.ipfs/swarm.key debian2.home:/home/debian/.ipfs/swarm.key +``` + +Maintenant, il faut configurer un noeud d'amorçage (_bootstrap node_) +sur `debian1`, qui sera utilisé par `debian2` pour se connecter au +réseau !!acronym{IPFS} privé séparé du réseau public qui utilise +d'autres noeuds d'amorçage. Pour faire cela, il faut commencer par +supprimer la liste des noeuds d'amorçage publics sur les deux machines +avec la commande suivante: + +```bash +IPFS_PATH=~/.ipfs ipfs bootstrap rm --all +``` + +Ensuite, il faut récupérer l'identifiant unique `PeerID` de `debian1` +pour pouvoir le configurer comme un noeud d'amorçage dans `debian2`. La +commande suivante est lancée sur `debian1`: + +```console +$ IPFS_PATH=~/.ipfs ipfs config show | grep "PeerID" + "PeerID": "QmX9MYUQhjKxua6HQMtpzaZd9ui4gGT75FJgAxeQJC47Ei" +``` + +L'identitfiant unique `PeerID` de `debian1` retourné par la commande +est: `QmX9MYUQhjKxua6HQMtpzaZd9ui4gGT75FJgAxeQJC47Ei`. On peut +maintenant le rajouter dans la configuration des noeuds d'amorçage des +deux machines en lançant la commande suivante sur chacune d'entre elle: + +```bash +IPFS_PATH=~/.ipfs ipfs bootstrap add /dnsaddr/debian1.home/p2p/QmX9MYUQhjKxua6HQMtpzaZd9ui4gGT75FJgAxeQJC47Ei +``` + +Maintenant, le _daemon_ !!acronym{IPFS} peut être lancé sur chacune des +machines. La variable d'environnement `LIBP2P_FORCE_PNET=1` est définie +pour forcer les échanges à se faire sur un réseau privé. + +```bash +export LIBP2P_FORCE_PNET=1 +IPFS_PATH=~/.ipfs ipfs daemon +``` + +Dans ce cas, le _daemon_ a été exécuté en avant plan et un second +terminal sera ouvert pour la suite des commandes. Dans une configuration +plus durable, il faudrait le faire tourner en arrière plan, par exemple +avec une unité systemd. + +Maintenant on peut partager l'image sur le réseau avec la commande +suivante sur `debian1`: + +```console +$ IPFS_PATH=~/.ipfs ipfs add win10.tar.gz +added QmRm8As8ECuQoLq3UWowsxJ8mh89txLvpUh7A2mgw5pMhv win10.tar.gz + 12.80 GiB / 12.80 GiB [====================================================================================] 100.00% +``` + +Le temps d'ajout de l'image a pris plus de trois minutes. À la fin, la +référence du fichier, qui l'identifie de manière unique sur le réseau, +est affichée: `QmRm8As8ECuQoLq3UWowsxJ8mh89txLvpUh7A2mgw5pMhv`. + +On peut maintenant tenter de récupérer le fichier depuis `debian2`: + +```console +$ IPFS_PATH=~/.ipfs ipfs get QmRm8As8ECuQoLq3UWowsxJ8mh89txLvpUh7A2mgw5pMhv +Saving file(s) to QmRm8As8ECuQoLq3UWowsxJ8mh89txLvpUh7A2mgw5pMhv + 12.80 GiB / 12.80 GiB [==============================================================================] 100.00% 7m27s +``` + +Le transfert a pris !!inlinemath{7m27s = 447s}. C'est beaucoup trop long +pour nos besoins. Le benchmark avec `perf` n'a même pas été effectué au +vu de ce résultat. + +### Comparaison des résultats des tests de protocoles de transfert de fichiers + +!!barchart{chart_protocols}{Graphique comparant la durée de la copie d'un fichier avec différents protocoles}{ +"Protocole";"Durée (secondes)" +"FTP";123 +"HTTP";456 +"tutu";123 +} + +### Protocole choisi pour le transfert d'image + + **TODO: expliquer, détailler et +comparer (tableaux, diagrammes) les différentes mesures qui ont conduit +à garder NFS pour le transfert des images. Aussi expliquer les limites +probables de NFS avec beaucoup de postes simultanés et donner des pistes +d'amélioration (multicast, bittorrent+http, optimisations NFS).** ## Réduction de la taille des images @@ -536,6 +1030,8 @@ images.** récentes, des modifications nécessaires pour supporter ce nouveau système et des limitations que cela apporte.** +## Déploiement d'image Windows + ## Amélioration de l'OS de déploiement **TODO: expliquer pourquoi le passage d'une image buildroot chargée d'un diff --git a/doc/rapport.md b/doc/rapport.md index 7e736c85b87a16d0fed29a69e02f05f602cff9d0..ce82cd2b5c3a13df63d4f1ac45efa11cde2ed65f 100644 --- a/doc/rapport.md +++ b/doc/rapport.md @@ -24,9 +24,9 @@ - **MBR**: _Master Boot Record_: enregistrement d'amorcage maître -- **GRUB**: _GRand Unified Bootloader +- **GRUB**: _GRand Unified Bootloader_ -- **BIOS**: _Basic Input Output System_ +- **BIOS**: _Basic Input Output System_: système de base d'entrée sortie - **UEFI**: _Unified Extensible Firmware Interface_: interface micrologicielle extensible unifiée @@ -38,6 +38,22 @@ - **NAT**: _Network Address Translation_: traduction d'adresse réseau +- **SCP**: _Secure CoPy_: protocole de copie sécurisée sur le réseau + +- **SSH**: _Secure SHell_: protocole de terminal à distance securisé + +- **HTTP**: _HyperText Transfer Protocol_: protocole de transfert hypertexte + +- **WWW**: _World Wide Web_: toile mondiale / réseau mondial + +- **HTTPS**: _HyperText Transfer Protocol Secure_: protocole de transfert hypertexte sécurisé + +- **FTP**: _File Transfer Protocol_: protocole de transfert de fichier + +- **IPFS**: _InterPlanetary File System_: système de fichier inter-planétaire + +- **SMB**: _Server Message Block_ + @@ -193,7 +209,7 @@ Les postes clients supportés par le système sont des ordinateurs compatibles <abbr title="Personal Computer: ordinateur personnel ">PC</abbr> x86. Ils doivent nécessairement être équipés d'une carte réseau et d'un -micrologiciel <abbr title="Basic Input Output System ">BIOS</abbr> ou <abbr title="Unified Extensible Firmware Interface: interface micrologicielle extensible unifiée ">UEFI</abbr> capables et configurés +micrologiciel <abbr title="Basic Input Output System: système de base d’entrée sortie ">BIOS</abbr> ou <abbr title="Unified Extensible Firmware Interface: interface micrologicielle extensible unifiée ">UEFI</abbr> capables et configurés pour amorcer un système d'exploitation à partir du réseau à chaque démarrage en utilisant le standard <abbr title="Pre-boot eXecution Environment: environnement d’exécution pré-démarrage ">PXE</abbr>. @@ -273,10 +289,10 @@ avec les postes clients pour leur permettre d'effectuer plusieurs actions: 1. Recevoir une configuration IP et un chargeur d'amorcage - <abbr title="_GRand Unified Bootloader ">GRUB</abbr> à exécuter pour démarrer sur le réseau en utilisant + <abbr title="GRand Unified Bootloader ">GRUB</abbr> à exécuter pour démarrer sur le réseau en utilisant le standard PXE. 2. Analyser la signature présente sur le disque dur depuis le chargeur - d'amorçage chargeur d'amorcage <abbr title="_GRand Unified Bootloader ">GRUB</abbr>. + d'amorçage chargeur d'amorcage <abbr title="GRand Unified Bootloader ">GRUB</abbr>. - Si elle n'est pas présente, amorcer un système d'exploitation minimaliste servant à effectuer le choix d'une image et d'automatiser son déploiement et sa mise en cache. @@ -415,10 +431,10 @@ La configuration du serveur <abbr title="Dynamic Host Configuration Protocol: pr qu'en plus du `option tftp-server-name "192.168.56.100"`, le paramètre `next-server 192.168.56.100` soit aussi envoyé aux clients. Le premier paramètre sert au client à savoir sur quel serveur TFTP l'exécutable -d'amorçage (dans ce cas, <abbr title="_GRand Unified Bootloader ">GRUB</abbr>) doit être téléchargé. -Cependant, une fois <abbr title="_GRand Unified Bootloader ">GRUB</abbr> démarré, il n'était pas capable de +d'amorçage (dans ce cas, <abbr title="GRand Unified Bootloader ">GRUB</abbr>) doit être téléchargé. +Cependant, une fois <abbr title="GRand Unified Bootloader ">GRUB</abbr> démarré, il n'était pas capable de trouver l'image du système linux de déploiement. L'option `next-server` -a permis de renseigner <abbr title="_GRand Unified Bootloader ">GRUB</abbr> sur le fait qu'il doit par défaut +a permis de renseigner <abbr title="GRand Unified Bootloader ">GRUB</abbr> sur le fait qu'il doit par défaut rechercher les fichiers mentionnés dans la configuration dans le serveur <abbr title="Trivial File Transfer Protocol: protocole simplifié de transfert de fichiers ">TFTP</abbr> accessible par l'adresse IP mentionnée. @@ -427,12 +443,12 @@ résoudre de nombreux petits bugs dans les scripts de déploiement, qui ne s'exécutaient pas complètement à cause d'erreurs dans certaines commandes. Une fois les scripts corrigés, le démarrage de l'image déployée ne fonctionnait pas. Pour des raisons non documentées, -<abbr title="_GRand Unified Bootloader ">GRUB</abbr> était configuré pour lancer le programme `ipxe` depuis +<abbr title="GRand Unified Bootloader ">GRUB</abbr> était configuré pour lancer le programme `ipxe` depuis le serveur <abbr title="Trivial File Transfer Protocol: protocole simplifié de transfert de fichiers ">TFTP</abbr>, qui lui même initie le démarrage depuis le premier disque. Ce système ne fonctionnait pas: `ipxe` ne se lançait même pas à cause d'un chemin invalide. De plus ce système rajoutait une -étape inutile: <abbr title="_GRand Unified Bootloader ">GRUB</abbr> est tout à fait capable de démarrer sur -le premier disque. Le fichier de configuration de <abbr title="_GRand Unified Bootloader ">GRUB</abbr> a donc +étape inutile: <abbr title="GRand Unified Bootloader ">GRUB</abbr> est tout à fait capable de démarrer sur +le premier disque. Le fichier de configuration de <abbr title="GRand Unified Bootloader ">GRUB</abbr> a donc été modifié pour directement démarrer sur le disque quand la signature est détectée à la fin du disque. Enfin, le système était fonctionnel. @@ -469,8 +485,9 @@ il comporte de nombreuses limitations auxquelles il faudrait palier: commande, ce n'est pas très facile à utiliser. - Les scripts de déploiement sont fragiles et gèrent mal les erreurs. - Il n'y a pas de système de personnalisation d'image. Si on veut faire - $n$ personnalisation partant sur la base du même <abbr title="Operating System: système d’exploitation ">OS</abbr>, il - faut faire $n$ images: une pour chaque personnalisation. + $`n`$ personnalisation partant sur la base du même + <abbr title="Operating System: système d’exploitation ">OS</abbr>, il faut faire $`n`$ images: une pour chaque + personnalisation. - L'installation de nouveaux outils sur le système d'exploitation de l'<abbr title="Operating System: système d’exploitation ">OS</abbr> de déploiement créé avec _Buildroot_ peut être compliqué si l'outil a beaucoup de dépendances. @@ -494,11 +511,496 @@ il comporte de nombreuses limitations auxquelles il faudrait palier: ## Amélioration de la vitesse de transfert des images -**TODO: expliquer, détailler et comparer (tableaux, diagrammes) les -différentes mesures qui ont conduit à garder NFS pour le transfert des -images. Aussi expliquer les limites probables de NFS avec beaucoup de -postes simultanés et donner des pistes d'amélioration (multicast, -bittorrent+http, optimisations NFS).** +Le protocole <abbr title="Network File System: système de fichiers en réseau ">NFS</abbr> est utilisé dans le système initial pour +transférer une image depuis le client vers le serveur. Peut-être que la +vitesse de transfert des images à travers le réseau pourrait être +améliorée en utilisant un autre protocole. Pour décider si le choix de +ce protocole est adapté ou si au contraire il serait bénéfique d'en +utiliser un autre, la vitesse de transfert d'une grosse image a été +mesurée sur différents protocoles de transfert de fichier. + +### Protocoles considérés +Les différents protocoles qui ont été mesurés sont: + +- <abbr title="Secure CoPy: protocole de copie sécurisée sur le réseau ">SCP</abbr>: ce protocole, utilisable avec le programme éponyme + `scp`, permet le transfert de fichiers sécurisé entre un client et un + serveur utilisant le protocole d'accès à distance sécurisé + <abbr title="Secure SHell: protocole de terminal à distance securisé ">SSH</abbr>. Bien que le chiffrage de la communication n'est pas + nécessaire dans notre cas, il est intéressant d'observer si ce dernier + a un impact sur le temps de transfert. +- <abbr title="HyperText Transfer Protocol: protocole de transfert hypertexte ">HTTP</abbr>: c'est le protocole client-serveur utilisé sur le + World Wide Web (<abbr title="World Wide Web: toile mondiale / réseau mondial ">WWW</abbr>) pour la communication entre en les + navigateurs (client) et les serveurs. Il est souvent utilisé pour le + téléchargement de fichiers sur internet et offre probablement des + performances acceptables. Il existe aussi une version chiffrée de ce + protocole, <abbr title="HyperText Transfer Protocol Secure: protocole de transfert hypertexte sécurisé ">HTTPS</abbr>, mais uniquement la version non-chiffrée + sera testée ici, car le chiffrement de la communication ne semble pas + nécessaire et pourrait impacter les performances. +- <abbr title="File Transfer Protocol: protocole de transfert de fichier ">FTP</abbr>: ce protocole standard fait exactement ce que nous + avons besoin: transférer des fichiers à travers le réseau. Il y a de + forte chances qu'il offre de très bonnes performances. +- <abbr title="Network File System: système de fichiers en réseau ">NFS</abbr>: le protocole standard pour monter à distance des + dossiers partagés entre des <abbr title="Operating System: système d’exploitation ">OS</abbr> Linux. C'est ce système qui + est utilisé par le projet initial, mais ce n'est probablement pas le + plus rapide, car permet de faire plus qu'un simple transfert de + fichiers. +- <abbr title="Server Message Block ">SMB</abbr>: le protocole standard pour monter à distance des + dossier partagés entre des <abbr title="Operating System: système d’exploitation ">OS</abbr> Windows. Une implémentation + existe sous linux, _Samba_, et elle est courremment utilisée pour une + meilleure compatiblité avec les systèmes Windows que sont équivalent + <abbr title="Network File System: système de fichiers en réseau ">NFS</abbr>. +- <abbr title="InterPlanetary File System: système de fichier inter-planétaire ">IPFS</abbr>: ce protocole pair à pair décentralisé permet à chacun + de des pairs de mettre à disposition ou de télécharger des fichiers. + Il pourrait être intéressant d'utiliser ce protocole pour soulager la + charge du serveur, car tous les clients connectés peuvent se partager + des parties d'images qu'ils ont déjà. Le serveur de déploiement ne + serait qu'un pair de plus, qui dispose de toutes les images. Il est + cependant possible que ce protocole ne soit pas le plus performant à + cause de sa jeunesse et de son mode de fonctionnement complexe qui + apporte un surcout à l'échange, en tout cas dans le cas ou il n'y a + que deux pairs. + +### Environnement des tests de performance des protocoles de transfert de fichiers + +Deux machines de test identiques ont été utilisées: il s'agit de mini-PC +DELL Optiplex 7060 micro avec les spécifications suivantes: + +- Processeur: Intel® Core™ i7-8700 CPU cadencé à 3.20GHz, +- Mémoire vive: 8 GiB (2 barettes 4GiB SODIMM DDR4 Synchronous 2666 MHz + (0.4 ns)) +- Disque: TOSHIBA KSG60ZMV SSD 476GiB (512GB) +- Réseau: Intel e1000e Gigabit Ethernet + +Les deux machines de test sont connectées en réseau avec un switch +Gigabit Ethernet. Le système d'exploitation Debian 10.4.0 (nom de code +_buster_) AMD64 a été installé sur deux machines de test, +sans interface graphique. La première machine est nommée `debian1` et la seconde +`debian2`. Les noms `debian1.home` et `debian2.home` permettent aux deux +machines de communiquer entre elles en faisant abstraction de leur +adresse <abbr title="Internet Protocol: protocole internet ">IP</abbr>. L'utilisateur `debian` avec le mot de passe +`debian` est utilisé sur chacune des deux machines. + +Le fichier à copier, `win10.tar.gz` est une image brute de windows 10 +compressée avec `gzip`, qui fait une taille totale de +13743592907 B (12.8 GiB). Il est présent dans le dossier `/home/debian` +de la machine `debian1`. + +La commande `perf` est utilisée pour tester 4 exécutions d'une commande +de copie lancée depuis la machine `debian2`. Elle est installée à l'aide +de la commande suivante: + +```bash +apt install linux-perf +``` + +Pour faire fonctionner la commande sans être root, le kernel doit être +configuré avec la commande suivante: + +```bash +echo 1 > /proc/sys/kernel/perf_event_paranoid +``` + +Les sections suivantes détaillent les configurations spécifiques à +chaque protocole effectuées sur chacune des machines et les résultats du +test. La dernière section récapitule les résultats et explique quel +protocole est choisi pour la suite du travail et pourquoi. + +### Tests de performance du protocole de transfert de fichiers <abbr title="Secure CoPy: protocole de copie sécurisée sur le réseau ">SCP</abbr> + +Tout d'abord, des clés SSH ont été générées sur chaque machine avec la +commande suivante: + +```bash +ssh-keygen +``` + +Ensuite, les clés ont été échangées. Sur `debian1`, la commande suivante +a été utilisée: + +```bash +ssh-copy-id debian2.home +``` + +Sur `debian2`, la commande suivante a été utilisée: + +```bash +ssh-copy-id debian1.home +``` + +Finalement, le benchmark de la copie a été lancé sur `debian2`: + +```console +$ perf stat -r 4 -d scp debian1.home:/home/debian/win10.tar.gz /home/debian/win10.tar.gz +win10.tar.gz 100% 13GB 109.6MB/s 01:59 +win10.tar.gz 100% 13GB 109.6MB/s 01:59 +win10.tar.gz 100% 13GB 109.7MB/s 01:59 +win10.tar.gz 100% 13GB 109.6MB/s 01:59 + + Performance counter stats for 'scp debian1.home:/home/debian/win10.tar.gz /home/debian/win10.tar.gz' (4 runs): + + 60,349.20 msec task-clock # 0.504 CPUs utilized ( +- 3.61% ) + 808,243 context-switches # 0.013 M/sec ( +- 0.26% ) + 16 cpu-migrations # 0.000 K/sec ( +- 14.73% ) + 16,862 page-faults # 0.279 K/sec ( +- 18.95% ) + 191,612,352,176 cycles # 3.175 GHz ( +- 0.33% ) (50.09%) + 406,400,076,305 instructions # 2.12 insn per cycle ( +- 0.25% ) (62.64%) + 13,334,327,547 branches # 220.953 M/sec ( +- 1.42% ) (62.43%) + 246,499,018 branch-misses # 1.85% of all branches ( +- 3.10% ) (62.36%) + 64,653,696,732 L1-dcache-loads # 1071.326 M/sec ( +- 0.44% ) (62.40%) + 4,559,992,550 L1-dcache-load-misses # 7.05% of all L1-dcache hits ( +- 0.41% ) (62.43%) + 784,218,339 LLC-loads # 12.995 M/sec ( +- 0.64% ) (50.01%) + 121,317,304 LLC-load-misses # 15.47% of all LL-cache hits ( +- 0.52% ) (50.29%) + + 119.8094 +- 0.0182 seconds time elapsed ( +- 0.02% ) +``` + +### Tests de performance du protocole de transfert de fichiers <abbr title="HyperText Transfer Protocol: protocole de transfert hypertexte ">HTTP</abbr> + +Le serveur <abbr title="HyperText Transfer Protocol: protocole de transfert hypertexte ">HTTP</abbr> _Apache_ a été installé sur la machine +`debian1` et le fichier a été mis à disposition sur ce serveur avec les +commandes suivantes: + +```bash +apt install apache2 +cp win10.tar.gz /var/www/html/ +``` + +Finalement, le benchmark du téléchargement du fichier avec la commande +`wget` a été lancé sur `debian2`: + +```console +$ perf stat -r 4 -d wget http://debian1.home/win10.tar.gz +--2020-05-20 09:53:53-- http://debian1.home/win10.tar.gz +Resolving debian1.home (debian1.home)... 2a02:120b:c3e2:cab0:e6b9:7aff:feed:e0cd, 192.168.1.29 +Connecting to debian1.home (debian1.home)|2a02:120b:c3e2:cab0:e6b9:7aff:feed:e0cd|:80... connected. +HTTP request sent, awaiting response... 200 OK +Length: 13743592907 (13G) [application/x-gzip] +Saving to: ‘win10.tar.gz.2’ + +win10.tar.gz.2 100%[==============================================>] 12.80G 110MB/s in 2m 0s + +2020-05-20 09:55:53 (110 MB/s) - ‘win10.tar.gz.2’ saved [13743592907/13743592907] + +--2020-05-20 09:55:53-- http://debian1.home/win10.tar.gz +Resolving debian1.home (debian1.home)... 2a02:120b:c3e2:cab0:e6b9:7aff:feed:e0cd, 192.168.1.29 +Connecting to debian1.home (debian1.home)|2a02:120b:c3e2:cab0:e6b9:7aff:feed:e0cd|:80... connected. +HTTP request sent, awaiting response... 200 OK +Length: 13743592907 (13G) [application/x-gzip] +Saving to: ‘win10.tar.gz.3’ + +win10.tar.gz.3 100%[==============================================>] 12.80G 108MB/s in 2m 0s + +2020-05-20 09:57:52 (109 MB/s) - ‘win10.tar.gz.3’ saved [13743592907/13743592907] + +--2020-05-20 09:57:52-- http://debian1.home/win10.tar.gz +Resolving debian1.home (debian1.home)... 2a02:120b:c3e2:cab0:e6b9:7aff:feed:e0cd, 192.168.1.29 +Connecting to debian1.home (debian1.home)|2a02:120b:c3e2:cab0:e6b9:7aff:feed:e0cd|:80... connected. +HTTP request sent, awaiting response... 200 OK +Length: 13743592907 (13G) [application/x-gzip] +Saving to: ‘win10.tar.gz.4’ + +win10.tar.gz.4 100%[==============================================>] 12.80G 108MB/s in 2m 1s + +2020-05-20 09:59:53 (109 MB/s) - ‘win10.tar.gz.4’ saved [13743592907/13743592907] + +--2020-05-20 09:59:53-- http://debian1.home/win10.tar.gz +Resolving debian1.home (debian1.home)... 2a02:120b:c3e2:cab0:e6b9:7aff:feed:e0cd, 192.168.1.29 +Connecting to debian1.home (debian1.home)|2a02:120b:c3e2:cab0:e6b9:7aff:feed:e0cd|:80... connected. +HTTP request sent, awaiting response... 200 OK +Length: 13743592907 (13G) [application/x-gzip] +Saving to: ‘win10.tar.gz.5’ + +win10.tar.gz.5 100%[==============================================>] 12.80G 110MB/s in 2m 0s + +2020-05-20 10:01:52 (110 MB/s) - ‘win10.tar.gz.5’ saved [13743592907/13743592907] + + + Performance counter stats for 'wget http://debian1.home/win10.tar.gz' (4 runs): + + 46,792.73 msec task-clock # 0.390 CPUs utilized ( +- 0.64% ) + 417,641 context-switches # 0.009 M/sec ( +- 0.31% ) + 18 cpu-migrations # 0.000 K/sec ( +- 8.25% ) + 292 page-faults # 0.006 K/sec ( +- 0.30% ) + 61,311,321,905 cycles # 1.310 GHz ( +- 0.25% ) (49.71%) + 55,652,602,418 instructions # 0.91 insn per cycle ( +- 0.20% ) (61.93%) + 10,835,524,321 branches # 231.564 M/sec ( +- 0.14% ) (62.04%) + 229,073,690 branch-misses # 2.11% of all branches ( +- 1.03% ) (62.77%) + 16,218,621,768 L1-dcache-loads # 346.606 M/sec ( +- 0.16% ) (62.94%) + 1,767,713,664 L1-dcache-load-misses # 10.90% of all L1-dcache hits ( +- 0.17% ) (62.78%) + 392,258,789 LLC-loads # 8.383 M/sec ( +- 1.79% ) (50.19%) + 113,116,138 LLC-load-misses # 28.84% of all LL-cache hits ( +- 0.25% ) (49.57%) + + 119.871 +- 0.235 seconds time elapsed ( +- 0.20% ) +``` + +### Tests de performance du protocole de transfert de fichiers <abbr title="File Transfer Protocol: protocole de transfert de fichier ">FTP</abbr> + +Le serveur <abbr title="File Transfer Protocol: protocole de transfert de fichier ">FTP</abbr> `vsftpd` a été installé sur la machine +`debian1` avec la commande suivante: + +```bash +apt install vsftpd +``` + +Le client <abbr title="File Transfer Protocol: protocole de transfert de fichier ">FTP</abbr> `ftp` a été installé sur la machine `debian2` +avec la commande suivante: + +```bash +apt install ftp +``` + +Par défaut, un utilisateur se connecte sur son dossier `home` sur le +serveur, donc il n'y a pas besoin de créer de configuration spéciale car +le fichier à `win10.tar.gz` est déjà présent dans le dossier +`/home/debian`. La commande suivante est lancée pour mesurer le temps de +transfert: + +```console +$ perf stat -r 4 -d lftp -u debian,debian -e "get -e win10.tar.gz;quit" debian1.home +13743592907 bytes transferred in 120 seconds (109.61 MiB/s) +13743592907 bytes transferred in 120 seconds (109.11 MiB/s) +13743592907 bytes transferred in 120 seconds (108.81 MiB/s) +13743592907 bytes transferred in 120 seconds (109.01 MiB/s) + + Performance counter stats for 'lftp -u debian,debian -e get -e win10.tar.gz;quit debian1.home' (4 runs): + + 43,760.05 msec task-clock # 0.364 CPUs utilized ( +- 3.19% ) + 416,480 context-switches # 0.010 M/sec ( +- 0.21% ) + 20 cpu-migrations # 0.000 K/sec ( +- 17.44% ) + 768 page-faults # 0.018 K/sec ( +- 1.76% ) + 50,319,107,200 cycles # 1.150 GHz ( +- 1.87% ) (49.42%) + 41,925,907,326 instructions # 0.83 insn per cycle ( +- 2.58% ) (61.97%) + 8,345,354,967 branches # 190.707 M/sec ( +- 2.51% ) (62.63%) + 192,939,322 branch-misses # 2.31% of all branches ( +- 3.57% ) (62.66%) + 12,148,795,763 L1-dcache-loads # 277.623 M/sec ( +- 2.11% ) (63.06%) + 1,646,404,955 L1-dcache-load-misses # 13.55% of all L1-dcache hits ( +- 0.76% ) (62.79%) + 516,891,020 LLC-loads # 11.812 M/sec ( +- 0.79% ) (49.87%) + 112,961,435 LLC-load-misses # 21.85% of all LL-cache hits ( +- 0.29% ) (49.56%) + + 120.151 +- 0.213 seconds time elapsed ( +- 0.18% ) +``` + +### Tests de performance du protocole de transfert de fichiers <abbr title="Network File System: système de fichiers en réseau ">NFS</abbr> + +Le serveur <abbr title="Network File System: système de fichiers en réseau ">NFS</abbr> est installé et configuré avec les commandes +suivantes sur `debian1`: + +```bash +apt install nfs-kernel-server +mkdir /nfsroot +cp win10.tar.gz /nfsroot/ +echo '/nfsroot/ *(rw,fsid=0,no_root_squash,no_subtree_check,async,insecure)' >> /etc/exports +systemctl restart nfs-server +``` + +Le client partage est monté sur le client `debian2` avec les commandes +suivantes: + +```bash +su +apt install nfs-common +mkdir /nfsroot +mount -t nfs debian1.home:/nfsroot /nfsroot +exit +``` + +Finalement, le benchmark de la copie a été lancé sur `debian2`: + +```console +$ perf stat -r 4 -d cp -f /nfsroot/win10.tar.gz ~/win10.tar.gz + + Performance counter stats for 'cp -f /nfsroot/win10.tar.gz /home/debian/win10.tar.gz' (4 runs): + + 17,076.43 msec task-clock # 0.142 CPUs utilized ( +- 7.26% ) + 13,716 context-switches # 0.803 K/sec ( +- 3.93% ) + 3 cpu-migrations # 0.000 K/sec ( +- 22.88% ) + 360 page-faults # 0.021 K/sec ( +- 0.24% ) + 29,329,681,962 cycles # 1.718 GHz ( +- 0.84% ) (50.10%) + 39,303,308,222 instructions # 1.34 insn per cycle ( +- 0.27% ) (62.64%) + 7,592,336,916 branches # 444.609 M/sec ( +- 0.28% ) (62.68%) + 79,751,186 branch-misses # 1.05% of all branches ( +- 0.28% ) (62.46%) + 10,749,309,904 L1-dcache-loads # 629.482 M/sec ( +- 0.40% ) (62.54%) + 1,097,825,933 L1-dcache-load-misses # 10.21% of all L1-dcache hits ( +- 1.45% ) (62.44%) + 230,105,352 LLC-loads # 13.475 M/sec ( +- 1.25% ) (49.92%) + 13,665,720 LLC-load-misses # 5.94% of all LL-cache hits ( +- 8.55% ) (49.87%) + + 120.417 +- 0.119 seconds time elapsed ( +- 0.10% ) +``` + +### Tests de performance du protocole de transfert de fichiers <abbr title="Server Message Block ">SMB</abbr> + +Le serveur <abbr title="Server Message Block ">SMB</abbr> `samba` est installé et configuré avec les +commandes suivantes sur `debian1`: + +```bash +apt install samba +smbpasswd -a debian +cat '[debian] +path = /home/debian +valid users = debian +read only = no' >> /etc/samba/smb.conf +systemctl restart smbd +``` + +Le client <abbr title="Server Message Block ">SMB</abbr> `samba` est installé sur le client avec la +commande suivante: + +```bash +apt install samba-client +``` + +Finalement, le benchmark de la copie est lancé sur `debian2`: + +```command +$ perf stat -r 4 -d smbclient -U debian%debian //debian1.home/debian -c 'get win10.tar.gz' +Unable to initialize messaging context +getting file \win10.tar.gz of size 13743592907 as win10.tar.gz (109684.9 KiloBytes/sec) (average 109684.9 KiloBytes/sec) +Unable to initialize messaging context +getting file \win10.tar.gz of size 13743592907 as win10.tar.gz (109443.4 KiloBytes/sec) (average 109443.4 KiloBytes/sec) +Unable to initialize messaging context +getting file \win10.tar.gz of size 13743592907 as win10.tar.gz (110095.1 KiloBytes/sec) (average 110095.1 KiloBytes/sec) +Unable to initialize messaging context +getting file \win10.tar.gz of size 13743592907 as win10.tar.gz (109244.7 KiloBytes/sec) (average 109244.7 KiloBytes/sec) + + Performance counter stats for 'smbclient -U debian%debian //debian1.home/debian -c get win10.tar.gz' (4 runs): + + 35,488.67 msec task-clock # 0.290 CPUs utilized ( +- 0.49% ) + 352,535 context-switches # 0.010 M/sec ( +- 0.24% ) + 14 cpu-migrations # 0.000 K/sec ( +- 19.12% ) + 3,915 page-faults # 0.110 K/sec ( +- 3.20% ) + 35,420,663,303 cycles # 0.998 GHz ( +- 0.45% ) (50.50%) + 35,124,728,140 instructions # 0.99 insn per cycle ( +- 2.40% ) (62.99%) + 6,843,251,403 branches # 192.829 M/sec ( +- 2.43% ) (62.60%) + 115,346,267 branch-misses # 1.69% of all branches ( +- 1.05% ) (62.27%) + 9,922,177,546 L1-dcache-loads # 279.587 M/sec ( +- 1.82% ) (61.98%) + 1,307,137,276 L1-dcache-load-misses # 13.17% of all L1-dcache hits ( +- 0.23% ) (62.22%) + 437,456,998 LLC-loads # 12.327 M/sec ( +- 4.03% ) (50.00%) + 159,643,085 LLC-load-misses # 36.49% of all LL-cache hits ( +- 8.69% ) (50.44%) + + 122.565 +- 0.215 seconds time elapsed ( +- 0.18% ) +``` + +### Tests de performance du protocole de transfert de fichiers <abbr title="InterPlanetary File System: système de fichier inter-planétaire ">IPFS</abbr> + +Sur chacune des machines, le langage _Go_ doit être installé avec les +commandes suivantes: + +```bash +wget https://dl.google.com/go/go1.14.3.linux-amd64.tar.gz +tar -C /usr/local -xzf go1.14.3.linux-amd64.tar.gz +echo 'export PATH=$PATH:/usr/local/go/bin' >> /etc/profile +export PATH=$PATH:/usr/local/go/bin +``` + +Ensuite, <abbr title="InterPlanetary File System: système de fichier inter-planétaire ">IPFS</abbr> est installé sur chacune des machines: + +```bash +wget https://dist.ipfs.io/go-ipfs/v0.5.1/go-ipfs_v0.5.1_linux-amd64.tar.gz +tar xvzf go-ipfs_v0.5.1_linux-amd64.tar.gz +mv go-ipfs/ipfs /usr/local/bin/ipfs +``` + +Un noeud <abbr title="InterPlanetary File System: système de fichier inter-planétaire ">IPFS</abbr> est ensuite initialisé sur chacune des +machines: + +```bash +IPFS_PATH=~/.ipfs ipfs init +``` + +Pour avoir un réseau IPFS privé, on génère une clé de _swarm_ sur +`debian1` et on la copie sur `debian2`, en lançant les commandes +suivantes sur la machine `debian1`: + +```bash +echo -e "/key/swarm/psk/1.0.0/\n/base16/\n`tr -dc 'a-f0-9' < /dev/urandom | head -c64`" > ~/.ipfs/swarm.key +scp /home/debian/.ipfs/swarm.key debian2.home:/home/debian/.ipfs/swarm.key +``` + +Maintenant, il faut configurer un noeud d'amorçage (_bootstrap node_) +sur `debian1`, qui sera utilisé par `debian2` pour se connecter au +réseau <abbr title="InterPlanetary File System: système de fichier inter-planétaire ">IPFS</abbr> privé séparé du réseau public qui utilise +d'autres noeuds d'amorçage. Pour faire cela, il faut commencer par +supprimer la liste des noeuds d'amorçage publics sur les deux machines +avec la commande suivante: + +```bash +IPFS_PATH=~/.ipfs ipfs bootstrap rm --all +``` + +Ensuite, il faut récupérer l'identifiant unique `PeerID` de `debian1` +pour pouvoir le configurer comme un noeud d'amorçage dans `debian2`. La +commande suivante est lancée sur `debian1`: + +```console +$ IPFS_PATH=~/.ipfs ipfs config show | grep "PeerID" + "PeerID": "QmX9MYUQhjKxua6HQMtpzaZd9ui4gGT75FJgAxeQJC47Ei" +``` + +L'identitfiant unique `PeerID` de `debian1` retourné par la commande +est: `QmX9MYUQhjKxua6HQMtpzaZd9ui4gGT75FJgAxeQJC47Ei`. On peut +maintenant le rajouter dans la configuration des noeuds d'amorçage des +deux machines en lançant la commande suivante sur chacune d'entre elle: + +```bash +IPFS_PATH=~/.ipfs ipfs bootstrap add /dnsaddr/debian1.home/p2p/QmX9MYUQhjKxua6HQMtpzaZd9ui4gGT75FJgAxeQJC47Ei +``` + +Maintenant, le _daemon_ <abbr title="InterPlanetary File System: système de fichier inter-planétaire ">IPFS</abbr> peut être lancé sur chacune des +machines. La variable d'environnement `LIBP2P_FORCE_PNET=1` est définie +pour forcer les échanges à se faire sur un réseau privé. + +```bash +export LIBP2P_FORCE_PNET=1 +IPFS_PATH=~/.ipfs ipfs daemon +``` + +Dans ce cas, le _daemon_ a été exécuté en avant plan et un second +terminal sera ouvert pour la suite des commandes. Dans une configuration +plus durable, il faudrait le faire tourner en arrière plan, par exemple +avec une unité systemd. + +Maintenant on peut partager l'image sur le réseau avec la commande +suivante sur `debian1`: + +```console +$ IPFS_PATH=~/.ipfs ipfs add win10.tar.gz +added QmRm8As8ECuQoLq3UWowsxJ8mh89txLvpUh7A2mgw5pMhv win10.tar.gz + 12.80 GiB / 12.80 GiB [====================================================================================] 100.00% +``` + +Le temps d'ajout de l'image a pris plus de trois minutes. À la fin, la +référence du fichier, qui l'identifie de manière unique sur le réseau, +est affichée: `QmRm8As8ECuQoLq3UWowsxJ8mh89txLvpUh7A2mgw5pMhv`. + +On peut maintenant tenter de récupérer le fichier depuis `debian2`: + +```console +$ IPFS_PATH=~/.ipfs ipfs get QmRm8As8ECuQoLq3UWowsxJ8mh89txLvpUh7A2mgw5pMhv +Saving file(s) to QmRm8As8ECuQoLq3UWowsxJ8mh89txLvpUh7A2mgw5pMhv + 12.80 GiB / 12.80 GiB [==============================================================================] 100.00% 7m27s +``` + +Le transfert a pris $`7m27s = 447s`$. C'est beaucoup trop long +pour nos besoins. Le benchmark avec `perf` n'a même pas été effectué au +vu de ce résultat. + +### Comparaison des résultats des tests de protocoles de transfert de fichiers + + +<figure> +<a name="chart_protocols"/> + +<figcaption>Graphique comparant la durée de la copie d'un fichier avec différents protocoles</figcaption> +</figure> + + +### Protocole choisi pour le transfert d'image + + **TODO: expliquer, détailler et +comparer (tableaux, diagrammes) les différentes mesures qui ont conduit +à garder NFS pour le transfert des images. Aussi expliquer les limites +probables de NFS avec beaucoup de postes simultanés et donner des pistes +d'amélioration (multicast, bittorrent+http, optimisations NFS).** ## Réduction de la taille des images @@ -519,6 +1021,8 @@ images.** récentes, des modifications nécessaires pour supporter ce nouveau système et des limitations que cela apporte.** +## Déploiement d'image Windows + ## Amélioration de l'OS de déploiement **TODO: expliquer pourquoi le passage d'une image buildroot chargée d'un diff --git a/doc/rapport.pdf b/doc/rapport.pdf index 77337a17e2b50b7c3daacdcdeb9e514b7ee36997..0f0b1fb38f0345bdfe13c95c2567fe5f3dcf0ccd 100644 Binary files a/doc/rapport.pdf and b/doc/rapport.pdf differ