{"version":"1.1","schema_version":"1.1.0","plugin_version":"1.1.2","url":"https://tutos-gameserver.fr/2019/06/10/serveur-web-raspberry-pi-raspberry-pi-cluster-serveur-dimpression/","llm_html_url":"https://tutos-gameserver.fr/2019/06/10/serveur-web-raspberry-pi-raspberry-pi-cluster-serveur-dimpression/llm","llm_json_url":"https://tutos-gameserver.fr/2019/06/10/serveur-web-raspberry-pi-raspberry-pi-cluster-serveur-dimpression/llm.json","manifest_url":"https://tutos-gameserver.fr/llm-endpoints-manifest.json","language":"fr-FR","locale":"fr_FR","title":"Serveur Web Raspberry Pi &#8211; Raspberry Pi Cluster\n\n &#8211; Serveur d&rsquo;impression","site":{"name":"Tutos GameServer","url":"https://tutos-gameserver.fr/"},"author":{"id":1,"name":"Titanfall","url":"https://tutos-gameserver.fr/author/titanfall/"},"published_at":"2019-06-10T13:01:40+00:00","modified_at":"2019-06-10T13:01:40+00:00","word_count":6923,"reading_time_seconds":2077,"summary":"Accueil / Cluster Raspberry Pi Une utilisation courante des ordinateurs Raspberry Pi consiste à créer des grappes. Les tartes aux framboises sont petites et peu coûteuses; il est donc plus facile de les utiliser pour créer un cluster que ce ne serait le cas avec les PC. Une grappe de tartes aux framboises devrait être [&hellip;]","summary_points":["Accueil / Cluster Raspberry Pi\n\nUne utilisation courante des ordinateurs Raspberry Pi consiste à créer des grappes.","Les tartes aux framboises sont petites et peu coûteuses; il est donc plus facile de les utiliser pour créer un cluster que ce ne serait le cas avec les PC.","Une grappe de tartes aux framboises devrait être assez grosse pour concurrencer un seul PC; vous aurez probablement besoin d&#39;environ 20 Pies pour produire un cluster avec autant de puissance de calcul qu&#39;un PC.","Même si un cluster Pi n&#39;est peut-être pas aussi puissant, c&#39;est une excellente opportunité pour en apprendre davantage sur l&#39;informatique distribuée."],"topics":["Serveur d'impression"],"entities":[],"entities_metadata":[{"id":10,"name":"Serveur d'impression","slug":"serveur-dimpression","taxonomy":"category","count":3907,"url":"https://tutos-gameserver.fr/category/serveur-dimpression/"}],"tags":["Serveur d'impression"],"content_hash":"59403fb98dd0fd3310a3d556d525b284","plain_text":"Accueil / Cluster Raspberry Pi\n\nUne utilisation courante des ordinateurs Raspberry Pi consiste à créer des grappes. Les tartes aux framboises sont petites et peu coûteuses; il est donc plus facile de les utiliser pour créer un cluster que ce ne serait le cas avec les PC. Une grappe de tartes aux framboises devrait être assez grosse pour concurrencer un seul PC; vous aurez probablement besoin d&#39;environ 20 Pies pour produire un cluster avec autant de puissance de calcul qu&#39;un PC. Même si un cluster Pi n&#39;est peut-être pas aussi puissant, c&#39;est une excellente opportunité pour en apprendre davantage sur l&#39;informatique distribuée.\nIl existe différents types d’ordinateurs distribués qui peuvent être utilisés à des fins différentes. Il existe des super-ordinateurs utilisés pour résoudre des problèmes mathématiques tels que la modélisation des conditions météorologiques ou la simulation de réactions chimiques. Ces systèmes utilisent souvent l&#39;interface MPI (Message Passing Interface). Une équipe de l’Université de Southampton a construit un superordinateur basé sur MPI à 64 nœuds. Ce système est utilisé pour enseigner aux élèves la superinformatique.\nHadoop est une autre technologie souvent utilisée dans l&#39;informatique distribuée. Elle permet de distribuer des données sur plusieurs nœuds. Hadoop est souvent utilisé pour le traitement de grands ensembles de données et l&#39;exploration de données. Un ingénieur chez Nvidia a construit un petit cluster Hadoop en utilisant des tartes aux framboises. Il utilise son cluster pour expérimenter et tester des idées avant de les déployer sur des systèmes plus puissants.\nUtilisation d&#39;un cluster Raspberry Pi en tant que serveur Web\nLes clusters peuvent être utilisés comme serveurs Web. De nombreux sites Web génèrent trop de trafic pour s&#39;exécuter sur un seul serveur, de sorte que plusieurs serveurs doivent être utilisés. Les demandes des navigateurs Web sont reçues par un nœud appelé équilibreur de charge, qui transmet les demandes aux serveurs de travail. L&#39;équilibreur de charge transmet ensuite les réponses des serveurs aux clients.\nCe site est maintenant hébergé sur un cluster Raspberry Pi. Les nœuds de travail sont des serveurs Web standard ayant un contenu identique. Je viens d&#39;installer Apache sur eux et de copier mon site sur chaque nœud.\nJ&#39;utilise un Raspberry Pi supplémentaire pour héberger une copie de développement de ce site et pour contrôler le cluster. Ce Pi est connecté à mon réseau local via wifi, afin que je puisse accéder à la copie de développement de mon site depuis mon ordinateur portable.  \nLe Pi supplémentaire dispose également d’une connexion Ethernet au cluster Pi. Lorsque je souhaite mettre à jour mon site, je peux transférer les modifications du site de développement vers le site actif du cluster. Les mises à jour du site sont placées dans des fichiers .tar.gz que les nœuds de travail téléchargent automatiquement à partir du site de développement. Une fois téléchargées, les mises à jour sont ensuite décompressées dans le système de fichiers local. \nConfiguration des serveurs Raspberry Pi\nToutes les tartes dans ce système sont sans tête. Je peux me connecter au Pi avec le site de développement en utilisant le protocole Remote Desktop, et à partir de ce Pi, je peux me connecter aux travailleurs Pies en utilisant SSH.\nTous les Pies du cluster utilisent une adresse IP statique. Dans un cluster plus grand, il serait probablement préférable de configurer un serveur DHCP sur l&#39;équilibreur de charge. Les adresses IP utilisées dans le cluster se trouvent sur le sous-réseau 192.168.1.xxx.\nPour chaque travailleur Pi, j&#39;ai configuré une carte SD de 4 Go en utilisant la dernière version de Raspbian. Dans raspi-config, je définis les options suivantes:\n\ndévelopper fs\ndéfinir le nom d&#39;hôte\ndéfinir le mot de passe\ndéfinir la mémoire partagée à 16 Mo pour le GPU\noverclocker le processeur à 800 MHz\nactiver ssh\n\nSur chaque carte, j&#39;ai installé Apache et certaines bibliothèques requises par mon CMS, libxml2 et python-libxml2. J&#39;ai utilisé cette commande pour activer le mod rewrite, qui est également requis par mon CMS:\n$ sudo a2enmod rewrite\n\nEnfin, j&#39;ai copié sur chaque carte SD des scripts qui permettent à chaque Pi de synchroniser son contenu avec le développement Pi. Dans un cluster plus grand, il serait intéressant de créer une image de carte SD avec toutes ces modifications effectuées à l’avance.\nConstruire un équilibreur de charge\nL&#39;équilibreur de charge doit avoir deux interfaces réseau, une pour recevoir les demandes d&#39;un routeur et une autre interface réseau pour transmettre les demandes au cluster de serveurs. Les nœuds du cluster se trouvent sur un sous-réseau différent du reste du réseau. L&#39;adresse IP de la deuxième interface de l&#39;équilibreur de charge doit donc se trouver sur le même sous-réseau que le reste du cluster. La première interface de l&#39;équilibreur de charge a l&#39;adresse IP 192.168.0.3, tandis que l&#39;adresse IP de la deuxième interface est 192.168.1.1. Tous les Pies du cluster ont des adresses IP sur le sous-réseau 192.168.1.xxx.\nJ&#39;ai construit mon équilibreur de charge en utilisant un ancien PC doté de 512 Mo de RAM et d&#39;un processeur x86 à 2,7 GHz. J&#39;ai ajouté une deuxième carte Ethernet PCI et installé Lubuntu, une version allégée d&#39;Ubuntu. J&#39;allais installer Ubuntu, mais ce PC est assez ancien, donc Lubuntu est probablement un meilleur choix. J&#39;ai utilisé un PC parce que je ne savais pas si un seul Pi serait assez puissant pour jouer le rôle d&#39;équilibreur de charge, et un Pi ne dispose que d&#39;une seule connexion Ethernet. Je souhaite que les deux connexions réseau de mon équilibreur de charge soient Ethernet afin d&#39;améliorer les performances et la stabilité.\nNotez que le transfert IP n&#39;est pas activé. L&#39;équilibreur de charge n&#39;est pas un routeur, il ne doit transmettre que les requêtes HTTP et pas tous les paquets IP qu&#39;il reçoit. \nConfiguration du logiciel d&#39;équilibrage de charge\nIl existe de nombreuses implémentations logicielles d&#39;équilibrage de charge. J&#39;ai utilisé le module d&#39;équilibrage de charge d&#39;Apache car il est facile à configurer. Tout d&#39;abord, je me suis assuré que le système d&#39;exploitation de mon PC était à jour:\nsudo apt-get updatesudo apt-get upgrade\n\nPuis j&#39;ai installé Apache:\nsudo apt-get install apache2\n\nCes modules Apache doivent être activés:\nproxy sudo a2enmodsudo a2enmod proxy_httpsudo a2enmod proxy_balancer\n\nL&#39;étape suivante consiste à modifier / etc / apache2 / sites-available / default afin de configurer l&#39;équilibreur de charge. Le module proxy est nécessaire pour le transfert HTTP, mais il est préférable de ne pas permettre à votre serveur de se comporter comme un proxy. Les spammeurs et les pirates informatiques utilisent souvent les serveurs proxy d&#39;autres personnes pour masquer leur adresse IP. Il est donc important de désactiver cette fonctionnalité en ajoutant cette ligne:\n\tProxyRequests off\n\nBien que les demandes de proxy soient désactivées, le module de proxy est toujours activé et agit en tant que proxy inverse. Ensuite, définissez le cluster et ses membres en ajoutant ce code:\n\n\n\t\n\n\t\t\n\n\t\t\n\n\t\t\n\n\t\tBalancerMember http://192.168.1.2:80\nBalancerMember http://192.168.1.3:80\nBalancerMember http://192.168.1.4:80\nBalancerMember http://192.168.1.5:80\n\nAllowOverride None\nOrdre permettre, refuser\npermettre à tous\n\nProxySet lbmethod = byrequests\n\t\n\n\nInterface du gestionnaire d&#39;équilibrage\nLe module d&#39;équilibrage dispose d&#39;une interface Web permettant de surveiller l&#39;état des serveurs principaux et de configurer leurs paramètres. Vous pouvez activer l&#39;interface Web en ajoutant ce code à / etc / apache2 / sites-available / default:\n\n\n\t\n\t\t\n\t\t\n\t\t\n\t\tSetHandler balancer-manager\n\nOrdre permettre, refuser\nautoriser à partir de 192.168.0\n\t\n\n\nIl est également nécessaire de demander à Apache de gérer localement les demandes adressées à la page / balancer-manager au lieu de les transférer à un serveur de travail. Toutes les autres demandes sont transférées au cluster défini ci-dessus.\n\n\n\t\n\t\n\t\n\tProxyPass / balancer-manager!\nProxyPass / balancer: // rpicluster /\n\n\nUne fois ces modifications enregistrées, Apache doit être redémarré avec cette commande:\n$ sudo /etc/init.d/apache2 restart\n\nlorsque j&#39;ouvre un navigateur et que je visite http://192.168.0.3, je vois la page d&#39;accueil de mon site Web. Si je vais à http://192.168.0.3/balancer-manager, je vois cette page dans l&#39;image à droite.\nLa dernière étape pour mettre le cluster en ligne consiste à ajuster les paramètres de redirection de port dans mon routeur. Je devais juste configurer une règle pour transférer les paquets HTTP vers http://192.168.0.3.\nVoici l&#39;intégralité de / etc / apache2 / sites-available / default pour l&#39;équilibreur de charge:\n\n\n\n\n\t\n\t\n\t\n\tWebmaster ServerAdmin @ localhost\n\nDocumentRoot / var / www\n\t\n\t\tOptions FollowSymLinks\nAllowOverride All\n\t\n\t\n\t\t\n\t\t\n\t\t\n\t\tOptions Index FollowSymLinks MultiViews\nAllowOverride All\nOrdre permettre, refuser\npermettre à tous\n\t\n\n\tScriptAlias ​​/ cgi-bin / / usr / lib / cgi-bin /\n\t\n\t\tAllowOverride None\nOptions + ExecCGI -MultiViews + SymLinksIfOwnerMatch\n                AddHandler cgi-script .py\nOrdre permettre, refuser\nAutoriser de tous\n\t\n\n        ProxyRequests Off\n        \n\n                BalancerMember http://192.168.1.2:80\n                BalancerMember http://192.168.1.3:80\n                BalancerMember http://192.168.1.4:80\n                BalancerMember http://192.168.1.5:80\n\n                AllowOverride None\n                Ordre permettre, refuser\n                permettre à tous\n\n                ProxySet lbmethod = byrequests\n        \n\n        \n                \n                \n                \n                SetHandler balancer-manager\n\n                Ordre permettre, refuser\n                autoriser à partir de 192.168.0\n        \n\n        ProxyPass / balancer-manager!\n        ProxyPass / balancer: // rpicluster /\n\nErrorLog $ APACHE_LOG_DIR /error.log\n\n# Les valeurs possibles incluent: debug, info, notice, avertir, erreur, crit,\n# alerte, émergent.\nLogLevel avertir\n\nCustomLog $ APACHE_LOG_DIR /access.log combiné\n\n\n\n\ncommentaires\n\nMaintenant que j&#39;ai construit un simple cluster de serveurs Raspberry Pi, il serait intéressant de voir combien de trafic il peut gérer par rapport à un seul Pi. Il existe de nombreux outils d&#39;analyse comparative de serveur disponibles. Je vais utiliser le siège.  \nUtiliser Siege pour tester les temps de réponse du serveur\nSiege est un programme qui peut être utilisé pour envoyer un grand nombre de demandes à un serveur Web. L’utilisation de la commande suivante enverra des requêtes HTTP à un serveur de mon réseau local:\nsiège -d10 -c10 -t1m http://192.168.0.10/spec.html\n\nL&#39;option -c spécifie qu&#39;il doit y avoir 10 utilisateurs simultanés à la fois. L&#39;option -d spécifie le délai maximum entre les demandes. Le délai réel est aléatoire, mais le sera dans le délai utilisé avec l&#39;option -d. L&#39;option -t indique au siège combien de temps le test devrait durer &#8211; 1 minute dans ce cas.\nDans chacun des tests que j&#39;ai effectués, j&#39;ai utilisé un délai maximum de 10 secondes et une durée totale de test de 1 minute. Tous les tests utilisaient le siège pour faire des demandes sur mon réseau local, pas via Internet.\nTest de l&#39;équilibreur de charge avec un seul Raspberry Pi\nJe voulais voir comment un seul Raspberry Pi gère le trafic avec et sans l&#39;équilibreur de charge. Je soupçonnais que l&#39;équilibreur de charge introduirait un léger retard, mais en réalité, un seul Pi semble fonctionner plus efficacement lorsqu&#39;il est derrière un équilibreur de charge. Il semble que les demandes soient mises en mémoire tampon avant d’atteindre le Pi. Ce graphique montre les temps de réponse moyens pour différents nombres d&#39;utilisateurs simultanés, avec et sans l&#39;équilibreur de charge:\nVoir comment les performances s&#39;améliorent avec plus de nœuds\nLe test suivant que j&#39;ai effectué a consisté à vérifier l&#39;évolution des performances en fonction de l&#39;ajout de nœuds au cluster. J&#39;ai effectué des tests avec un nombre variable d&#39;utilisateurs simultanés, mais pour des raisons de simplicité, je ne montrerai que les résultats des tests effectués avec 10 utilisateurs simultanés.\nCe graphique indique les temps de réponse maximum et minimum moyens pour un nombre croissant de noeuds de travail:\nComme vous pouvez le constater, le temps de réponse minimum ne s’améliore pas réellement car plusieurs nœuds sont ajoutés, ce qui est logique. Le temps de réponse minimum est aussi rapide que l&#39;un des nœuds du cluster, et l&#39;ajout de nœuds ne changera rien. \nLe temps de réponse maximal s&#39;est considérablement amélioré avec l&#39;ajout de nouveaux noeuds. L&#39;utilisation d&#39;un cluster a nettement augmenté la capacité de mon serveur.  \n    En savoir plus sur le siège.\ncommentaires\n\n\nDans mon dernier article sur les performances des grappes, je trouvais qu&#39;une grappe fonctionnait mieux qu&#39;un simple Pi, mais il restait encore beaucoup à faire. J&#39;ai modifié les fichiers de configuration d&#39;Apache et modifié le mode de fonctionnement de la mise en cache des pages dans mon CMS.\nDéplacer le cache de la page\nLe CMS que j&#39;ai écrit peut générer des pages de manière dynamique et peut mettre en cache des pages afin qu&#39;elles puissent être servies instantanément sans être assemblées. Seules les pages composées de HTML statique peuvent être mises en cache. Les pages contenant du contenu dynamique généré par des scripts exécutables ne sont pas mises en cache.\nLe cache de pages se trouvait dans / usr / share / cms / cache. L&#39;interpréteur Python devait être chargé pour servir les pages en cache à partir de / usr / share / cms / cache. Désormais, le répertoire racine du cache de pages est / var / www. Apache peut donc servir les pages en cache sans appeler Python pour exécuter le script CMS.  \nUn inconvénient est que le CMS ne peut plus compter le trafic de piste. Lorsque le CMS s&#39;exécutait chaque fois qu&#39;une page était demandée, une fonction était appelée pour incrémenter un nombre dans un fichier de données. Cela ne fonctionne pas maintenant que les pages peuvent être servies sans l&#39;exécution du CMS.\nDécharger les modules inutilisés\nL&#39;un des meilleurs moyens d&#39;améliorer les performances d&#39;Apache consiste à décharger des modules inutiles. Tout d&#39;abord, vous devez répertorier tous les modules actuellement chargés à l&#39;aide de cette commande:\napache2ctl -M\n\nIl peut être difficile de déterminer quels modules sont utilisés. Cela dépend vraiment des directives utilisées dans les fichiers .htaccess et les fichiers hôtes virtuels. Par exemple, si vous désactivez authz_host_module, les directives Allow, Order et Deny ne fonctionneront pas. Chaque fois que vous désactivez un module, redémarrez Apache avec les commandes suivantes: \n\n\n\n\n\n$ sudo service apache2 stop\n$ sudo service apache2 start\n\n\nVous pouvez utiliser &#39;redémarrer&#39; au lieu de &#39;démarrer&#39; et &#39;arrêter&#39;, mais certaines variables nécessitent l&#39;arrêt d&#39;Apache avant de pouvoir être mises à jour. Il est judicieux de tester votre site avant de désactiver d&#39;autres modules. J&#39;ai désactivé ces modules:\n\n\n\n\n\n$ sudo a2dismod autoindex\n$ sudo a2dismod auth_basic\nstatut sudo a2dismod\n$ sudo a2dismod dégonfler\n$ sudo a2dismod ssl\n$ sudo a2dismod authz_default\n\n\nSi vous trouvez qu&#39;un module est requis, vous pouvez le réactiver avec la commande a2enmod comme ceci:\n$ sudo a2enmod authz_host\n\nRéduire le délai d&#39;attente\nJe règle le délai d&#39;attente dans /etc/apache2/apache2.conf sur 30. Cela évite que des requêtes simultanées n&#39;occupent de la mémoire pendant de longues périodes et réduise l&#39;utilisation de la mémoire.\nAjuster les processus Apache\nApache a plusieurs modèles de multitraitement différents. Ils utilisent chacun un nombre de processus serveur et de fils enfants pour gérer les requêtes HTTP.\nMPM worker est la configuration la plus moderne. MPM prefork était auparavant la norme, mais MPM Worker offre de meilleures performances et une meilleure utilisation de la mémoire. Utilisez cette commande pour vérifier le mode dans lequel se trouve Apache: \n$ sudo apache2 -V\n\nUne partie de la sortie ressemblera à ceci:\n\n\n\n\n\nServeur MPM: Travailleur\n  fileté: oui (nombre de threads fixe)\n    forké: oui (nombre de processus variable)\n\n\nVoici les paramètres par défaut pour MPM Worker:\n\n\n\n    \n    \n    \n    StartServers 5\n    MinSpareThreads 25\n    MaxSpareThreads 75\n    ThreadLimit 64\n    ThreadsPerChild 25\n    MaxClients 150\n    MaxRequestsPerChild 0\n\n\n\nLa taille des processus Apache varie en fonction du contenu servi et des scripts éventuellement en cours d&#39;exécution. Cette commande indique le nombre de processus Apache et leur taille:\nps aux | grep &#39;apache2&#39;\n\nLa 6ème colonne contient la quantité de mémoire utilisée par chaque processus. En divisant la quantité de mémoire de secours par la taille du processus Apache moyen, vous obtenez une indication approximative du nombre maximal de processus serveur que vous pouvez exécuter. Chaque Pi de mon cluster a environ 280 Mo de RAM libre, et la taille moyenne des processus Apache est d’environ 7 Mo. 280 divisé par 7 donne 40. \nStartServers est le nombre de threads de serveur créés par Apache au démarrage. La création de nouveaux processus de serveur peut prendre beaucoup de temps. Je souhaite donc qu&#39;Apache démarre beaucoup de processus de serveur au démarrage. Cela signifie qu&#39;il n&#39;aura pas à passer du temps à créer plus de processus alors qu&#39;il est occupé à traiter beaucoup de trafic. J&#39;ai mis StartServers à 40.  \nJe ne veux pas qu&#39;Apache puisse créer trop de processus, car mon Pi risque de manquer de mémoire, j&#39;ai donc défini ServerLimit sur 40.\nChaque processus serveur peut avoir un nombre variable de threads. Ce sont les threads qui traitent réellement les demandes. J&#39;ai fixé le nombre de threads par enfant à 8 par défaut. Je n&#39;ai pas calculé cela, j&#39;ai simplement essayé plusieurs nombres et effectué de nombreux tests avec siege jusqu&#39;à ce que je trouve la valeur optimale.\nLe nombre total de threads est le nombre de processus serveur multiplié par ThreadsPerChild, ce qui correspond à 320 avec mes paramètres. J&#39;ai défini MaxClients sur 320 pour empêcher Apache de créer des threads supplémentaires.\nCes paramètres obligeront Apache à créer de nombreux processus et threads qui ne seront pas utilisés immédiatement. Afin d&#39;empêcher Apache de les supprimer, j&#39;ai défini MaxSpareThreads sur 320.\nMaxRequestsPerChild est le nombre de demandes qu&#39;un processus doit gérer avant d&#39;être tué et qu&#39;un processus de remplacement ne soit démarré. Ceci est fait pour empêcher les fuites de mémoire d&#39;accumuler de grandes quantités de mémoire. Il doit être défini sur le nombre de hits qu&#39;un serveur reçoit par jour afin que les processus soient redémarrés une fois par jour.  \nLes paramètres de MPM Worker sont maintenant\n\n\n\n    \n    \n    \n    StartServers 40\n    ServerLimit 40\n    MinSpareThreads 25\n    MaxSpareThreads 320\n    ThreadLimit 64\n    ThreadsPerChild 8\n    MaxClients 320\n    MaxRequestsPerChild 2000\n\n\n\nAvant de modifier le système de mise en cache, un test de siège avec seulement 25 utilisateurs simultanés a permis d&#39;obtenir les résultats suivants:\n\n\n\n\n\nLever le siège du serveur ... c&#39;est fait.\nTransactions: 30 hits\nDisponibilité: 100.00%\nTemps écoulé: 59.79 secondes\nDonnées transférées: 0,08 Mo\nTemps de réponse: 26.07 secondes\nTaux de transaction: 0.50 trans / sec\nDébit: 0.00 Mo / sec\nAccès simultané: 13.08\nTransactions réussies: 30\nTransactions échouées: 0\nLa plus longue transaction: 29.32\nOpération la plus courte: 14.03\n\n\nAprès avoir amélioré le système de mise en cache, j&#39;ai testé un seul nœud avec 200 utilisateurs simultanés à l&#39;aide de cette commande:\n$ siege -d1 -c200 -t1m http://192.168.0.4/specs.html\n\nLes résultats ont été\n\n\n\n\n\nLever le siège du serveur ... c&#39;est fait.\nTransactions: 6492 hits\nDisponibilité: 100.00%\nTemps écoulé: 59.28 secondes\nDonnées transférées: 38,86 MB\nTemps de réponse: 1,29 secondes\nTaux de transaction: 109,51 trans / s\nDébit: 0.66 Mo / sec\nAccès simultané: 141,10\nTransactions réussies: 6492\nTransactions échouées: 0\nLa transaction la plus longue: 11.23\nOpération la plus courte: 0,32\n\n\nAprès avoir redémarré Apache avec les modifications de configuration et exécuté à nouveau le même test, j&#39;ai obtenu les résultats suivants:\n\n\n\n\n\nLever le siège du serveur ... c&#39;est fait.\nTransactions: 6449 visites\nDisponibilité: 100.00%\nTemps écoulé: 59.53 secondes\nDonnées transférées: 38,60 MB\nTemps de réponse: 1,31 seconde\nTaux de transaction: 108.33 trans / sec\nDébit: 0.65 MB / sec\nAccès simultané: 142.32\nTransactions réussies: 6449\nTransactions échouées: 0\nLa transaction la plus longue: 4.16\nOpération la plus courte: 0.01\n\n\nAprès avoir optimisé la mise en cache des pages, supprimé les modules inutilisés d’Apache et optimisé le processus du serveur, le nombre de transactions par seconde pour un seul nœud est passé de 0,5 à plus de cent. Le nombre de demandes de connexion pouvant être traitées a été multiplié par 8.\nLe réglage des processus Apache a entraîné une très légère diminution du nombre de transactions par seconde, mais le temps de transaction le plus long a considérablement diminué.\nTester l&#39;ensemble du cluster\nUne fois satisfait de mes nouveaux paramètres, je les ai transférés dans l&#39;ensemble du cluster. J&#39;ai fait plus de tests avec siege, d&#39;abord avec 200 utilisateurs simultanés:\n\n\n\n\n\nLever le siège du serveur ... c&#39;est fait.\nTransactions: 23218 hits\nDisponibilité: 100.00%\nTemps écoulé: 59.26 secondes\nDonnées transférées: 48,44 Mo\nTemps de réponse: 0.01 sec\nTaux de transaction: 391.80 trans / s\nDébit: 0.82 Mo / sec\nAccès simultané: 3,90\nTransactions réussies: 23218\nTransactions échouées: 0\nLa transaction la plus longue: 0,66\nLa transaction la plus courte: 0.00\n\n\n&#8230; et ensuite avec 800 utilisateurs simultanés:\n\n\n\n\n\nLever le siège du serveur ... c&#39;est fait.\nTransactions: 56899 visites\nDisponibilité: 100.00%\nTemps écoulé: 60.05 secondes\nDonnées transférées: 118,59 Mo\nTemps de réponse: 0.34 sec\nTaux de transaction: 947,53 trans / s\nDébit: 1,97 Mo / sec\nAccès simultané: 317.44\nTransactions réussies: 56899\nTransactions échouées: 0\nLa transaction la plus longue: 9.71\nLa transaction la plus courte: 0.00\n\n\nAvant de paramétrer Apache, le cluster pouvait gérer 350 demandes simultanées et le taux de transaction maximal était de 460 transactions par seconde. Le nombre maximal d&#39;utilisateurs simultanés avec un taux de réussite de 100% est désormais de 800. Le nombre maximal de transactions par seconde est maintenant de 947.\nJe surveillerai attentivement la quantité de mémoire disponible au cours des prochains jours. Si le niveau commence à devenir trop bas, je vais réduire certains de ces paramètres.\nL&#39;utilisation du siège n&#39;est pas complètement réaliste. Une demande émanant d&#39;un navigateur impose au serveur une charge beaucoup plus importante qu&#39;une demande émanant d&#39;un siège, et la synchronisation des tests en état de siège diffère de celle du trafic réel. Les tests effectués en utilisant le siège ne prédisent pas le nombre de requêtes qu&#39;un serveur peut gérer. Des tests comme ceux-ci fournissent une base de comparaison des différentes configurations de serveur. Je ne pense pas que mon cluster puisse gérer 947 visiteurs réels par seconde, mais je suis convaincu que les performances de mon serveur sont meilleures que celles enregistrées auparavant.\ncommentaires\n\nLes temps de chargement des pages sont importants pour une bonne expérience utilisateur. Les gens sont plus impliqués avec les sites qui se chargent rapidement et visitent généralement plus de pages.\nPour que les pages se chargent rapidement, il ne suffit pas de rendre les serveurs Web plus rapides. Lorsque les navigateurs chargent des pages, ils doivent d’abord la télécharger à partir d’un serveur Web. Si la page fait référence à d&#39;autres fichiers, tels que CSS, Javascript et images, le navigateur doit également récupérer ces fichiers. Une fois que tous les fichiers ont été téléchargés, le navigateur doit rendre la page. Les pages peuvent être optimisées pour que les navigateurs puissent les charger rapidement et efficacement.\nCe type d’optimisation ne concerne pas le réglage du serveur, mais l’optimisation des pages de votre site afin que les navigateurs puissent les charger facilement. Cela implique de passer du temps à ajuster le modèle HTML d&#39;un site.\nGoogle PageSpeed ​​Insights est un bon endroit pour trouver des idées sur la façon d&#39;optimiser votre site. Vous pouvez utiliser PageSpeed ​​Insights pour analyser les pages d&#39;un site et déterminer des moyens d&#39;améliorer les temps de chargement des pages. PageSpeed ​​Insights donne des suggestions détaillées sur la manière d&#39;améliorer les performances. Un score de classement des pages est attribué à votre site, ce qui s’améliore à mesure que vous parcourez la liste des problèmes.\nCSS en ligne\nJ&#39;avais l&#39;habitude de garder le code CSS pour mon site dans un fichier séparé dans /var/www/default_theme.css. Il a été référencé dans la section head de mon modèle HTML avec cette ligne:\n\n\n\n\n\nLorsque les navigateurs chargeaient les pages de mon site, ceux-ci ne pouvaient plus afficher cette page tant qu&#39;ils n&#39;avaient pas fait une nouvelle demande à mon serveur et téléchargé le fichier CSS. J&#39;ai éliminé ce délai en incluant le code CSS directement dans la section head de mon modèle HTML. J&#39;ai ajouté les balises suivantes à la section d&#39;en-tête de mon modèle, puis ai collé le contenu de mon fichier CSS entre elles:\n\n\n\n\n\nCela agrandit chaque page Web, mais réduit le nombre de demandes que mon serveur doit traiter. Cela signifie également que les navigateurs peuvent rendre la page plus efficacement.\nJavascript différé Chargement\nIl est assez courant de référencer les fichiers source javascript dans la section head d&#39;une page Web. J&#39;avais l&#39;habitude d&#39;avoir la balise suivante dans la tête de mon site afin que les images puissent être visionnées à l&#39;aide du plugin Javascript Lightbox:\n\n\n\n\n\nLe problème, c&#39;est que lorsqu&#39;une page est téléchargée, le navigateur doit suspendre le traitement de la page pour télécharger le fichier Javascript. Cela interrompt le navigateur avant qu&#39;il puisse commencer à afficher la page.\nLa solution consiste à déplacer les références aux fichiers Javascript &quot;en dessous du pli&quot;. J&#39;ai mis à jour mon modèle HTML pour inclure cette ligne juste après le pied de page plutôt que dans la section head. Lorsque les pages de mon site sont chargées dans un navigateur, la plupart des pages sont rendues avant que le navigateur ne doive obtenir le fichier Javascript.\nBoutons de partage Javascript asynchrones\nLes boutons de partage sont un excellent moyen d&#39;augmenter le trafic sur votre site. Les visiteurs cliquent sur les boutons de partage pour partager votre site avec leurs amis et leurs abonnés sur les réseaux sociaux, augmentant ainsi le trafic généré par votre site à partir des réseaux sociaux. Il existe de nombreuses sociétés fournissant des plugins pouvant être ajoutés à un site. L&#39;inconvénient de certains plugins de partage est qu&#39;ils peuvent réduire la vitesse de chargement de la page en raison de problèmes liés à Javascript.\nAu lieu d&#39;utiliser un seul plug-in pour afficher les boutons de partage, vous pouvez utiliser des boutons de différents sites. Chaque réseau social possède ses propres boutons de partage que vous pouvez utiliser pour mettre des boutons de partage sur votre site. La plupart d&#39;entre eux sont asynchrones (mais pas Reddit au moment de la rédaction). Les boutons asynchrones sont chargés après le rendu de la page, ce qui accélère son chargement.\nDepuis que j&#39;ai supprimé le plug-in de partage et que je l&#39;ai remplacé par des boutons de partage individuels, les temps de chargement des pages affichés dans Google Analytics sont devenus beaucoup plus cohérents et beaucoup plus courts.\nMinify CSS et Javascript\nLes fichiers CSS et Javascript contiennent souvent beaucoup d&#39;espaces, tels que des espaces et des caractères de nouvelle ligne. L&#39;utilisation d&#39;espaces permet de rendre le code plus lisible, mais ajoute également à la taille des fichiers. La suppression de caractères blancs rend le code illisible, mais peut considérablement réduire la charge de votre serveur. J&#39;ai décidé de ne pas minifier mon code CSS car je veux pouvoir le lire, mais j&#39;ai supprimé beaucoup d&#39;espaces, tout en préservant un formatage de base. Voici à quoi ressemblait mon code CSS:\n\n\n\n\n\n.navbar li\n\n    affichage: en ligne;\n    bordure gauche: noir 1px solide;\n    padding-left: 6px;\n\n\npremier\n\n    frontière gauche: aucune;\n\n\n.navbar li: premier enfant\n\n    bordure: aucune;\n\n\n\nVoici à quoi cela ressemble avec quelques espaces blancs supprimés:\n\n\n\n\n\n.navbar li\n\n affichage: en ligne;\n bordure gauche: noir 1px solide;\n padding-left: 6px;\n\npremier\n\n frontière gauche: aucune;\n\n.navbar li: premier enfant\n\n bordure: aucune;\n\n\n\nLe code Javascript peut également être minifié. Je n&#39;ai pas l&#39;intention de modifier le code Javascript, je l&#39;ai donc complètement minifié. Il existe deux fichiers JavaScript que les navigateurs téléchargent sur mon site chaque fois qu&#39;ils chargent une page, /js/lightbox.js, pour afficher des images, et /js/jquery-1.7.2.min.js. Le fichier jQuery est déjà minifié.\nLe code de la visionneuse n’est pas minifié par défaut, je suis donc allé à cet outil de minifier Javascipt et\na collé le code de lightbox.js dans la zone de saisie et a appuyé sur le bouton d&#39;envoi. J&#39;ai créé un nouveau fichier dans / var / www / js appelé lightbox.min.js et ai collé la sortie de l&#39;outil Minifier dans le fichier. J&#39;ai modifié le modèle HTML de mon site afin de référencer ce nouveau fichier au lieu de la version non modifiée d&#39;origine. La version non décomposée de ce fichier était de 11,6 Ko et la version agrandie de 6,2 Ko.\nTirer parti de la mise en cache du navigateur\nLes navigateurs Web peuvent mettre en cache les pages de sorte qu&#39;elles ne doivent plus être téléchargées si un utilisateur revient à une page déjà visitée. Vous pouvez indiquer aux navigateurs de mettre en cache des pages en envoyant un en-tête de contrôle avant que la page soit envoyée par le serveur. Cela nécessite quelques modifications à la configuration d&#39;Apache. Tout d&#39;abord, le module d&#39;en-têtes doit être installé:\n\n\n\n\n\n$ sudo a2enmod headers\n\n\nEnsuite, le code suivant doit être collé quelque part dans /etc/apache2/apache2.conf:\n\n\n\n\n\n\nEnsemble d&#39;en-têtes Cache-control &quot;public, max-age = 2592000&quot;\n\n\n\n\n\n\nEnsemble d&#39;en-têtes Cache-control &quot;public, max-age = 604800&quot;\n\n\n\nCela indique à Apache que tout fichier avec une terminaison .ico, .png, .gif, .jpg ou .js doit être mis en cache pendant 2592000 secondes (30 jours) et les fichiers avec une fin .html doivent être mis en cache pendant 604800 secondes (7 jours). . La dernière étape consiste à redémarrer Apache:\n\n\n\n\n\n$ sudo service apache2 restart\n\n\nJ&#39;ai exécuté cette commande sur un autre ordinateur pour m&#39;assurer que la mise en cache fonctionnait correctement:\n\n\n\n\n\n$ wget --save-headers http://raspberrywebserver.com/feed-icon-14x14.png\n\n\nLorsque j&#39;ai ouvert le fichier téléchargé dans un éditeur de texte, ces en-têtes HTTP se trouvaient en haut:\n\n\n\n\n\nHTTP / 1.1 200 OK\nDate: dim. 13 oct. 2013 à 01:24:25 GMT\nServeur: Apache / 2.2.22 (Debian)\nDernière mise à jour: mar. 01 oct 2013 à 03:40:50 GMT\nETag: &quot;226f0-2b1-4e7a5b80cb907&quot;\nAccept-Ranges: octets\nLongueur du contenu: 689\nCache-control: public, max-age = 259200\nKeep-Alive: délai d&#39;attente = 5, max = 100\nConnexion: Keep-Alive\nType de contenu: image / png\n\n\nL&#39;en-tête de contrôle du cache est maintenant visible parmi les autres en-têtes HTTP.\nAffichage de la synchronisation des pages Google Analytics\nLa capture d&#39;écran de Google Analytics à droite montre comment les temps de chargement des pages se sont améliorés. Les temps de chargement des pages ont beaucoup fluctué lorsque j&#39;utilisais un plug-in de partage, mais se sont stabilisés dès que je m&#39;en suis débarrassé le 10 octobre. Au cours des prochains jours, le temps de chargement de la page a été réduit encore plus à mesure que je minifiais CSS et Javascript.\ncommentaires\n\nMon cluster de serveurs Raspberry Pi fonctionne depuis trois mois et dessert maintenant 45 000 pages vues par mois. La quantité de trafic\natteindre mon site est en augmentation constante et il existe parfois de fortes pics de trafic sur les sites de réseaux sociaux.  \nAu fur et à mesure que la charge sur le serveur augmente, il est important de vous assurer qu&#39;elle dispose de suffisamment de capacité. J&#39;ai donc décidé d&#39;augmenter sa puissance de calcul en ajoutant quatre nœuds de serveur Raspberry Pi supplémentaires au cluster.  \nJ&#39;ai construit deux nouveaux racks, chacun contenant quatre serveurs Raspberry Pi. J&#39;ai connecté en série deux commutateurs Ethernet, avec quatre serveurs Pi connectés à chaque commutateur.  \nJ&#39;ai cloné une carte SD à partir de l&#39;un des nœuds Pi et mis en place quatre cartes SD presque identiques. La seule différence entre eux est l&#39;adresse IP dans / etc / network / interfaces. J&#39;ai fait une sauvegarde de mon site à partir du tableau de bord de mon CMS et ai utilisé un script pour synchroniser le contenu de tous les nœuds de travail.\nL&#39;étape suivante consistait à modifier les paramètres de l&#39;équilibreur de charge pour pouvoir utiliser les nouveaux nœuds. Sur l&#39;équilibreur de charge, il fallait mettre à jour / etc / apache2 / sites-available / default pour inclure les nouveaux nœuds dans la déclaration de cluster:\n\n\n        \n\n                \n\n                \n\n                \n\n                BalancerMember http://192.168.1.2:80\n                BalancerMember http://192.168.1.3:80\n                BalancerMember http://192.168.1.4:80\n                BalancerMember http://192.168.1.5:80\n                BalancerMember http://192.168.1.6:80\n                BalancerMember http://192.168.1.7:80\n                BalancerMember http://192.168.1.8:80\n                BalancerMember http://192.168.1.9:80\n\n\n                AllowOverride None\n                Ordre permettre, refuser\n                permettre à tous\n\n                ProxySet lbmethod = byrequests\n        \n\n\nUne fois les modifications apportées, j&#39;ai exécuté cette commande pour les charger dans Apache:\n\n\n\n\n\n$ sudo /etc/init.d/apache2 reload\n\n\nCela indique à Apache de recharger ses fichiers de configuration sans redémarrer. Je suis allé à l&#39;interface du gestionnaire d&#39;équilibrage à l&#39;adresse 192.168.0.3/balancer-manager pour m&#39;assurer que les nouveaux nœuds avaient été ajoutés:\nEssai\nJ&#39;ai testé le nouveau cluster à huit Pi en utilisant les mêmes tests que lorsque je n&#39;utilisais que quatre serveurs Pi. D&#39;abord, j&#39;ai utilisé seige pour générer 200 demandes simultanées en une minute:\n\n\n\n\n\n$ siege -d1 -c200 -t1m http://192.168.0.3/specs.html\n\nLever le siège du serveur ... c&#39;est fait.\nTransactions: 23492 hits\nDisponibilité: 100.00%\nTemps écoulé: 59.81 secondes\nDonnées transférées: 48,93 Mo\nTemps de réponse: 0.01 sec\nTaux de transaction: 392,78 trans / s\nDébit: 0.82 Mo / sec\nAccès simultané: 3,81\nTransactions réussies: 23492\nTransactions échouées: 0\nLa transaction la plus longue: 0,63\nLa transaction la plus courte: 0.00\n\n\nLe résultat est très similaire à celui obtenu pour le même test sur le cluster avec seulement quatre nœuds (voir &#39;Test du cluster entier&#39;).\nAméliorer les performances du cluster en ajustant Apache).  \nEnsuite, j&#39;ai lancé le siège avec 800 demandes simultanées:\n\n\n\n\n\nLever le siège du serveur ... c&#39;est fait.\nTransactions: 76510 hits\nDisponibilité: 100.00%\nTemps écoulé: 59.76 secondes\nDonnées transférées: 159,39 MB\nTemps de réponse: 0,12 seconde\nTaux de transaction: 1280.29 trans / s\nDébit: 2,67 Mo / sec\nAccès simultané: 148.45\nTransactions réussies: 76510\nTransactions échouées: 0\nLa transaction la plus longue: 13.04\nLa transaction la plus courte: 0.00\n\n\nLe temps de transaction le plus long a augmenté, mais le débit et le nombre de transactions par seconde ont également augmenté.\nLes performances avec un faible nombre de demandes simultanées n&#39;ont pas vraiment changé, mais les performances se sont améliorées pour un nombre accru de demandes simultanées.\ndemandes. Cela est prévisible, car l&#39;ajout de nouveaux nœuds ne rend pas un cluster plus rapide, mais vise à augmenter la capacité du cluster.\nJ&#39;ai été surpris que le temps pour la plus longue transaction a augmenté. La plupart des demandes sont traitées en 20 ms ou moins, et malheureusement, le siège ne fonctionne pas\nenregistrer le temps de réponse moyen. \nLes tests avec Apache Bench, ab, montrent que le temps de transaction le plus long était de 5,111 secondes, mais que le temps moyen de transaction était de 0,214 seconde.\nL&#39;augmentation du temps de transaction le plus long ne signifie pas que la performance globale est pire, mais c&#39;est une source de préoccupation. Je me suis connecté à la charge\nl’équilibreur à l’aide de ssh et a relancé les tests sur mon cluster. J&#39;ai exécuté la commande uptime suivie de free sur l&#39;équilibreur de charge:\n\n\n\n\n\n$ disponibilité\n 13:30:04 up 1 day,  5:20,  1 user,  load average: 9.27, 3.52, 1.33\n$ free\n             total       used       free     shared    buffers     cached\nMem:        498268     487188      11080          0      37328     299752\n-/+ buffers/cache:     150108     348160\nSwap:       513020         20     513000\n\n\nThe load average figures for the load balancer are much higher than for the servers.  The load balancer only has 11MB of RAM left and has \nstarted to use swap.  When web servers start to use swap space, they slow down dramatically, so I need to look into the performance and memory \nusage of my load balancer.  Using siege to test with 800 concurrent users is testing for the worst case.  At the moment my site isn&#39;t getting \nthat much traffic, so the performance issues with the load balancer aren&#39;t an immediate problem, but it&#39;s something I need to look at.  \nI still don&#39;t know how much traffic this system can actually handle because serving real traffic is not the same as testing with siege. je fais\nknow that my server can handle at least 45,000 hits a month, and probably a lot more now that I have added more nodes.\ncommentaires\n\nEver since I built my cluster people have been asking me why I used Apache and not Nginx.  I started using Apache because I was just used to it.  People say it&#39;s slow and takes up too much memory, but I find that with a little tuning it can perform quite well.\nStill, Nginx does have a reputation for being fast.  I wanted to see which web server would be best for my cluster, so I installed Apache on one Pi and Nginx on another.  \nI used two Raspberry Pi model B servers, each with identical Sandisk 4GB class 4 SD cards.  In raspi-config, I overclocked each Pi to 800MHz, and allocated 16MB of memory to the GPU.  I used the same version of Raspbian (released on 2013-09-25) on both servers.  I used exactly the same test data and scripts on each Pi.\nFollow this link to see how I set up Nginx and uWSGI.\nI tuned Apache by removing modules and increasing the number of server processes.  These tuning techniques don&#39;t apply to Nginx.\nI tested each server with three different types of request: a static HTML file, a simple CGI script, and a complex CGI script.  The HTML file is a cached page in my Content Management System (the CMS doesn&#39;t need to execute for cached pages to be served, they can be served by Apache as normal HTML files).  The simple script just prints an HTTP header, prints &quot;Hello World!&quot; and exits.\nThe complex script used in these tests was the CMS that this site is built on.  I disabled page caching on both Pi servers, so that pages had to be generated dynamically by the CMS.  When a page is served, the CMS script has to parse two XML files to get meta data, read several snippets of HTML from the file system, and print them to a socket.\nRequests were generated with Apache Bench using a command like this:\n\n\n\n\n\nab -n 1000 -c 250 http://192.168.0.21/spec.html\n\n\nwhere 1000 is the number of requests to issue, and 250 is the number of concurrent users.  \nThe Raspberry Pi running Nginx had IP address 192.168.0.21, and the Pi running Apache had 192.168.0.22.  I tested each server over a range of concurrent users for each type of request.  \nStatic files\nStatic files are easy to serve, so I used a range of 50 to 250 concurrent users in these tests.  Apache handled 220 connections per second, while Nginx handled around 300 connections per second.\nNginx came out ahead on these tests.\nDynamic content tests\nSimple script\nIn these tests I used ab to request this URL: http://192.168.0.21/cgi-bin/hello.py.  I set the number of request to 100, and tested over a range of 10 to 50 concurrent users.\nApache handled 4.78 connections per second, and Nginx handled 4.65 connections per second, but the results showed that the mean transaction time was lower for Nginx than Apache, so Apache was slower in this test.  The difference was not very pronounced under a low load, but it increased as the load increased.\nComplex script\nThe URL used in these test was http://192.168.0.21/spec.html.  This test is the most CPU intensive so I used from 5 to 25 concurrent users in these tests.  \nUnder a low load, Apache&#39;s performance was slightly better than Nginx, but only by a very slim margin.  With 25 concurrent users, Apache was slower than Nginx.  The difference under a low load is negligible, but with 25 concurrent users, Nginx was noticeably faster than Apache.\nConclusions\nThere are many variables involved in server performance.  These tests don&#39;t definitively determine which server is &#39;better&#39;, they just helped me decide which one is best for my specific needs.\nMost of the pages on my site are static, and Nginx is faster when it comes to static pages.  It looks like Nginx is a better choice for me.  \ncommentaires\n\n\nClick to rate this post!\r\n                                   \r\n                               [Total: 0  Average: 0]","paragraphs":["Accueil / Cluster Raspberry Pi","Une utilisation courante des ordinateurs Raspberry Pi consiste à créer des grappes. Les tartes aux framboises sont petites et peu coûteuses; il est donc plus facile de les utiliser pour créer un cluster que ce ne serait le cas avec les PC. Une grappe de tartes aux framboises devrait être assez grosse pour concurrencer un seul PC; vous aurez probablement besoin d&#39;environ 20 Pies pour produire un cluster avec autant de puissance de calcul qu&#39;un PC. Même si un cluster Pi n&#39;est peut-être pas aussi puissant, c&#39;est une excellente opportunité pour en apprendre davantage sur l&#39;informatique distribuée.\nIl existe différents types d’ordinateurs distribués qui peuvent être utilisés à des fins différentes. Il existe des super-ordinateurs utilisés pour résoudre des problèmes mathématiques tels que la modélisation des conditions météorologiques ou la simulation de réactions chimiques. Ces systèmes utilisent souvent l&#39;interface MPI (Message Passing Interface). Une équipe de l’Université de Southampton a construit un superordinateur basé sur MPI à 64 nœuds. Ce système est utilisé pour enseigner aux élèves la superinformatique.\nHadoop est une autre technologie souvent utilisée dans l&#39;informatique distribuée. Elle permet de distribuer des données sur plusieurs nœuds. Hadoop est souvent utilisé pour le traitement de grands ensembles de données et l&#39;exploration de données. Un ingénieur chez Nvidia a construit un petit cluster Hadoop en utilisant des tartes aux framboises. Il utilise son cluster pour expérimenter et tester des idées avant de les déployer sur des systèmes plus puissants.\nUtilisation d&#39;un cluster Raspberry Pi en tant que serveur Web\nLes clusters peuvent être utilisés comme serveurs Web. De nombreux sites Web génèrent trop de trafic pour s&#39;exécuter sur un seul serveur, de sorte que plusieurs serveurs doivent être utilisés. Les demandes des navigateurs Web sont reçues par un nœud appelé équilibreur de charge, qui transmet les demandes aux serveurs de travail. L&#39;équilibreur de charge transmet ensuite les réponses des serveurs aux clients.\nCe site est maintenant hébergé sur un cluster Raspberry Pi. Les nœuds de travail sont des serveurs Web standard ayant un contenu identique. Je viens d&#39;installer Apache sur eux et de copier mon site sur chaque nœud.\nJ&#39;utilise un Raspberry Pi supplémentaire pour héberger une copie de développement de ce site et pour contrôler le cluster. Ce Pi est connecté à mon réseau local via wifi, afin que je puisse accéder à la copie de développement de mon site depuis mon ordinateur portable.  \nLe Pi supplémentaire dispose également d’une connexion Ethernet au cluster Pi. Lorsque je souhaite mettre à jour mon site, je peux transférer les modifications du site de développement vers le site actif du cluster. Les mises à jour du site sont placées dans des fichiers .tar.gz que les nœuds de travail téléchargent automatiquement à partir du site de développement. Une fois téléchargées, les mises à jour sont ensuite décompressées dans le système de fichiers local. \nConfiguration des serveurs Raspberry Pi\nToutes les tartes dans ce système sont sans tête. Je peux me connecter au Pi avec le site de développement en utilisant le protocole Remote Desktop, et à partir de ce Pi, je peux me connecter aux travailleurs Pies en utilisant SSH.\nTous les Pies du cluster utilisent une adresse IP statique. Dans un cluster plus grand, il serait probablement préférable de configurer un serveur DHCP sur l&#39;équilibreur de charge. Les adresses IP utilisées dans le cluster se trouvent sur le sous-réseau 192.168.1.xxx.\nPour chaque travailleur Pi, j&#39;ai configuré une carte SD de 4 Go en utilisant la dernière version de Raspbian. Dans raspi-config, je définis les options suivantes:","développer fs\ndéfinir le nom d&#39;hôte\ndéfinir le mot de passe\ndéfinir la mémoire partagée à 16 Mo pour le GPU\noverclocker le processeur à 800 MHz\nactiver ssh","Sur chaque carte, j&#39;ai installé Apache et certaines bibliothèques requises par mon CMS, libxml2 et python-libxml2. J&#39;ai utilisé cette commande pour activer le mod rewrite, qui est également requis par mon CMS:\n$ sudo a2enmod rewrite","Enfin, j&#39;ai copié sur chaque carte SD des scripts qui permettent à chaque Pi de synchroniser son contenu avec le développement Pi. Dans un cluster plus grand, il serait intéressant de créer une image de carte SD avec toutes ces modifications effectuées à l’avance.\nConstruire un équilibreur de charge\nL&#39;équilibreur de charge doit avoir deux interfaces réseau, une pour recevoir les demandes d&#39;un routeur et une autre interface réseau pour transmettre les demandes au cluster de serveurs. Les nœuds du cluster se trouvent sur un sous-réseau différent du reste du réseau. L&#39;adresse IP de la deuxième interface de l&#39;équilibreur de charge doit donc se trouver sur le même sous-réseau que le reste du cluster. La première interface de l&#39;équilibreur de charge a l&#39;adresse IP 192.168.0.3, tandis que l&#39;adresse IP de la deuxième interface est 192.168.1.1. Tous les Pies du cluster ont des adresses IP sur le sous-réseau 192.168.1.xxx.\nJ&#39;ai construit mon équilibreur de charge en utilisant un ancien PC doté de 512 Mo de RAM et d&#39;un processeur x86 à 2,7 GHz. J&#39;ai ajouté une deuxième carte Ethernet PCI et installé Lubuntu, une version allégée d&#39;Ubuntu. J&#39;allais installer Ubuntu, mais ce PC est assez ancien, donc Lubuntu est probablement un meilleur choix. J&#39;ai utilisé un PC parce que je ne savais pas si un seul Pi serait assez puissant pour jouer le rôle d&#39;équilibreur de charge, et un Pi ne dispose que d&#39;une seule connexion Ethernet. Je souhaite que les deux connexions réseau de mon équilibreur de charge soient Ethernet afin d&#39;améliorer les performances et la stabilité.\nNotez que le transfert IP n&#39;est pas activé. L&#39;équilibreur de charge n&#39;est pas un routeur, il ne doit transmettre que les requêtes HTTP et pas tous les paquets IP qu&#39;il reçoit. \nConfiguration du logiciel d&#39;équilibrage de charge\nIl existe de nombreuses implémentations logicielles d&#39;équilibrage de charge. J&#39;ai utilisé le module d&#39;équilibrage de charge d&#39;Apache car il est facile à configurer. Tout d&#39;abord, je me suis assuré que le système d&#39;exploitation de mon PC était à jour:\nsudo apt-get updatesudo apt-get upgrade","Puis j&#39;ai installé Apache:\nsudo apt-get install apache2","Ces modules Apache doivent être activés:\nproxy sudo a2enmodsudo a2enmod proxy_httpsudo a2enmod proxy_balancer","L&#39;étape suivante consiste à modifier / etc / apache2 / sites-available / default afin de configurer l&#39;équilibreur de charge. Le module proxy est nécessaire pour le transfert HTTP, mais il est préférable de ne pas permettre à votre serveur de se comporter comme un proxy. Les spammeurs et les pirates informatiques utilisent souvent les serveurs proxy d&#39;autres personnes pour masquer leur adresse IP. Il est donc important de désactiver cette fonctionnalité en ajoutant cette ligne:\n\tProxyRequests off","Bien que les demandes de proxy soient désactivées, le module de proxy est toujours activé et agit en tant que proxy inverse. Ensuite, définissez le cluster et ses membres en ajoutant ce code:","BalancerMember http://192.168.1.2:80\nBalancerMember http://192.168.1.3:80\nBalancerMember http://192.168.1.4:80\nBalancerMember http://192.168.1.5:80","AllowOverride None\nOrdre permettre, refuser\npermettre à tous","ProxySet lbmethod = byrequests","Interface du gestionnaire d&#39;équilibrage\nLe module d&#39;équilibrage dispose d&#39;une interface Web permettant de surveiller l&#39;état des serveurs principaux et de configurer leurs paramètres. Vous pouvez activer l&#39;interface Web en ajoutant ce code à / etc / apache2 / sites-available / default:","SetHandler balancer-manager","Ordre permettre, refuser\nautoriser à partir de 192.168.0","Il est également nécessaire de demander à Apache de gérer localement les demandes adressées à la page / balancer-manager au lieu de les transférer à un serveur de travail. Toutes les autres demandes sont transférées au cluster défini ci-dessus.","ProxyPass / balancer-manager!\nProxyPass / balancer: // rpicluster /","Une fois ces modifications enregistrées, Apache doit être redémarré avec cette commande:\n$ sudo /etc/init.d/apache2 restart","lorsque j&#39;ouvre un navigateur et que je visite http://192.168.0.3, je vois la page d&#39;accueil de mon site Web. Si je vais à http://192.168.0.3/balancer-manager, je vois cette page dans l&#39;image à droite.\nLa dernière étape pour mettre le cluster en ligne consiste à ajuster les paramètres de redirection de port dans mon routeur. Je devais juste configurer une règle pour transférer les paquets HTTP vers http://192.168.0.3.\nVoici l&#39;intégralité de / etc / apache2 / sites-available / default pour l&#39;équilibreur de charge:","Webmaster ServerAdmin @ localhost","DocumentRoot / var / www\n\t\n\t\tOptions FollowSymLinks\nAllowOverride All\n\t\n\t\n\t\t\n\t\t\n\t\t\n\t\tOptions Index FollowSymLinks MultiViews\nAllowOverride All\nOrdre permettre, refuser\npermettre à tous","ScriptAlias ​​/ cgi-bin / / usr / lib / cgi-bin /\n\t\n\t\tAllowOverride None\nOptions + ExecCGI -MultiViews + SymLinksIfOwnerMatch\n                AddHandler cgi-script .py\nOrdre permettre, refuser\nAutoriser de tous","ProxyRequests Off","BalancerMember http://192.168.1.2:80\n                BalancerMember http://192.168.1.3:80\n                BalancerMember http://192.168.1.4:80\n                BalancerMember http://192.168.1.5:80","                AllowOverride None\n                Ordre permettre, refuser\n                permettre à tous","                ProxySet lbmethod = byrequests","SetHandler balancer-manager","                Ordre permettre, refuser\n                autoriser à partir de 192.168.0","ProxyPass / balancer-manager!\n        ProxyPass / balancer: // rpicluster /","ErrorLog $ APACHE_LOG_DIR /error.log","# Les valeurs possibles incluent: debug, info, notice, avertir, erreur, crit,\n# alerte, émergent.\nLogLevel avertir","CustomLog $ APACHE_LOG_DIR /access.log combiné","commentaires","Maintenant que j&#39;ai construit un simple cluster de serveurs Raspberry Pi, il serait intéressant de voir combien de trafic il peut gérer par rapport à un seul Pi. Il existe de nombreux outils d&#39;analyse comparative de serveur disponibles. Je vais utiliser le siège.  \nUtiliser Siege pour tester les temps de réponse du serveur\nSiege est un programme qui peut être utilisé pour envoyer un grand nombre de demandes à un serveur Web. L’utilisation de la commande suivante enverra des requêtes HTTP à un serveur de mon réseau local:\nsiège -d10 -c10 -t1m http://192.168.0.10/spec.html","L&#39;option -c spécifie qu&#39;il doit y avoir 10 utilisateurs simultanés à la fois. L&#39;option -d spécifie le délai maximum entre les demandes. Le délai réel est aléatoire, mais le sera dans le délai utilisé avec l&#39;option -d. L&#39;option -t indique au siège combien de temps le test devrait durer &#8211; 1 minute dans ce cas.\nDans chacun des tests que j&#39;ai effectués, j&#39;ai utilisé un délai maximum de 10 secondes et une durée totale de test de 1 minute. Tous les tests utilisaient le siège pour faire des demandes sur mon réseau local, pas via Internet.\nTest de l&#39;équilibreur de charge avec un seul Raspberry Pi\nJe voulais voir comment un seul Raspberry Pi gère le trafic avec et sans l&#39;équilibreur de charge. Je soupçonnais que l&#39;équilibreur de charge introduirait un léger retard, mais en réalité, un seul Pi semble fonctionner plus efficacement lorsqu&#39;il est derrière un équilibreur de charge. Il semble que les demandes soient mises en mémoire tampon avant d’atteindre le Pi. Ce graphique montre les temps de réponse moyens pour différents nombres d&#39;utilisateurs simultanés, avec et sans l&#39;équilibreur de charge:\nVoir comment les performances s&#39;améliorent avec plus de nœuds\nLe test suivant que j&#39;ai effectué a consisté à vérifier l&#39;évolution des performances en fonction de l&#39;ajout de nœuds au cluster. J&#39;ai effectué des tests avec un nombre variable d&#39;utilisateurs simultanés, mais pour des raisons de simplicité, je ne montrerai que les résultats des tests effectués avec 10 utilisateurs simultanés.\nCe graphique indique les temps de réponse maximum et minimum moyens pour un nombre croissant de noeuds de travail:\nComme vous pouvez le constater, le temps de réponse minimum ne s’améliore pas réellement car plusieurs nœuds sont ajoutés, ce qui est logique. Le temps de réponse minimum est aussi rapide que l&#39;un des nœuds du cluster, et l&#39;ajout de nœuds ne changera rien. \nLe temps de réponse maximal s&#39;est considérablement amélioré avec l&#39;ajout de nouveaux noeuds. L&#39;utilisation d&#39;un cluster a nettement augmenté la capacité de mon serveur.  \n    En savoir plus sur le siège.\ncommentaires","Dans mon dernier article sur les performances des grappes, je trouvais qu&#39;une grappe fonctionnait mieux qu&#39;un simple Pi, mais il restait encore beaucoup à faire. J&#39;ai modifié les fichiers de configuration d&#39;Apache et modifié le mode de fonctionnement de la mise en cache des pages dans mon CMS.\nDéplacer le cache de la page\nLe CMS que j&#39;ai écrit peut générer des pages de manière dynamique et peut mettre en cache des pages afin qu&#39;elles puissent être servies instantanément sans être assemblées. Seules les pages composées de HTML statique peuvent être mises en cache. Les pages contenant du contenu dynamique généré par des scripts exécutables ne sont pas mises en cache.\nLe cache de pages se trouvait dans / usr / share / cms / cache. L&#39;interpréteur Python devait être chargé pour servir les pages en cache à partir de / usr / share / cms / cache. Désormais, le répertoire racine du cache de pages est / var / www. Apache peut donc servir les pages en cache sans appeler Python pour exécuter le script CMS.  \nUn inconvénient est que le CMS ne peut plus compter le trafic de piste. Lorsque le CMS s&#39;exécutait chaque fois qu&#39;une page était demandée, une fonction était appelée pour incrémenter un nombre dans un fichier de données. Cela ne fonctionne pas maintenant que les pages peuvent être servies sans l&#39;exécution du CMS.\nDécharger les modules inutilisés\nL&#39;un des meilleurs moyens d&#39;améliorer les performances d&#39;Apache consiste à décharger des modules inutiles. Tout d&#39;abord, vous devez répertorier tous les modules actuellement chargés à l&#39;aide de cette commande:\napache2ctl -M","Il peut être difficile de déterminer quels modules sont utilisés. Cela dépend vraiment des directives utilisées dans les fichiers .htaccess et les fichiers hôtes virtuels. Par exemple, si vous désactivez authz_host_module, les directives Allow, Order et Deny ne fonctionneront pas. Chaque fois que vous désactivez un module, redémarrez Apache avec les commandes suivantes:","$ sudo service apache2 stop\n$ sudo service apache2 start","Vous pouvez utiliser &#39;redémarrer&#39; au lieu de &#39;démarrer&#39; et &#39;arrêter&#39;, mais certaines variables nécessitent l&#39;arrêt d&#39;Apache avant de pouvoir être mises à jour. Il est judicieux de tester votre site avant de désactiver d&#39;autres modules. J&#39;ai désactivé ces modules:","$ sudo a2dismod autoindex\n$ sudo a2dismod auth_basic\nstatut sudo a2dismod\n$ sudo a2dismod dégonfler\n$ sudo a2dismod ssl\n$ sudo a2dismod authz_default","Si vous trouvez qu&#39;un module est requis, vous pouvez le réactiver avec la commande a2enmod comme ceci:\n$ sudo a2enmod authz_host","Réduire le délai d&#39;attente\nJe règle le délai d&#39;attente dans /etc/apache2/apache2.conf sur 30. Cela évite que des requêtes simultanées n&#39;occupent de la mémoire pendant de longues périodes et réduise l&#39;utilisation de la mémoire.\nAjuster les processus Apache\nApache a plusieurs modèles de multitraitement différents. Ils utilisent chacun un nombre de processus serveur et de fils enfants pour gérer les requêtes HTTP.\nMPM worker est la configuration la plus moderne. MPM prefork était auparavant la norme, mais MPM Worker offre de meilleures performances et une meilleure utilisation de la mémoire. Utilisez cette commande pour vérifier le mode dans lequel se trouve Apache: \n$ sudo apache2 -V","Une partie de la sortie ressemblera à ceci:","Serveur MPM: Travailleur\n  fileté: oui (nombre de threads fixe)\n    forké: oui (nombre de processus variable)","Voici les paramètres par défaut pour MPM Worker:","StartServers 5\n    MinSpareThreads 25\n    MaxSpareThreads 75\n    ThreadLimit 64\n    ThreadsPerChild 25\n    MaxClients 150\n    MaxRequestsPerChild 0","La taille des processus Apache varie en fonction du contenu servi et des scripts éventuellement en cours d&#39;exécution. Cette commande indique le nombre de processus Apache et leur taille:\nps aux | grep &#39;apache2&#39;","La 6ème colonne contient la quantité de mémoire utilisée par chaque processus. En divisant la quantité de mémoire de secours par la taille du processus Apache moyen, vous obtenez une indication approximative du nombre maximal de processus serveur que vous pouvez exécuter. Chaque Pi de mon cluster a environ 280 Mo de RAM libre, et la taille moyenne des processus Apache est d’environ 7 Mo. 280 divisé par 7 donne 40. \nStartServers est le nombre de threads de serveur créés par Apache au démarrage. La création de nouveaux processus de serveur peut prendre beaucoup de temps. Je souhaite donc qu&#39;Apache démarre beaucoup de processus de serveur au démarrage. Cela signifie qu&#39;il n&#39;aura pas à passer du temps à créer plus de processus alors qu&#39;il est occupé à traiter beaucoup de trafic. J&#39;ai mis StartServers à 40.  \nJe ne veux pas qu&#39;Apache puisse créer trop de processus, car mon Pi risque de manquer de mémoire, j&#39;ai donc défini ServerLimit sur 40.\nChaque processus serveur peut avoir un nombre variable de threads. Ce sont les threads qui traitent réellement les demandes. J&#39;ai fixé le nombre de threads par enfant à 8 par défaut. Je n&#39;ai pas calculé cela, j&#39;ai simplement essayé plusieurs nombres et effectué de nombreux tests avec siege jusqu&#39;à ce que je trouve la valeur optimale.\nLe nombre total de threads est le nombre de processus serveur multiplié par ThreadsPerChild, ce qui correspond à 320 avec mes paramètres. J&#39;ai défini MaxClients sur 320 pour empêcher Apache de créer des threads supplémentaires.\nCes paramètres obligeront Apache à créer de nombreux processus et threads qui ne seront pas utilisés immédiatement. Afin d&#39;empêcher Apache de les supprimer, j&#39;ai défini MaxSpareThreads sur 320.\nMaxRequestsPerChild est le nombre de demandes qu&#39;un processus doit gérer avant d&#39;être tué et qu&#39;un processus de remplacement ne soit démarré. Ceci est fait pour empêcher les fuites de mémoire d&#39;accumuler de grandes quantités de mémoire. Il doit être défini sur le nombre de hits qu&#39;un serveur reçoit par jour afin que les processus soient redémarrés une fois par jour.  \nLes paramètres de MPM Worker sont maintenant","StartServers 40\n    ServerLimit 40\n    MinSpareThreads 25\n    MaxSpareThreads 320\n    ThreadLimit 64\n    ThreadsPerChild 8\n    MaxClients 320\n    MaxRequestsPerChild 2000","Avant de modifier le système de mise en cache, un test de siège avec seulement 25 utilisateurs simultanés a permis d&#39;obtenir les résultats suivants:","Lever le siège du serveur ... c&#39;est fait.\nTransactions: 30 hits\nDisponibilité: 100.00%\nTemps écoulé: 59.79 secondes\nDonnées transférées: 0,08 Mo\nTemps de réponse: 26.07 secondes\nTaux de transaction: 0.50 trans / sec\nDébit: 0.00 Mo / sec\nAccès simultané: 13.08\nTransactions réussies: 30\nTransactions échouées: 0\nLa plus longue transaction: 29.32\nOpération la plus courte: 14.03","Après avoir amélioré le système de mise en cache, j&#39;ai testé un seul nœud avec 200 utilisateurs simultanés à l&#39;aide de cette commande:\n$ siege -d1 -c200 -t1m http://192.168.0.4/specs.html","Les résultats ont été","Lever le siège du serveur ... c&#39;est fait.\nTransactions: 6492 hits\nDisponibilité: 100.00%\nTemps écoulé: 59.28 secondes\nDonnées transférées: 38,86 MB\nTemps de réponse: 1,29 secondes\nTaux de transaction: 109,51 trans / s\nDébit: 0.66 Mo / sec\nAccès simultané: 141,10\nTransactions réussies: 6492\nTransactions échouées: 0\nLa transaction la plus longue: 11.23\nOpération la plus courte: 0,32","Après avoir redémarré Apache avec les modifications de configuration et exécuté à nouveau le même test, j&#39;ai obtenu les résultats suivants:","Lever le siège du serveur ... c&#39;est fait.\nTransactions: 6449 visites\nDisponibilité: 100.00%\nTemps écoulé: 59.53 secondes\nDonnées transférées: 38,60 MB\nTemps de réponse: 1,31 seconde\nTaux de transaction: 108.33 trans / sec\nDébit: 0.65 MB / sec\nAccès simultané: 142.32\nTransactions réussies: 6449\nTransactions échouées: 0\nLa transaction la plus longue: 4.16\nOpération la plus courte: 0.01","Après avoir optimisé la mise en cache des pages, supprimé les modules inutilisés d’Apache et optimisé le processus du serveur, le nombre de transactions par seconde pour un seul nœud est passé de 0,5 à plus de cent. Le nombre de demandes de connexion pouvant être traitées a été multiplié par 8.\nLe réglage des processus Apache a entraîné une très légère diminution du nombre de transactions par seconde, mais le temps de transaction le plus long a considérablement diminué.\nTester l&#39;ensemble du cluster\nUne fois satisfait de mes nouveaux paramètres, je les ai transférés dans l&#39;ensemble du cluster. J&#39;ai fait plus de tests avec siege, d&#39;abord avec 200 utilisateurs simultanés:","Lever le siège du serveur ... c&#39;est fait.\nTransactions: 23218 hits\nDisponibilité: 100.00%\nTemps écoulé: 59.26 secondes\nDonnées transférées: 48,44 Mo\nTemps de réponse: 0.01 sec\nTaux de transaction: 391.80 trans / s\nDébit: 0.82 Mo / sec\nAccès simultané: 3,90\nTransactions réussies: 23218\nTransactions échouées: 0\nLa transaction la plus longue: 0,66\nLa transaction la plus courte: 0.00","&#8230; et ensuite avec 800 utilisateurs simultanés:","Lever le siège du serveur ... c&#39;est fait.\nTransactions: 56899 visites\nDisponibilité: 100.00%\nTemps écoulé: 60.05 secondes\nDonnées transférées: 118,59 Mo\nTemps de réponse: 0.34 sec\nTaux de transaction: 947,53 trans / s\nDébit: 1,97 Mo / sec\nAccès simultané: 317.44\nTransactions réussies: 56899\nTransactions échouées: 0\nLa transaction la plus longue: 9.71\nLa transaction la plus courte: 0.00","Avant de paramétrer Apache, le cluster pouvait gérer 350 demandes simultanées et le taux de transaction maximal était de 460 transactions par seconde. Le nombre maximal d&#39;utilisateurs simultanés avec un taux de réussite de 100% est désormais de 800. Le nombre maximal de transactions par seconde est maintenant de 947.\nJe surveillerai attentivement la quantité de mémoire disponible au cours des prochains jours. Si le niveau commence à devenir trop bas, je vais réduire certains de ces paramètres.\nL&#39;utilisation du siège n&#39;est pas complètement réaliste. Une demande émanant d&#39;un navigateur impose au serveur une charge beaucoup plus importante qu&#39;une demande émanant d&#39;un siège, et la synchronisation des tests en état de siège diffère de celle du trafic réel. Les tests effectués en utilisant le siège ne prédisent pas le nombre de requêtes qu&#39;un serveur peut gérer. Des tests comme ceux-ci fournissent une base de comparaison des différentes configurations de serveur. Je ne pense pas que mon cluster puisse gérer 947 visiteurs réels par seconde, mais je suis convaincu que les performances de mon serveur sont meilleures que celles enregistrées auparavant.\ncommentaires","Les temps de chargement des pages sont importants pour une bonne expérience utilisateur. Les gens sont plus impliqués avec les sites qui se chargent rapidement et visitent généralement plus de pages.\nPour que les pages se chargent rapidement, il ne suffit pas de rendre les serveurs Web plus rapides. Lorsque les navigateurs chargent des pages, ils doivent d’abord la télécharger à partir d’un serveur Web. Si la page fait référence à d&#39;autres fichiers, tels que CSS, Javascript et images, le navigateur doit également récupérer ces fichiers. Une fois que tous les fichiers ont été téléchargés, le navigateur doit rendre la page. Les pages peuvent être optimisées pour que les navigateurs puissent les charger rapidement et efficacement.\nCe type d’optimisation ne concerne pas le réglage du serveur, mais l’optimisation des pages de votre site afin que les navigateurs puissent les charger facilement. Cela implique de passer du temps à ajuster le modèle HTML d&#39;un site.\nGoogle PageSpeed ​​Insights est un bon endroit pour trouver des idées sur la façon d&#39;optimiser votre site. Vous pouvez utiliser PageSpeed ​​Insights pour analyser les pages d&#39;un site et déterminer des moyens d&#39;améliorer les temps de chargement des pages. PageSpeed ​​Insights donne des suggestions détaillées sur la manière d&#39;améliorer les performances. Un score de classement des pages est attribué à votre site, ce qui s’améliore à mesure que vous parcourez la liste des problèmes.\nCSS en ligne\nJ&#39;avais l&#39;habitude de garder le code CSS pour mon site dans un fichier séparé dans /var/www/default_theme.css. Il a été référencé dans la section head de mon modèle HTML avec cette ligne:","Lorsque les navigateurs chargeaient les pages de mon site, ceux-ci ne pouvaient plus afficher cette page tant qu&#39;ils n&#39;avaient pas fait une nouvelle demande à mon serveur et téléchargé le fichier CSS. J&#39;ai éliminé ce délai en incluant le code CSS directement dans la section head de mon modèle HTML. J&#39;ai ajouté les balises suivantes à la section d&#39;en-tête de mon modèle, puis ai collé le contenu de mon fichier CSS entre elles:","Cela agrandit chaque page Web, mais réduit le nombre de demandes que mon serveur doit traiter. Cela signifie également que les navigateurs peuvent rendre la page plus efficacement.\nJavascript différé Chargement\nIl est assez courant de référencer les fichiers source javascript dans la section head d&#39;une page Web. J&#39;avais l&#39;habitude d&#39;avoir la balise suivante dans la tête de mon site afin que les images puissent être visionnées à l&#39;aide du plugin Javascript Lightbox:","Le problème, c&#39;est que lorsqu&#39;une page est téléchargée, le navigateur doit suspendre le traitement de la page pour télécharger le fichier Javascript. Cela interrompt le navigateur avant qu&#39;il puisse commencer à afficher la page.\nLa solution consiste à déplacer les références aux fichiers Javascript &quot;en dessous du pli&quot;. J&#39;ai mis à jour mon modèle HTML pour inclure cette ligne juste après le pied de page plutôt que dans la section head. Lorsque les pages de mon site sont chargées dans un navigateur, la plupart des pages sont rendues avant que le navigateur ne doive obtenir le fichier Javascript.\nBoutons de partage Javascript asynchrones\nLes boutons de partage sont un excellent moyen d&#39;augmenter le trafic sur votre site. Les visiteurs cliquent sur les boutons de partage pour partager votre site avec leurs amis et leurs abonnés sur les réseaux sociaux, augmentant ainsi le trafic généré par votre site à partir des réseaux sociaux. Il existe de nombreuses sociétés fournissant des plugins pouvant être ajoutés à un site. L&#39;inconvénient de certains plugins de partage est qu&#39;ils peuvent réduire la vitesse de chargement de la page en raison de problèmes liés à Javascript.\nAu lieu d&#39;utiliser un seul plug-in pour afficher les boutons de partage, vous pouvez utiliser des boutons de différents sites. Chaque réseau social possède ses propres boutons de partage que vous pouvez utiliser pour mettre des boutons de partage sur votre site. La plupart d&#39;entre eux sont asynchrones (mais pas Reddit au moment de la rédaction). Les boutons asynchrones sont chargés après le rendu de la page, ce qui accélère son chargement.\nDepuis que j&#39;ai supprimé le plug-in de partage et que je l&#39;ai remplacé par des boutons de partage individuels, les temps de chargement des pages affichés dans Google Analytics sont devenus beaucoup plus cohérents et beaucoup plus courts.\nMinify CSS et Javascript\nLes fichiers CSS et Javascript contiennent souvent beaucoup d&#39;espaces, tels que des espaces et des caractères de nouvelle ligne. L&#39;utilisation d&#39;espaces permet de rendre le code plus lisible, mais ajoute également à la taille des fichiers. La suppression de caractères blancs rend le code illisible, mais peut considérablement réduire la charge de votre serveur. J&#39;ai décidé de ne pas minifier mon code CSS car je veux pouvoir le lire, mais j&#39;ai supprimé beaucoup d&#39;espaces, tout en préservant un formatage de base. Voici à quoi ressemblait mon code CSS:",".navbar li","    affichage: en ligne;\n    bordure gauche: noir 1px solide;\n    padding-left: 6px;","premier","    frontière gauche: aucune;",".navbar li: premier enfant","    bordure: aucune;","Voici à quoi cela ressemble avec quelques espaces blancs supprimés:",".navbar li"," affichage: en ligne;\n bordure gauche: noir 1px solide;\n padding-left: 6px;","premier"," frontière gauche: aucune;",".navbar li: premier enfant"," bordure: aucune;","Le code Javascript peut également être minifié. Je n&#39;ai pas l&#39;intention de modifier le code Javascript, je l&#39;ai donc complètement minifié. Il existe deux fichiers JavaScript que les navigateurs téléchargent sur mon site chaque fois qu&#39;ils chargent une page, /js/lightbox.js, pour afficher des images, et /js/jquery-1.7.2.min.js. Le fichier jQuery est déjà minifié.\nLe code de la visionneuse n’est pas minifié par défaut, je suis donc allé à cet outil de minifier Javascipt et\na collé le code de lightbox.js dans la zone de saisie et a appuyé sur le bouton d&#39;envoi. J&#39;ai créé un nouveau fichier dans / var / www / js appelé lightbox.min.js et ai collé la sortie de l&#39;outil Minifier dans le fichier. J&#39;ai modifié le modèle HTML de mon site afin de référencer ce nouveau fichier au lieu de la version non modifiée d&#39;origine. La version non décomposée de ce fichier était de 11,6 Ko et la version agrandie de 6,2 Ko.\nTirer parti de la mise en cache du navigateur\nLes navigateurs Web peuvent mettre en cache les pages de sorte qu&#39;elles ne doivent plus être téléchargées si un utilisateur revient à une page déjà visitée. Vous pouvez indiquer aux navigateurs de mettre en cache des pages en envoyant un en-tête de contrôle avant que la page soit envoyée par le serveur. Cela nécessite quelques modifications à la configuration d&#39;Apache. Tout d&#39;abord, le module d&#39;en-têtes doit être installé:","$ sudo a2enmod headers","Ensuite, le code suivant doit être collé quelque part dans /etc/apache2/apache2.conf:","Ensemble d&#39;en-têtes Cache-control &quot;public, max-age = 2592000&quot;","Ensemble d&#39;en-têtes Cache-control &quot;public, max-age = 604800&quot;","Cela indique à Apache que tout fichier avec une terminaison .ico, .png, .gif, .jpg ou .js doit être mis en cache pendant 2592000 secondes (30 jours) et les fichiers avec une fin .html doivent être mis en cache pendant 604800 secondes (7 jours). . La dernière étape consiste à redémarrer Apache:","$ sudo service apache2 restart","J&#39;ai exécuté cette commande sur un autre ordinateur pour m&#39;assurer que la mise en cache fonctionnait correctement:","$ wget --save-headers http://raspberrywebserver.com/feed-icon-14x14.png","Lorsque j&#39;ai ouvert le fichier téléchargé dans un éditeur de texte, ces en-têtes HTTP se trouvaient en haut:","HTTP / 1.1 200 OK\nDate: dim. 13 oct. 2013 à 01:24:25 GMT\nServeur: Apache / 2.2.22 (Debian)\nDernière mise à jour: mar. 01 oct 2013 à 03:40:50 GMT\nETag: &quot;226f0-2b1-4e7a5b80cb907&quot;\nAccept-Ranges: octets\nLongueur du contenu: 689\nCache-control: public, max-age = 259200\nKeep-Alive: délai d&#39;attente = 5, max = 100\nConnexion: Keep-Alive\nType de contenu: image / png","L&#39;en-tête de contrôle du cache est maintenant visible parmi les autres en-têtes HTTP.\nAffichage de la synchronisation des pages Google Analytics\nLa capture d&#39;écran de Google Analytics à droite montre comment les temps de chargement des pages se sont améliorés. Les temps de chargement des pages ont beaucoup fluctué lorsque j&#39;utilisais un plug-in de partage, mais se sont stabilisés dès que je m&#39;en suis débarrassé le 10 octobre. Au cours des prochains jours, le temps de chargement de la page a été réduit encore plus à mesure que je minifiais CSS et Javascript.\ncommentaires","Mon cluster de serveurs Raspberry Pi fonctionne depuis trois mois et dessert maintenant 45 000 pages vues par mois. La quantité de trafic\natteindre mon site est en augmentation constante et il existe parfois de fortes pics de trafic sur les sites de réseaux sociaux.  \nAu fur et à mesure que la charge sur le serveur augmente, il est important de vous assurer qu&#39;elle dispose de suffisamment de capacité. J&#39;ai donc décidé d&#39;augmenter sa puissance de calcul en ajoutant quatre nœuds de serveur Raspberry Pi supplémentaires au cluster.  \nJ&#39;ai construit deux nouveaux racks, chacun contenant quatre serveurs Raspberry Pi. J&#39;ai connecté en série deux commutateurs Ethernet, avec quatre serveurs Pi connectés à chaque commutateur.  \nJ&#39;ai cloné une carte SD à partir de l&#39;un des nœuds Pi et mis en place quatre cartes SD presque identiques. La seule différence entre eux est l&#39;adresse IP dans / etc / network / interfaces. J&#39;ai fait une sauvegarde de mon site à partir du tableau de bord de mon CMS et ai utilisé un script pour synchroniser le contenu de tous les nœuds de travail.\nL&#39;étape suivante consistait à modifier les paramètres de l&#39;équilibreur de charge pour pouvoir utiliser les nouveaux nœuds. Sur l&#39;équilibreur de charge, il fallait mettre à jour / etc / apache2 / sites-available / default pour inclure les nouveaux nœuds dans la déclaration de cluster:","BalancerMember http://192.168.1.2:80\n                BalancerMember http://192.168.1.3:80\n                BalancerMember http://192.168.1.4:80\n                BalancerMember http://192.168.1.5:80\n                BalancerMember http://192.168.1.6:80\n                BalancerMember http://192.168.1.7:80\n                BalancerMember http://192.168.1.8:80\n                BalancerMember http://192.168.1.9:80","                AllowOverride None\n                Ordre permettre, refuser\n                permettre à tous","                ProxySet lbmethod = byrequests","Une fois les modifications apportées, j&#39;ai exécuté cette commande pour les charger dans Apache:","$ sudo /etc/init.d/apache2 reload","Cela indique à Apache de recharger ses fichiers de configuration sans redémarrer. Je suis allé à l&#39;interface du gestionnaire d&#39;équilibrage à l&#39;adresse 192.168.0.3/balancer-manager pour m&#39;assurer que les nouveaux nœuds avaient été ajoutés:\nEssai\nJ&#39;ai testé le nouveau cluster à huit Pi en utilisant les mêmes tests que lorsque je n&#39;utilisais que quatre serveurs Pi. D&#39;abord, j&#39;ai utilisé seige pour générer 200 demandes simultanées en une minute:","$ siege -d1 -c200 -t1m http://192.168.0.3/specs.html","Lever le siège du serveur ... c&#39;est fait.\nTransactions: 23492 hits\nDisponibilité: 100.00%\nTemps écoulé: 59.81 secondes\nDonnées transférées: 48,93 Mo\nTemps de réponse: 0.01 sec\nTaux de transaction: 392,78 trans / s\nDébit: 0.82 Mo / sec\nAccès simultané: 3,81\nTransactions réussies: 23492\nTransactions échouées: 0\nLa transaction la plus longue: 0,63\nLa transaction la plus courte: 0.00","Le résultat est très similaire à celui obtenu pour le même test sur le cluster avec seulement quatre nœuds (voir &#39;Test du cluster entier&#39;).\nAméliorer les performances du cluster en ajustant Apache).  \nEnsuite, j&#39;ai lancé le siège avec 800 demandes simultanées:","Lever le siège du serveur ... c&#39;est fait.\nTransactions: 76510 hits\nDisponibilité: 100.00%\nTemps écoulé: 59.76 secondes\nDonnées transférées: 159,39 MB\nTemps de réponse: 0,12 seconde\nTaux de transaction: 1280.29 trans / s\nDébit: 2,67 Mo / sec\nAccès simultané: 148.45\nTransactions réussies: 76510\nTransactions échouées: 0\nLa transaction la plus longue: 13.04\nLa transaction la plus courte: 0.00","Le temps de transaction le plus long a augmenté, mais le débit et le nombre de transactions par seconde ont également augmenté.\nLes performances avec un faible nombre de demandes simultanées n&#39;ont pas vraiment changé, mais les performances se sont améliorées pour un nombre accru de demandes simultanées.\ndemandes. Cela est prévisible, car l&#39;ajout de nouveaux nœuds ne rend pas un cluster plus rapide, mais vise à augmenter la capacité du cluster.\nJ&#39;ai été surpris que le temps pour la plus longue transaction a augmenté. La plupart des demandes sont traitées en 20 ms ou moins, et malheureusement, le siège ne fonctionne pas\nenregistrer le temps de réponse moyen. \nLes tests avec Apache Bench, ab, montrent que le temps de transaction le plus long était de 5,111 secondes, mais que le temps moyen de transaction était de 0,214 seconde.\nL&#39;augmentation du temps de transaction le plus long ne signifie pas que la performance globale est pire, mais c&#39;est une source de préoccupation. Je me suis connecté à la charge\nl’équilibreur à l’aide de ssh et a relancé les tests sur mon cluster. J&#39;ai exécuté la commande uptime suivie de free sur l&#39;équilibreur de charge:","$ disponibilité\n 13:30:04 up 1 day,  5:20,  1 user,  load average: 9.27, 3.52, 1.33\n$ free\n             total       used       free     shared    buffers     cached\nMem:        498268     487188      11080          0      37328     299752\n-/+ buffers/cache:     150108     348160\nSwap:       513020         20     513000","The load average figures for the load balancer are much higher than for the servers.  The load balancer only has 11MB of RAM left and has \nstarted to use swap.  When web servers start to use swap space, they slow down dramatically, so I need to look into the performance and memory \nusage of my load balancer.  Using siege to test with 800 concurrent users is testing for the worst case.  At the moment my site isn&#39;t getting \nthat much traffic, so the performance issues with the load balancer aren&#39;t an immediate problem, but it&#39;s something I need to look at.  \nI still don&#39;t know how much traffic this system can actually handle because serving real traffic is not the same as testing with siege. je fais\nknow that my server can handle at least 45,000 hits a month, and probably a lot more now that I have added more nodes.\ncommentaires","Ever since I built my cluster people have been asking me why I used Apache and not Nginx.  I started using Apache because I was just used to it.  People say it&#39;s slow and takes up too much memory, but I find that with a little tuning it can perform quite well.\nStill, Nginx does have a reputation for being fast.  I wanted to see which web server would be best for my cluster, so I installed Apache on one Pi and Nginx on another.  \nI used two Raspberry Pi model B servers, each with identical Sandisk 4GB class 4 SD cards.  In raspi-config, I overclocked each Pi to 800MHz, and allocated 16MB of memory to the GPU.  I used the same version of Raspbian (released on 2013-09-25) on both servers.  I used exactly the same test data and scripts on each Pi.\nFollow this link to see how I set up Nginx and uWSGI.\nI tuned Apache by removing modules and increasing the number of server processes.  These tuning techniques don&#39;t apply to Nginx.\nI tested each server with three different types of request: a static HTML file, a simple CGI script, and a complex CGI script.  The HTML file is a cached page in my Content Management System (the CMS doesn&#39;t need to execute for cached pages to be served, they can be served by Apache as normal HTML files).  The simple script just prints an HTTP header, prints &quot;Hello World!&quot; and exits.\nThe complex script used in these tests was the CMS that this site is built on.  I disabled page caching on both Pi servers, so that pages had to be generated dynamically by the CMS.  When a page is served, the CMS script has to parse two XML files to get meta data, read several snippets of HTML from the file system, and print them to a socket.\nRequests were generated with Apache Bench using a command like this:","ab -n 1000 -c 250 http://192.168.0.21/spec.html","where 1000 is the number of requests to issue, and 250 is the number of concurrent users.  \nThe Raspberry Pi running Nginx had IP address 192.168.0.21, and the Pi running Apache had 192.168.0.22.  I tested each server over a range of concurrent users for each type of request.  \nStatic files\nStatic files are easy to serve, so I used a range of 50 to 250 concurrent users in these tests.  Apache handled 220 connections per second, while Nginx handled around 300 connections per second.\nNginx came out ahead on these tests.\nDynamic content tests\nSimple script\nIn these tests I used ab to request this URL: http://192.168.0.21/cgi-bin/hello.py.  I set the number of request to 100, and tested over a range of 10 to 50 concurrent users.\nApache handled 4.78 connections per second, and Nginx handled 4.65 connections per second, but the results showed that the mean transaction time was lower for Nginx than Apache, so Apache was slower in this test.  The difference was not very pronounced under a low load, but it increased as the load increased.\nComplex script\nThe URL used in these test was http://192.168.0.21/spec.html.  This test is the most CPU intensive so I used from 5 to 25 concurrent users in these tests.  \nUnder a low load, Apache&#39;s performance was slightly better than Nginx, but only by a very slim margin.  With 25 concurrent users, Apache was slower than Nginx.  The difference under a low load is negligible, but with 25 concurrent users, Nginx was noticeably faster than Apache.\nConclusions\nThere are many variables involved in server performance.  These tests don&#39;t definitively determine which server is &#39;better&#39;, they just helped me decide which one is best for my specific needs.\nMost of the pages on my site are static, and Nginx is faster when it comes to static pages.  It looks like Nginx is a better choice for me.  \ncommentaires","Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]"],"content_blocks":[{"id":"text-1","type":"text","heading":"","plain_text":"Accueil / Cluster Raspberry Pi","html":"<p>Accueil / Cluster Raspberry Pi</p>"},{"id":"text-2","type":"text","heading":"","plain_text":"Une utilisation courante des ordinateurs Raspberry Pi consiste à créer des grappes. Les tartes aux framboises sont petites et peu coûteuses; il est donc plus facile de les utiliser pour créer un cluster que ce ne serait le cas avec les PC. Une grappe de tartes aux framboises devrait être assez grosse pour concurrencer un seul PC; vous aurez probablement besoin d&#39;environ 20 Pies pour produire un cluster avec autant de puissance de calcul qu&#39;un PC. Même si un cluster Pi n&#39;est peut-être pas aussi puissant, c&#39;est une excellente opportunité pour en apprendre davantage sur l&#39;informatique distribuée.\nIl existe différents types d’ordinateurs distribués qui peuvent être utilisés à des fins différentes. Il existe des super-ordinateurs utilisés pour résoudre des problèmes mathématiques tels que la modélisation des conditions météorologiques ou la simulation de réactions chimiques. Ces systèmes utilisent souvent l&#39;interface MPI (Message Passing Interface). Une équipe de l’Université de Southampton a construit un superordinateur basé sur MPI à 64 nœuds. Ce système est utilisé pour enseigner aux élèves la superinformatique.\nHadoop est une autre technologie souvent utilisée dans l&#39;informatique distribuée. Elle permet de distribuer des données sur plusieurs nœuds. Hadoop est souvent utilisé pour le traitement de grands ensembles de données et l&#39;exploration de données. Un ingénieur chez Nvidia a construit un petit cluster Hadoop en utilisant des tartes aux framboises. Il utilise son cluster pour expérimenter et tester des idées avant de les déployer sur des systèmes plus puissants.\nUtilisation d&#39;un cluster Raspberry Pi en tant que serveur Web\nLes clusters peuvent être utilisés comme serveurs Web. De nombreux sites Web génèrent trop de trafic pour s&#39;exécuter sur un seul serveur, de sorte que plusieurs serveurs doivent être utilisés. Les demandes des navigateurs Web sont reçues par un nœud appelé équilibreur de charge, qui transmet les demandes aux serveurs de travail. L&#39;équilibreur de charge transmet ensuite les réponses des serveurs aux clients.\nCe site est maintenant hébergé sur un cluster Raspberry Pi. Les nœuds de travail sont des serveurs Web standard ayant un contenu identique. Je viens d&#39;installer Apache sur eux et de copier mon site sur chaque nœud.\nJ&#39;utilise un Raspberry Pi supplémentaire pour héberger une copie de développement de ce site et pour contrôler le cluster. Ce Pi est connecté à mon réseau local via wifi, afin que je puisse accéder à la copie de développement de mon site depuis mon ordinateur portable.  \nLe Pi supplémentaire dispose également d’une connexion Ethernet au cluster Pi. Lorsque je souhaite mettre à jour mon site, je peux transférer les modifications du site de développement vers le site actif du cluster. Les mises à jour du site sont placées dans des fichiers .tar.gz que les nœuds de travail téléchargent automatiquement à partir du site de développement. Une fois téléchargées, les mises à jour sont ensuite décompressées dans le système de fichiers local. \nConfiguration des serveurs Raspberry Pi\nToutes les tartes dans ce système sont sans tête. Je peux me connecter au Pi avec le site de développement en utilisant le protocole Remote Desktop, et à partir de ce Pi, je peux me connecter aux travailleurs Pies en utilisant SSH.\nTous les Pies du cluster utilisent une adresse IP statique. Dans un cluster plus grand, il serait probablement préférable de configurer un serveur DHCP sur l&#39;équilibreur de charge. Les adresses IP utilisées dans le cluster se trouvent sur le sous-réseau 192.168.1.xxx.\nPour chaque travailleur Pi, j&#39;ai configuré une carte SD de 4 Go en utilisant la dernière version de Raspbian. Dans raspi-config, je définis les options suivantes:","html":"<p>Une utilisation courante des ordinateurs Raspberry Pi consiste à créer des grappes. Les tartes aux framboises sont petites et peu coûteuses; il est donc plus facile de les utiliser pour créer un cluster que ce ne serait le cas avec les PC. Une grappe de tartes aux framboises devrait être assez grosse pour concurrencer un seul PC; vous aurez probablement besoin d&#039;environ 20 Pies pour produire un cluster avec autant de puissance de calcul qu&#039;un PC. Même si un cluster Pi n&#039;est peut-être pas aussi puissant, c&#039;est une excellente opportunité pour en apprendre davantage sur l&#039;informatique distribuée.\nIl existe différents types d’ordinateurs distribués qui peuvent être utilisés à des fins différentes. Il existe des super-ordinateurs utilisés pour résoudre des problèmes mathématiques tels que la modélisation des conditions météorologiques ou la simulation de réactions chimiques. Ces systèmes utilisent souvent l&#039;interface MPI (Message Passing Interface). Une équipe de l’Université de Southampton a construit un superordinateur basé sur MPI à 64 nœuds. Ce système est utilisé pour enseigner aux élèves la superinformatique.\nHadoop est une autre technologie souvent utilisée dans l&#039;informatique distribuée. Elle permet de distribuer des données sur plusieurs nœuds. Hadoop est souvent utilisé pour le traitement de grands ensembles de données et l&#039;exploration de données. Un ingénieur chez Nvidia a construit un petit cluster Hadoop en utilisant des tartes aux framboises. Il utilise son cluster pour expérimenter et tester des idées avant de les déployer sur des systèmes plus puissants.\nUtilisation d&#039;un cluster Raspberry Pi en tant que serveur Web\nLes clusters peuvent être utilisés comme serveurs Web. De nombreux sites Web génèrent trop de trafic pour s&#039;exécuter sur un seul serveur, de sorte que plusieurs serveurs doivent être utilisés. Les demandes des navigateurs Web sont reçues par un nœud appelé équilibreur de charge, qui transmet les demandes aux serveurs de travail. L&#039;équilibreur de charge transmet ensuite les réponses des serveurs aux clients.\nCe site est maintenant hébergé sur un cluster Raspberry Pi. Les nœuds de travail sont des serveurs Web standard ayant un contenu identique. Je viens d&#039;installer Apache sur eux et de copier mon site sur chaque nœud.\nJ&#039;utilise un Raspberry Pi supplémentaire pour héberger une copie de développement de ce site et pour contrôler le cluster. Ce Pi est connecté à mon réseau local via wifi, afin que je puisse accéder à la copie de développement de mon site depuis mon ordinateur portable.  \nLe Pi supplémentaire dispose également d’une connexion Ethernet au cluster Pi. Lorsque je souhaite mettre à jour mon site, je peux transférer les modifications du site de développement vers le site actif du cluster. Les mises à jour du site sont placées dans des fichiers .tar.gz que les nœuds de travail téléchargent automatiquement à partir du site de développement. Une fois téléchargées, les mises à jour sont ensuite décompressées dans le système de fichiers local. \nConfiguration des serveurs Raspberry Pi\nToutes les tartes dans ce système sont sans tête. Je peux me connecter au Pi avec le site de développement en utilisant le protocole Remote Desktop, et à partir de ce Pi, je peux me connecter aux travailleurs Pies en utilisant SSH.\nTous les Pies du cluster utilisent une adresse IP statique. Dans un cluster plus grand, il serait probablement préférable de configurer un serveur DHCP sur l&#039;équilibreur de charge. Les adresses IP utilisées dans le cluster se trouvent sur le sous-réseau 192.168.1.xxx.\nPour chaque travailleur Pi, j&#039;ai configuré une carte SD de 4 Go en utilisant la dernière version de Raspbian. Dans raspi-config, je définis les options suivantes:</p>"},{"id":"text-3","type":"text","heading":"","plain_text":"développer fs\ndéfinir le nom d&#39;hôte\ndéfinir le mot de passe\ndéfinir la mémoire partagée à 16 Mo pour le GPU\noverclocker le processeur à 800 MHz\nactiver ssh","html":"<p>développer fs\ndéfinir le nom d&#039;hôte\ndéfinir le mot de passe\ndéfinir la mémoire partagée à 16 Mo pour le GPU\noverclocker le processeur à 800 MHz\nactiver ssh</p>"},{"id":"text-4","type":"text","heading":"","plain_text":"Sur chaque carte, j&#39;ai installé Apache et certaines bibliothèques requises par mon CMS, libxml2 et python-libxml2. J&#39;ai utilisé cette commande pour activer le mod rewrite, qui est également requis par mon CMS:\n$ sudo a2enmod rewrite","html":"<p>Sur chaque carte, j&#039;ai installé Apache et certaines bibliothèques requises par mon CMS, libxml2 et python-libxml2. J&#039;ai utilisé cette commande pour activer le mod rewrite, qui est également requis par mon CMS:\n$ sudo a2enmod rewrite</p>"},{"id":"text-5","type":"text","heading":"","plain_text":"Enfin, j&#39;ai copié sur chaque carte SD des scripts qui permettent à chaque Pi de synchroniser son contenu avec le développement Pi. Dans un cluster plus grand, il serait intéressant de créer une image de carte SD avec toutes ces modifications effectuées à l’avance.\nConstruire un équilibreur de charge\nL&#39;équilibreur de charge doit avoir deux interfaces réseau, une pour recevoir les demandes d&#39;un routeur et une autre interface réseau pour transmettre les demandes au cluster de serveurs. Les nœuds du cluster se trouvent sur un sous-réseau différent du reste du réseau. L&#39;adresse IP de la deuxième interface de l&#39;équilibreur de charge doit donc se trouver sur le même sous-réseau que le reste du cluster. La première interface de l&#39;équilibreur de charge a l&#39;adresse IP 192.168.0.3, tandis que l&#39;adresse IP de la deuxième interface est 192.168.1.1. Tous les Pies du cluster ont des adresses IP sur le sous-réseau 192.168.1.xxx.\nJ&#39;ai construit mon équilibreur de charge en utilisant un ancien PC doté de 512 Mo de RAM et d&#39;un processeur x86 à 2,7 GHz. J&#39;ai ajouté une deuxième carte Ethernet PCI et installé Lubuntu, une version allégée d&#39;Ubuntu. J&#39;allais installer Ubuntu, mais ce PC est assez ancien, donc Lubuntu est probablement un meilleur choix. J&#39;ai utilisé un PC parce que je ne savais pas si un seul Pi serait assez puissant pour jouer le rôle d&#39;équilibreur de charge, et un Pi ne dispose que d&#39;une seule connexion Ethernet. Je souhaite que les deux connexions réseau de mon équilibreur de charge soient Ethernet afin d&#39;améliorer les performances et la stabilité.\nNotez que le transfert IP n&#39;est pas activé. L&#39;équilibreur de charge n&#39;est pas un routeur, il ne doit transmettre que les requêtes HTTP et pas tous les paquets IP qu&#39;il reçoit. \nConfiguration du logiciel d&#39;équilibrage de charge\nIl existe de nombreuses implémentations logicielles d&#39;équilibrage de charge. J&#39;ai utilisé le module d&#39;équilibrage de charge d&#39;Apache car il est facile à configurer. Tout d&#39;abord, je me suis assuré que le système d&#39;exploitation de mon PC était à jour:\nsudo apt-get updatesudo apt-get upgrade","html":"<p>Enfin, j&#039;ai copié sur chaque carte SD des scripts qui permettent à chaque Pi de synchroniser son contenu avec le développement Pi. Dans un cluster plus grand, il serait intéressant de créer une image de carte SD avec toutes ces modifications effectuées à l’avance.\nConstruire un équilibreur de charge\nL&#039;équilibreur de charge doit avoir deux interfaces réseau, une pour recevoir les demandes d&#039;un routeur et une autre interface réseau pour transmettre les demandes au cluster de serveurs. Les nœuds du cluster se trouvent sur un sous-réseau différent du reste du réseau. L&#039;adresse IP de la deuxième interface de l&#039;équilibreur de charge doit donc se trouver sur le même sous-réseau que le reste du cluster. La première interface de l&#039;équilibreur de charge a l&#039;adresse IP 192.168.0.3, tandis que l&#039;adresse IP de la deuxième interface est 192.168.1.1. Tous les Pies du cluster ont des adresses IP sur le sous-réseau 192.168.1.xxx.\nJ&#039;ai construit mon équilibreur de charge en utilisant un ancien PC doté de 512 Mo de RAM et d&#039;un processeur x86 à 2,7 GHz. J&#039;ai ajouté une deuxième carte Ethernet PCI et installé Lubuntu, une version allégée d&#039;Ubuntu. J&#039;allais installer Ubuntu, mais ce PC est assez ancien, donc Lubuntu est probablement un meilleur choix. J&#039;ai utilisé un PC parce que je ne savais pas si un seul Pi serait assez puissant pour jouer le rôle d&#039;équilibreur de charge, et un Pi ne dispose que d&#039;une seule connexion Ethernet. Je souhaite que les deux connexions réseau de mon équilibreur de charge soient Ethernet afin d&#039;améliorer les performances et la stabilité.\nNotez que le transfert IP n&#039;est pas activé. L&#039;équilibreur de charge n&#039;est pas un routeur, il ne doit transmettre que les requêtes HTTP et pas tous les paquets IP qu&#039;il reçoit. \nConfiguration du logiciel d&#039;équilibrage de charge\nIl existe de nombreuses implémentations logicielles d&#039;équilibrage de charge. J&#039;ai utilisé le module d&#039;équilibrage de charge d&#039;Apache car il est facile à configurer. Tout d&#039;abord, je me suis assuré que le système d&#039;exploitation de mon PC était à jour:\nsudo apt-get updatesudo apt-get upgrade</p>"},{"id":"text-6","type":"text","heading":"","plain_text":"Puis j&#39;ai installé Apache:\nsudo apt-get install apache2","html":"<p>Puis j&#039;ai installé Apache:\nsudo apt-get install apache2</p>"},{"id":"text-7","type":"text","heading":"","plain_text":"Ces modules Apache doivent être activés:\nproxy sudo a2enmodsudo a2enmod proxy_httpsudo a2enmod proxy_balancer","html":"<p>Ces modules Apache doivent être activés:\nproxy sudo a2enmodsudo a2enmod proxy_httpsudo a2enmod proxy_balancer</p>"},{"id":"text-8","type":"text","heading":"","plain_text":"L&#39;étape suivante consiste à modifier / etc / apache2 / sites-available / default afin de configurer l&#39;équilibreur de charge. Le module proxy est nécessaire pour le transfert HTTP, mais il est préférable de ne pas permettre à votre serveur de se comporter comme un proxy. Les spammeurs et les pirates informatiques utilisent souvent les serveurs proxy d&#39;autres personnes pour masquer leur adresse IP. Il est donc important de désactiver cette fonctionnalité en ajoutant cette ligne:\n\tProxyRequests off","html":"<p>L&#039;étape suivante consiste à modifier / etc / apache2 / sites-available / default afin de configurer l&#039;équilibreur de charge. Le module proxy est nécessaire pour le transfert HTTP, mais il est préférable de ne pas permettre à votre serveur de se comporter comme un proxy. Les spammeurs et les pirates informatiques utilisent souvent les serveurs proxy d&#039;autres personnes pour masquer leur adresse IP. Il est donc important de désactiver cette fonctionnalité en ajoutant cette ligne:\n\tProxyRequests off</p>"},{"id":"text-9","type":"text","heading":"","plain_text":"Bien que les demandes de proxy soient désactivées, le module de proxy est toujours activé et agit en tant que proxy inverse. Ensuite, définissez le cluster et ses membres en ajoutant ce code:","html":"<p>Bien que les demandes de proxy soient désactivées, le module de proxy est toujours activé et agit en tant que proxy inverse. Ensuite, définissez le cluster et ses membres en ajoutant ce code:</p>"},{"id":"text-10","type":"text","heading":"","plain_text":"BalancerMember http://192.168.1.2:80\nBalancerMember http://192.168.1.3:80\nBalancerMember http://192.168.1.4:80\nBalancerMember http://192.168.1.5:80","html":"<p>BalancerMember http://192.168.1.2:80\nBalancerMember http://192.168.1.3:80\nBalancerMember http://192.168.1.4:80\nBalancerMember http://192.168.1.5:80</p>"},{"id":"text-11","type":"text","heading":"","plain_text":"AllowOverride None\nOrdre permettre, refuser\npermettre à tous","html":"<p>AllowOverride None\nOrdre permettre, refuser\npermettre à tous</p>"},{"id":"text-12","type":"text","heading":"","plain_text":"ProxySet lbmethod = byrequests","html":"<p>ProxySet lbmethod = byrequests</p>"},{"id":"text-13","type":"text","heading":"","plain_text":"Interface du gestionnaire d&#39;équilibrage\nLe module d&#39;équilibrage dispose d&#39;une interface Web permettant de surveiller l&#39;état des serveurs principaux et de configurer leurs paramètres. Vous pouvez activer l&#39;interface Web en ajoutant ce code à / etc / apache2 / sites-available / default:","html":"<p>Interface du gestionnaire d&#039;équilibrage\nLe module d&#039;équilibrage dispose d&#039;une interface Web permettant de surveiller l&#039;état des serveurs principaux et de configurer leurs paramètres. Vous pouvez activer l&#039;interface Web en ajoutant ce code à / etc / apache2 / sites-available / default:</p>"},{"id":"text-14","type":"text","heading":"","plain_text":"SetHandler balancer-manager","html":"<p>SetHandler balancer-manager</p>"},{"id":"text-15","type":"text","heading":"","plain_text":"Ordre permettre, refuser\nautoriser à partir de 192.168.0","html":"<p>Ordre permettre, refuser\nautoriser à partir de 192.168.0</p>"},{"id":"text-16","type":"text","heading":"","plain_text":"Il est également nécessaire de demander à Apache de gérer localement les demandes adressées à la page / balancer-manager au lieu de les transférer à un serveur de travail. Toutes les autres demandes sont transférées au cluster défini ci-dessus.","html":"<p>Il est également nécessaire de demander à Apache de gérer localement les demandes adressées à la page / balancer-manager au lieu de les transférer à un serveur de travail. Toutes les autres demandes sont transférées au cluster défini ci-dessus.</p>"},{"id":"text-17","type":"text","heading":"","plain_text":"ProxyPass / balancer-manager!\nProxyPass / balancer: // rpicluster /","html":"<p>ProxyPass / balancer-manager!\nProxyPass / balancer: // rpicluster /</p>"},{"id":"text-18","type":"text","heading":"","plain_text":"Une fois ces modifications enregistrées, Apache doit être redémarré avec cette commande:\n$ sudo /etc/init.d/apache2 restart","html":"<p>Une fois ces modifications enregistrées, Apache doit être redémarré avec cette commande:\n$ sudo /etc/init.d/apache2 restart</p>"},{"id":"text-19","type":"text","heading":"","plain_text":"lorsque j&#39;ouvre un navigateur et que je visite http://192.168.0.3, je vois la page d&#39;accueil de mon site Web. Si je vais à http://192.168.0.3/balancer-manager, je vois cette page dans l&#39;image à droite.\nLa dernière étape pour mettre le cluster en ligne consiste à ajuster les paramètres de redirection de port dans mon routeur. Je devais juste configurer une règle pour transférer les paquets HTTP vers http://192.168.0.3.\nVoici l&#39;intégralité de / etc / apache2 / sites-available / default pour l&#39;équilibreur de charge:","html":"<p>lorsque j&#039;ouvre un navigateur et que je visite http://192.168.0.3, je vois la page d&#039;accueil de mon site Web. Si je vais à http://192.168.0.3/balancer-manager, je vois cette page dans l&#039;image à droite.\nLa dernière étape pour mettre le cluster en ligne consiste à ajuster les paramètres de redirection de port dans mon routeur. Je devais juste configurer une règle pour transférer les paquets HTTP vers http://192.168.0.3.\nVoici l&#039;intégralité de / etc / apache2 / sites-available / default pour l&#039;équilibreur de charge:</p>"},{"id":"text-20","type":"text","heading":"","plain_text":"Webmaster ServerAdmin @ localhost","html":"<p>Webmaster ServerAdmin @ localhost</p>"},{"id":"text-21","type":"text","heading":"","plain_text":"DocumentRoot / var / www\n\t\n\t\tOptions FollowSymLinks\nAllowOverride All\n\t\n\t\n\t\t\n\t\t\n\t\t\n\t\tOptions Index FollowSymLinks MultiViews\nAllowOverride All\nOrdre permettre, refuser\npermettre à tous","html":"<p>DocumentRoot / var / www\n\t\n\t\tOptions FollowSymLinks\nAllowOverride All\n\t\n\t\n\t\t\n\t\t\n\t\t\n\t\tOptions Index FollowSymLinks MultiViews\nAllowOverride All\nOrdre permettre, refuser\npermettre à tous</p>"},{"id":"text-22","type":"text","heading":"","plain_text":"ScriptAlias ​​/ cgi-bin / / usr / lib / cgi-bin /\n\t\n\t\tAllowOverride None\nOptions + ExecCGI -MultiViews + SymLinksIfOwnerMatch\n                AddHandler cgi-script .py\nOrdre permettre, refuser\nAutoriser de tous","html":"<p>ScriptAlias ​​/ cgi-bin / / usr / lib / cgi-bin /\n\t\n\t\tAllowOverride None\nOptions + ExecCGI -MultiViews + SymLinksIfOwnerMatch\n                AddHandler cgi-script .py\nOrdre permettre, refuser\nAutoriser de tous</p>"},{"id":"text-23","type":"text","heading":"","plain_text":"ProxyRequests Off","html":"<p>ProxyRequests Off</p>"},{"id":"text-24","type":"text","heading":"","plain_text":"BalancerMember http://192.168.1.2:80\n                BalancerMember http://192.168.1.3:80\n                BalancerMember http://192.168.1.4:80\n                BalancerMember http://192.168.1.5:80","html":"<p>BalancerMember http://192.168.1.2:80\n                BalancerMember http://192.168.1.3:80\n                BalancerMember http://192.168.1.4:80\n                BalancerMember http://192.168.1.5:80</p>"},{"id":"text-25","type":"text","heading":"","plain_text":"                AllowOverride None\n                Ordre permettre, refuser\n                permettre à tous","html":"<p>                AllowOverride None\n                Ordre permettre, refuser\n                permettre à tous</p>"},{"id":"text-26","type":"text","heading":"","plain_text":"                ProxySet lbmethod = byrequests","html":"<p>                ProxySet lbmethod = byrequests</p>"},{"id":"text-27","type":"text","heading":"","plain_text":"SetHandler balancer-manager","html":"<p>SetHandler balancer-manager</p>"},{"id":"text-28","type":"text","heading":"","plain_text":"                Ordre permettre, refuser\n                autoriser à partir de 192.168.0","html":"<p>                Ordre permettre, refuser\n                autoriser à partir de 192.168.0</p>"},{"id":"text-29","type":"text","heading":"","plain_text":"ProxyPass / balancer-manager!\n        ProxyPass / balancer: // rpicluster /","html":"<p>ProxyPass / balancer-manager!\n        ProxyPass / balancer: // rpicluster /</p>"},{"id":"text-30","type":"text","heading":"","plain_text":"ErrorLog $ APACHE_LOG_DIR /error.log","html":"<p>ErrorLog $ APACHE_LOG_DIR /error.log</p>"},{"id":"text-31","type":"text","heading":"","plain_text":"# Les valeurs possibles incluent: debug, info, notice, avertir, erreur, crit,\n# alerte, émergent.\nLogLevel avertir","html":"<p># Les valeurs possibles incluent: debug, info, notice, avertir, erreur, crit,\n# alerte, émergent.\nLogLevel avertir</p>"},{"id":"text-32","type":"text","heading":"","plain_text":"CustomLog $ APACHE_LOG_DIR /access.log combiné","html":"<p>CustomLog $ APACHE_LOG_DIR /access.log combiné</p>"},{"id":"text-33","type":"text","heading":"","plain_text":"commentaires","html":"<p>commentaires</p>"},{"id":"text-34","type":"text","heading":"","plain_text":"Maintenant que j&#39;ai construit un simple cluster de serveurs Raspberry Pi, il serait intéressant de voir combien de trafic il peut gérer par rapport à un seul Pi. Il existe de nombreux outils d&#39;analyse comparative de serveur disponibles. Je vais utiliser le siège.  \nUtiliser Siege pour tester les temps de réponse du serveur\nSiege est un programme qui peut être utilisé pour envoyer un grand nombre de demandes à un serveur Web. L’utilisation de la commande suivante enverra des requêtes HTTP à un serveur de mon réseau local:\nsiège -d10 -c10 -t1m http://192.168.0.10/spec.html","html":"<p>Maintenant que j&#039;ai construit un simple cluster de serveurs Raspberry Pi, il serait intéressant de voir combien de trafic il peut gérer par rapport à un seul Pi. Il existe de nombreux outils d&#039;analyse comparative de serveur disponibles. Je vais utiliser le siège.  \nUtiliser Siege pour tester les temps de réponse du serveur\nSiege est un programme qui peut être utilisé pour envoyer un grand nombre de demandes à un serveur Web. L’utilisation de la commande suivante enverra des requêtes HTTP à un serveur de mon réseau local:\nsiège -d10 -c10 -t1m http://192.168.0.10/spec.html</p>"},{"id":"text-35","type":"text","heading":"","plain_text":"L&#39;option -c spécifie qu&#39;il doit y avoir 10 utilisateurs simultanés à la fois. L&#39;option -d spécifie le délai maximum entre les demandes. Le délai réel est aléatoire, mais le sera dans le délai utilisé avec l&#39;option -d. L&#39;option -t indique au siège combien de temps le test devrait durer &#8211; 1 minute dans ce cas.\nDans chacun des tests que j&#39;ai effectués, j&#39;ai utilisé un délai maximum de 10 secondes et une durée totale de test de 1 minute. Tous les tests utilisaient le siège pour faire des demandes sur mon réseau local, pas via Internet.\nTest de l&#39;équilibreur de charge avec un seul Raspberry Pi\nJe voulais voir comment un seul Raspberry Pi gère le trafic avec et sans l&#39;équilibreur de charge. Je soupçonnais que l&#39;équilibreur de charge introduirait un léger retard, mais en réalité, un seul Pi semble fonctionner plus efficacement lorsqu&#39;il est derrière un équilibreur de charge. Il semble que les demandes soient mises en mémoire tampon avant d’atteindre le Pi. Ce graphique montre les temps de réponse moyens pour différents nombres d&#39;utilisateurs simultanés, avec et sans l&#39;équilibreur de charge:\nVoir comment les performances s&#39;améliorent avec plus de nœuds\nLe test suivant que j&#39;ai effectué a consisté à vérifier l&#39;évolution des performances en fonction de l&#39;ajout de nœuds au cluster. J&#39;ai effectué des tests avec un nombre variable d&#39;utilisateurs simultanés, mais pour des raisons de simplicité, je ne montrerai que les résultats des tests effectués avec 10 utilisateurs simultanés.\nCe graphique indique les temps de réponse maximum et minimum moyens pour un nombre croissant de noeuds de travail:\nComme vous pouvez le constater, le temps de réponse minimum ne s’améliore pas réellement car plusieurs nœuds sont ajoutés, ce qui est logique. Le temps de réponse minimum est aussi rapide que l&#39;un des nœuds du cluster, et l&#39;ajout de nœuds ne changera rien. \nLe temps de réponse maximal s&#39;est considérablement amélioré avec l&#39;ajout de nouveaux noeuds. L&#39;utilisation d&#39;un cluster a nettement augmenté la capacité de mon serveur.  \n    En savoir plus sur le siège.\ncommentaires","html":"<p>L&#039;option -c spécifie qu&#039;il doit y avoir 10 utilisateurs simultanés à la fois. L&#039;option -d spécifie le délai maximum entre les demandes. Le délai réel est aléatoire, mais le sera dans le délai utilisé avec l&#039;option -d. L&#039;option -t indique au siège combien de temps le test devrait durer &#8211; 1 minute dans ce cas.\nDans chacun des tests que j&#039;ai effectués, j&#039;ai utilisé un délai maximum de 10 secondes et une durée totale de test de 1 minute. Tous les tests utilisaient le siège pour faire des demandes sur mon réseau local, pas via Internet.\nTest de l&#039;équilibreur de charge avec un seul Raspberry Pi\nJe voulais voir comment un seul Raspberry Pi gère le trafic avec et sans l&#039;équilibreur de charge. Je soupçonnais que l&#039;équilibreur de charge introduirait un léger retard, mais en réalité, un seul Pi semble fonctionner plus efficacement lorsqu&#039;il est derrière un équilibreur de charge. Il semble que les demandes soient mises en mémoire tampon avant d’atteindre le Pi. Ce graphique montre les temps de réponse moyens pour différents nombres d&#039;utilisateurs simultanés, avec et sans l&#039;équilibreur de charge:\nVoir comment les performances s&#039;améliorent avec plus de nœuds\nLe test suivant que j&#039;ai effectué a consisté à vérifier l&#039;évolution des performances en fonction de l&#039;ajout de nœuds au cluster. J&#039;ai effectué des tests avec un nombre variable d&#039;utilisateurs simultanés, mais pour des raisons de simplicité, je ne montrerai que les résultats des tests effectués avec 10 utilisateurs simultanés.\nCe graphique indique les temps de réponse maximum et minimum moyens pour un nombre croissant de noeuds de travail:\nComme vous pouvez le constater, le temps de réponse minimum ne s’améliore pas réellement car plusieurs nœuds sont ajoutés, ce qui est logique. Le temps de réponse minimum est aussi rapide que l&#039;un des nœuds du cluster, et l&#039;ajout de nœuds ne changera rien. \nLe temps de réponse maximal s&#039;est considérablement amélioré avec l&#039;ajout de nouveaux noeuds. L&#039;utilisation d&#039;un cluster a nettement augmenté la capacité de mon serveur.  \n    En savoir plus sur le siège.\ncommentaires</p>"},{"id":"text-36","type":"text","heading":"","plain_text":"Dans mon dernier article sur les performances des grappes, je trouvais qu&#39;une grappe fonctionnait mieux qu&#39;un simple Pi, mais il restait encore beaucoup à faire. J&#39;ai modifié les fichiers de configuration d&#39;Apache et modifié le mode de fonctionnement de la mise en cache des pages dans mon CMS.\nDéplacer le cache de la page\nLe CMS que j&#39;ai écrit peut générer des pages de manière dynamique et peut mettre en cache des pages afin qu&#39;elles puissent être servies instantanément sans être assemblées. Seules les pages composées de HTML statique peuvent être mises en cache. Les pages contenant du contenu dynamique généré par des scripts exécutables ne sont pas mises en cache.\nLe cache de pages se trouvait dans / usr / share / cms / cache. L&#39;interpréteur Python devait être chargé pour servir les pages en cache à partir de / usr / share / cms / cache. Désormais, le répertoire racine du cache de pages est / var / www. Apache peut donc servir les pages en cache sans appeler Python pour exécuter le script CMS.  \nUn inconvénient est que le CMS ne peut plus compter le trafic de piste. Lorsque le CMS s&#39;exécutait chaque fois qu&#39;une page était demandée, une fonction était appelée pour incrémenter un nombre dans un fichier de données. Cela ne fonctionne pas maintenant que les pages peuvent être servies sans l&#39;exécution du CMS.\nDécharger les modules inutilisés\nL&#39;un des meilleurs moyens d&#39;améliorer les performances d&#39;Apache consiste à décharger des modules inutiles. Tout d&#39;abord, vous devez répertorier tous les modules actuellement chargés à l&#39;aide de cette commande:\napache2ctl -M","html":"<p>Dans mon dernier article sur les performances des grappes, je trouvais qu&#039;une grappe fonctionnait mieux qu&#039;un simple Pi, mais il restait encore beaucoup à faire. J&#039;ai modifié les fichiers de configuration d&#039;Apache et modifié le mode de fonctionnement de la mise en cache des pages dans mon CMS.\nDéplacer le cache de la page\nLe CMS que j&#039;ai écrit peut générer des pages de manière dynamique et peut mettre en cache des pages afin qu&#039;elles puissent être servies instantanément sans être assemblées. Seules les pages composées de HTML statique peuvent être mises en cache. Les pages contenant du contenu dynamique généré par des scripts exécutables ne sont pas mises en cache.\nLe cache de pages se trouvait dans / usr / share / cms / cache. L&#039;interpréteur Python devait être chargé pour servir les pages en cache à partir de / usr / share / cms / cache. Désormais, le répertoire racine du cache de pages est / var / www. Apache peut donc servir les pages en cache sans appeler Python pour exécuter le script CMS.  \nUn inconvénient est que le CMS ne peut plus compter le trafic de piste. Lorsque le CMS s&#039;exécutait chaque fois qu&#039;une page était demandée, une fonction était appelée pour incrémenter un nombre dans un fichier de données. Cela ne fonctionne pas maintenant que les pages peuvent être servies sans l&#039;exécution du CMS.\nDécharger les modules inutilisés\nL&#039;un des meilleurs moyens d&#039;améliorer les performances d&#039;Apache consiste à décharger des modules inutiles. Tout d&#039;abord, vous devez répertorier tous les modules actuellement chargés à l&#039;aide de cette commande:\napache2ctl -M</p>"},{"id":"text-37","type":"text","heading":"","plain_text":"Il peut être difficile de déterminer quels modules sont utilisés. Cela dépend vraiment des directives utilisées dans les fichiers .htaccess et les fichiers hôtes virtuels. Par exemple, si vous désactivez authz_host_module, les directives Allow, Order et Deny ne fonctionneront pas. Chaque fois que vous désactivez un module, redémarrez Apache avec les commandes suivantes:","html":"<p>Il peut être difficile de déterminer quels modules sont utilisés. Cela dépend vraiment des directives utilisées dans les fichiers .htaccess et les fichiers hôtes virtuels. Par exemple, si vous désactivez authz_host_module, les directives Allow, Order et Deny ne fonctionneront pas. Chaque fois que vous désactivez un module, redémarrez Apache avec les commandes suivantes:</p>"},{"id":"text-38","type":"text","heading":"","plain_text":"$ sudo service apache2 stop\n$ sudo service apache2 start","html":"<p>$ sudo service apache2 stop\n$ sudo service apache2 start</p>"},{"id":"text-39","type":"text","heading":"","plain_text":"Vous pouvez utiliser &#39;redémarrer&#39; au lieu de &#39;démarrer&#39; et &#39;arrêter&#39;, mais certaines variables nécessitent l&#39;arrêt d&#39;Apache avant de pouvoir être mises à jour. Il est judicieux de tester votre site avant de désactiver d&#39;autres modules. J&#39;ai désactivé ces modules:","html":"<p>Vous pouvez utiliser &#039;redémarrer&#039; au lieu de &#039;démarrer&#039; et &#039;arrêter&#039;, mais certaines variables nécessitent l&#039;arrêt d&#039;Apache avant de pouvoir être mises à jour. Il est judicieux de tester votre site avant de désactiver d&#039;autres modules. J&#039;ai désactivé ces modules:</p>"},{"id":"text-40","type":"text","heading":"","plain_text":"$ sudo a2dismod autoindex\n$ sudo a2dismod auth_basic\nstatut sudo a2dismod\n$ sudo a2dismod dégonfler\n$ sudo a2dismod ssl\n$ sudo a2dismod authz_default","html":"<p>$ sudo a2dismod autoindex\n$ sudo a2dismod auth_basic\nstatut sudo a2dismod\n$ sudo a2dismod dégonfler\n$ sudo a2dismod ssl\n$ sudo a2dismod authz_default</p>"},{"id":"text-41","type":"text","heading":"","plain_text":"Si vous trouvez qu&#39;un module est requis, vous pouvez le réactiver avec la commande a2enmod comme ceci:\n$ sudo a2enmod authz_host","html":"<p>Si vous trouvez qu&#039;un module est requis, vous pouvez le réactiver avec la commande a2enmod comme ceci:\n$ sudo a2enmod authz_host</p>"},{"id":"text-42","type":"text","heading":"","plain_text":"Réduire le délai d&#39;attente\nJe règle le délai d&#39;attente dans /etc/apache2/apache2.conf sur 30. Cela évite que des requêtes simultanées n&#39;occupent de la mémoire pendant de longues périodes et réduise l&#39;utilisation de la mémoire.\nAjuster les processus Apache\nApache a plusieurs modèles de multitraitement différents. Ils utilisent chacun un nombre de processus serveur et de fils enfants pour gérer les requêtes HTTP.\nMPM worker est la configuration la plus moderne. MPM prefork était auparavant la norme, mais MPM Worker offre de meilleures performances et une meilleure utilisation de la mémoire. Utilisez cette commande pour vérifier le mode dans lequel se trouve Apache: \n$ sudo apache2 -V","html":"<p>Réduire le délai d&#039;attente\nJe règle le délai d&#039;attente dans /etc/apache2/apache2.conf sur 30. Cela évite que des requêtes simultanées n&#039;occupent de la mémoire pendant de longues périodes et réduise l&#039;utilisation de la mémoire.\nAjuster les processus Apache\nApache a plusieurs modèles de multitraitement différents. Ils utilisent chacun un nombre de processus serveur et de fils enfants pour gérer les requêtes HTTP.\nMPM worker est la configuration la plus moderne. MPM prefork était auparavant la norme, mais MPM Worker offre de meilleures performances et une meilleure utilisation de la mémoire. Utilisez cette commande pour vérifier le mode dans lequel se trouve Apache: \n$ sudo apache2 -V</p>"},{"id":"text-43","type":"text","heading":"","plain_text":"Une partie de la sortie ressemblera à ceci:","html":"<p>Une partie de la sortie ressemblera à ceci:</p>"},{"id":"text-44","type":"text","heading":"","plain_text":"Serveur MPM: Travailleur\n  fileté: oui (nombre de threads fixe)\n    forké: oui (nombre de processus variable)","html":"<p>Serveur MPM: Travailleur\n  fileté: oui (nombre de threads fixe)\n    forké: oui (nombre de processus variable)</p>"},{"id":"text-45","type":"text","heading":"","plain_text":"Voici les paramètres par défaut pour MPM Worker:","html":"<p>Voici les paramètres par défaut pour MPM Worker:</p>"},{"id":"text-46","type":"text","heading":"","plain_text":"StartServers 5\n    MinSpareThreads 25\n    MaxSpareThreads 75\n    ThreadLimit 64\n    ThreadsPerChild 25\n    MaxClients 150\n    MaxRequestsPerChild 0","html":"<p>StartServers 5\n    MinSpareThreads 25\n    MaxSpareThreads 75\n    ThreadLimit 64\n    ThreadsPerChild 25\n    MaxClients 150\n    MaxRequestsPerChild 0</p>"},{"id":"text-47","type":"text","heading":"","plain_text":"La taille des processus Apache varie en fonction du contenu servi et des scripts éventuellement en cours d&#39;exécution. Cette commande indique le nombre de processus Apache et leur taille:\nps aux | grep &#39;apache2&#39;","html":"<p>La taille des processus Apache varie en fonction du contenu servi et des scripts éventuellement en cours d&#039;exécution. Cette commande indique le nombre de processus Apache et leur taille:\nps aux | grep &#039;apache2&#039;</p>"},{"id":"text-48","type":"text","heading":"","plain_text":"La 6ème colonne contient la quantité de mémoire utilisée par chaque processus. En divisant la quantité de mémoire de secours par la taille du processus Apache moyen, vous obtenez une indication approximative du nombre maximal de processus serveur que vous pouvez exécuter. Chaque Pi de mon cluster a environ 280 Mo de RAM libre, et la taille moyenne des processus Apache est d’environ 7 Mo. 280 divisé par 7 donne 40. \nStartServers est le nombre de threads de serveur créés par Apache au démarrage. La création de nouveaux processus de serveur peut prendre beaucoup de temps. Je souhaite donc qu&#39;Apache démarre beaucoup de processus de serveur au démarrage. Cela signifie qu&#39;il n&#39;aura pas à passer du temps à créer plus de processus alors qu&#39;il est occupé à traiter beaucoup de trafic. J&#39;ai mis StartServers à 40.  \nJe ne veux pas qu&#39;Apache puisse créer trop de processus, car mon Pi risque de manquer de mémoire, j&#39;ai donc défini ServerLimit sur 40.\nChaque processus serveur peut avoir un nombre variable de threads. Ce sont les threads qui traitent réellement les demandes. J&#39;ai fixé le nombre de threads par enfant à 8 par défaut. Je n&#39;ai pas calculé cela, j&#39;ai simplement essayé plusieurs nombres et effectué de nombreux tests avec siege jusqu&#39;à ce que je trouve la valeur optimale.\nLe nombre total de threads est le nombre de processus serveur multiplié par ThreadsPerChild, ce qui correspond à 320 avec mes paramètres. J&#39;ai défini MaxClients sur 320 pour empêcher Apache de créer des threads supplémentaires.\nCes paramètres obligeront Apache à créer de nombreux processus et threads qui ne seront pas utilisés immédiatement. Afin d&#39;empêcher Apache de les supprimer, j&#39;ai défini MaxSpareThreads sur 320.\nMaxRequestsPerChild est le nombre de demandes qu&#39;un processus doit gérer avant d&#39;être tué et qu&#39;un processus de remplacement ne soit démarré. Ceci est fait pour empêcher les fuites de mémoire d&#39;accumuler de grandes quantités de mémoire. Il doit être défini sur le nombre de hits qu&#39;un serveur reçoit par jour afin que les processus soient redémarrés une fois par jour.  \nLes paramètres de MPM Worker sont maintenant","html":"<p>La 6ème colonne contient la quantité de mémoire utilisée par chaque processus. En divisant la quantité de mémoire de secours par la taille du processus Apache moyen, vous obtenez une indication approximative du nombre maximal de processus serveur que vous pouvez exécuter. Chaque Pi de mon cluster a environ 280 Mo de RAM libre, et la taille moyenne des processus Apache est d’environ 7 Mo. 280 divisé par 7 donne 40. \nStartServers est le nombre de threads de serveur créés par Apache au démarrage. La création de nouveaux processus de serveur peut prendre beaucoup de temps. Je souhaite donc qu&#039;Apache démarre beaucoup de processus de serveur au démarrage. Cela signifie qu&#039;il n&#039;aura pas à passer du temps à créer plus de processus alors qu&#039;il est occupé à traiter beaucoup de trafic. J&#039;ai mis StartServers à 40.  \nJe ne veux pas qu&#039;Apache puisse créer trop de processus, car mon Pi risque de manquer de mémoire, j&#039;ai donc défini ServerLimit sur 40.\nChaque processus serveur peut avoir un nombre variable de threads. Ce sont les threads qui traitent réellement les demandes. J&#039;ai fixé le nombre de threads par enfant à 8 par défaut. Je n&#039;ai pas calculé cela, j&#039;ai simplement essayé plusieurs nombres et effectué de nombreux tests avec siege jusqu&#039;à ce que je trouve la valeur optimale.\nLe nombre total de threads est le nombre de processus serveur multiplié par ThreadsPerChild, ce qui correspond à 320 avec mes paramètres. J&#039;ai défini MaxClients sur 320 pour empêcher Apache de créer des threads supplémentaires.\nCes paramètres obligeront Apache à créer de nombreux processus et threads qui ne seront pas utilisés immédiatement. Afin d&#039;empêcher Apache de les supprimer, j&#039;ai défini MaxSpareThreads sur 320.\nMaxRequestsPerChild est le nombre de demandes qu&#039;un processus doit gérer avant d&#039;être tué et qu&#039;un processus de remplacement ne soit démarré. Ceci est fait pour empêcher les fuites de mémoire d&#039;accumuler de grandes quantités de mémoire. Il doit être défini sur le nombre de hits qu&#039;un serveur reçoit par jour afin que les processus soient redémarrés une fois par jour.  \nLes paramètres de MPM Worker sont maintenant</p>"},{"id":"text-49","type":"text","heading":"","plain_text":"StartServers 40\n    ServerLimit 40\n    MinSpareThreads 25\n    MaxSpareThreads 320\n    ThreadLimit 64\n    ThreadsPerChild 8\n    MaxClients 320\n    MaxRequestsPerChild 2000","html":"<p>StartServers 40\n    ServerLimit 40\n    MinSpareThreads 25\n    MaxSpareThreads 320\n    ThreadLimit 64\n    ThreadsPerChild 8\n    MaxClients 320\n    MaxRequestsPerChild 2000</p>"},{"id":"text-50","type":"text","heading":"","plain_text":"Avant de modifier le système de mise en cache, un test de siège avec seulement 25 utilisateurs simultanés a permis d&#39;obtenir les résultats suivants:","html":"<p>Avant de modifier le système de mise en cache, un test de siège avec seulement 25 utilisateurs simultanés a permis d&#039;obtenir les résultats suivants:</p>"},{"id":"text-51","type":"text","heading":"","plain_text":"Lever le siège du serveur ... c&#39;est fait.\nTransactions: 30 hits\nDisponibilité: 100.00%\nTemps écoulé: 59.79 secondes\nDonnées transférées: 0,08 Mo\nTemps de réponse: 26.07 secondes\nTaux de transaction: 0.50 trans / sec\nDébit: 0.00 Mo / sec\nAccès simultané: 13.08\nTransactions réussies: 30\nTransactions échouées: 0\nLa plus longue transaction: 29.32\nOpération la plus courte: 14.03","html":"<p>Lever le siège du serveur ... c&#039;est fait.\nTransactions: 30 hits\nDisponibilité: 100.00%\nTemps écoulé: 59.79 secondes\nDonnées transférées: 0,08 Mo\nTemps de réponse: 26.07 secondes\nTaux de transaction: 0.50 trans / sec\nDébit: 0.00 Mo / sec\nAccès simultané: 13.08\nTransactions réussies: 30\nTransactions échouées: 0\nLa plus longue transaction: 29.32\nOpération la plus courte: 14.03</p>"},{"id":"text-52","type":"text","heading":"","plain_text":"Après avoir amélioré le système de mise en cache, j&#39;ai testé un seul nœud avec 200 utilisateurs simultanés à l&#39;aide de cette commande:\n$ siege -d1 -c200 -t1m http://192.168.0.4/specs.html","html":"<p>Après avoir amélioré le système de mise en cache, j&#039;ai testé un seul nœud avec 200 utilisateurs simultanés à l&#039;aide de cette commande:\n$ siege -d1 -c200 -t1m http://192.168.0.4/specs.html</p>"},{"id":"text-53","type":"text","heading":"","plain_text":"Les résultats ont été","html":"<p>Les résultats ont été</p>"},{"id":"text-54","type":"text","heading":"","plain_text":"Lever le siège du serveur ... c&#39;est fait.\nTransactions: 6492 hits\nDisponibilité: 100.00%\nTemps écoulé: 59.28 secondes\nDonnées transférées: 38,86 MB\nTemps de réponse: 1,29 secondes\nTaux de transaction: 109,51 trans / s\nDébit: 0.66 Mo / sec\nAccès simultané: 141,10\nTransactions réussies: 6492\nTransactions échouées: 0\nLa transaction la plus longue: 11.23\nOpération la plus courte: 0,32","html":"<p>Lever le siège du serveur ... c&#039;est fait.\nTransactions: 6492 hits\nDisponibilité: 100.00%\nTemps écoulé: 59.28 secondes\nDonnées transférées: 38,86 MB\nTemps de réponse: 1,29 secondes\nTaux de transaction: 109,51 trans / s\nDébit: 0.66 Mo / sec\nAccès simultané: 141,10\nTransactions réussies: 6492\nTransactions échouées: 0\nLa transaction la plus longue: 11.23\nOpération la plus courte: 0,32</p>"},{"id":"text-55","type":"text","heading":"","plain_text":"Après avoir redémarré Apache avec les modifications de configuration et exécuté à nouveau le même test, j&#39;ai obtenu les résultats suivants:","html":"<p>Après avoir redémarré Apache avec les modifications de configuration et exécuté à nouveau le même test, j&#039;ai obtenu les résultats suivants:</p>"},{"id":"text-56","type":"text","heading":"","plain_text":"Lever le siège du serveur ... c&#39;est fait.\nTransactions: 6449 visites\nDisponibilité: 100.00%\nTemps écoulé: 59.53 secondes\nDonnées transférées: 38,60 MB\nTemps de réponse: 1,31 seconde\nTaux de transaction: 108.33 trans / sec\nDébit: 0.65 MB / sec\nAccès simultané: 142.32\nTransactions réussies: 6449\nTransactions échouées: 0\nLa transaction la plus longue: 4.16\nOpération la plus courte: 0.01","html":"<p>Lever le siège du serveur ... c&#039;est fait.\nTransactions: 6449 visites\nDisponibilité: 100.00%\nTemps écoulé: 59.53 secondes\nDonnées transférées: 38,60 MB\nTemps de réponse: 1,31 seconde\nTaux de transaction: 108.33 trans / sec\nDébit: 0.65 MB / sec\nAccès simultané: 142.32\nTransactions réussies: 6449\nTransactions échouées: 0\nLa transaction la plus longue: 4.16\nOpération la plus courte: 0.01</p>"},{"id":"text-57","type":"text","heading":"","plain_text":"Après avoir optimisé la mise en cache des pages, supprimé les modules inutilisés d’Apache et optimisé le processus du serveur, le nombre de transactions par seconde pour un seul nœud est passé de 0,5 à plus de cent. Le nombre de demandes de connexion pouvant être traitées a été multiplié par 8.\nLe réglage des processus Apache a entraîné une très légère diminution du nombre de transactions par seconde, mais le temps de transaction le plus long a considérablement diminué.\nTester l&#39;ensemble du cluster\nUne fois satisfait de mes nouveaux paramètres, je les ai transférés dans l&#39;ensemble du cluster. J&#39;ai fait plus de tests avec siege, d&#39;abord avec 200 utilisateurs simultanés:","html":"<p>Après avoir optimisé la mise en cache des pages, supprimé les modules inutilisés d’Apache et optimisé le processus du serveur, le nombre de transactions par seconde pour un seul nœud est passé de 0,5 à plus de cent. Le nombre de demandes de connexion pouvant être traitées a été multiplié par 8.\nLe réglage des processus Apache a entraîné une très légère diminution du nombre de transactions par seconde, mais le temps de transaction le plus long a considérablement diminué.\nTester l&#039;ensemble du cluster\nUne fois satisfait de mes nouveaux paramètres, je les ai transférés dans l&#039;ensemble du cluster. J&#039;ai fait plus de tests avec siege, d&#039;abord avec 200 utilisateurs simultanés:</p>"},{"id":"text-58","type":"text","heading":"","plain_text":"Lever le siège du serveur ... c&#39;est fait.\nTransactions: 23218 hits\nDisponibilité: 100.00%\nTemps écoulé: 59.26 secondes\nDonnées transférées: 48,44 Mo\nTemps de réponse: 0.01 sec\nTaux de transaction: 391.80 trans / s\nDébit: 0.82 Mo / sec\nAccès simultané: 3,90\nTransactions réussies: 23218\nTransactions échouées: 0\nLa transaction la plus longue: 0,66\nLa transaction la plus courte: 0.00","html":"<p>Lever le siège du serveur ... c&#039;est fait.\nTransactions: 23218 hits\nDisponibilité: 100.00%\nTemps écoulé: 59.26 secondes\nDonnées transférées: 48,44 Mo\nTemps de réponse: 0.01 sec\nTaux de transaction: 391.80 trans / s\nDébit: 0.82 Mo / sec\nAccès simultané: 3,90\nTransactions réussies: 23218\nTransactions échouées: 0\nLa transaction la plus longue: 0,66\nLa transaction la plus courte: 0.00</p>"},{"id":"text-59","type":"text","heading":"","plain_text":"&#8230; et ensuite avec 800 utilisateurs simultanés:","html":"<p>&#8230; et ensuite avec 800 utilisateurs simultanés:</p>"},{"id":"text-60","type":"text","heading":"","plain_text":"Lever le siège du serveur ... c&#39;est fait.\nTransactions: 56899 visites\nDisponibilité: 100.00%\nTemps écoulé: 60.05 secondes\nDonnées transférées: 118,59 Mo\nTemps de réponse: 0.34 sec\nTaux de transaction: 947,53 trans / s\nDébit: 1,97 Mo / sec\nAccès simultané: 317.44\nTransactions réussies: 56899\nTransactions échouées: 0\nLa transaction la plus longue: 9.71\nLa transaction la plus courte: 0.00","html":"<p>Lever le siège du serveur ... c&#039;est fait.\nTransactions: 56899 visites\nDisponibilité: 100.00%\nTemps écoulé: 60.05 secondes\nDonnées transférées: 118,59 Mo\nTemps de réponse: 0.34 sec\nTaux de transaction: 947,53 trans / s\nDébit: 1,97 Mo / sec\nAccès simultané: 317.44\nTransactions réussies: 56899\nTransactions échouées: 0\nLa transaction la plus longue: 9.71\nLa transaction la plus courte: 0.00</p>"},{"id":"text-61","type":"text","heading":"","plain_text":"Avant de paramétrer Apache, le cluster pouvait gérer 350 demandes simultanées et le taux de transaction maximal était de 460 transactions par seconde. Le nombre maximal d&#39;utilisateurs simultanés avec un taux de réussite de 100% est désormais de 800. Le nombre maximal de transactions par seconde est maintenant de 947.\nJe surveillerai attentivement la quantité de mémoire disponible au cours des prochains jours. Si le niveau commence à devenir trop bas, je vais réduire certains de ces paramètres.\nL&#39;utilisation du siège n&#39;est pas complètement réaliste. Une demande émanant d&#39;un navigateur impose au serveur une charge beaucoup plus importante qu&#39;une demande émanant d&#39;un siège, et la synchronisation des tests en état de siège diffère de celle du trafic réel. Les tests effectués en utilisant le siège ne prédisent pas le nombre de requêtes qu&#39;un serveur peut gérer. Des tests comme ceux-ci fournissent une base de comparaison des différentes configurations de serveur. Je ne pense pas que mon cluster puisse gérer 947 visiteurs réels par seconde, mais je suis convaincu que les performances de mon serveur sont meilleures que celles enregistrées auparavant.\ncommentaires","html":"<p>Avant de paramétrer Apache, le cluster pouvait gérer 350 demandes simultanées et le taux de transaction maximal était de 460 transactions par seconde. Le nombre maximal d&#039;utilisateurs simultanés avec un taux de réussite de 100% est désormais de 800. Le nombre maximal de transactions par seconde est maintenant de 947.\nJe surveillerai attentivement la quantité de mémoire disponible au cours des prochains jours. Si le niveau commence à devenir trop bas, je vais réduire certains de ces paramètres.\nL&#039;utilisation du siège n&#039;est pas complètement réaliste. Une demande émanant d&#039;un navigateur impose au serveur une charge beaucoup plus importante qu&#039;une demande émanant d&#039;un siège, et la synchronisation des tests en état de siège diffère de celle du trafic réel. Les tests effectués en utilisant le siège ne prédisent pas le nombre de requêtes qu&#039;un serveur peut gérer. Des tests comme ceux-ci fournissent une base de comparaison des différentes configurations de serveur. Je ne pense pas que mon cluster puisse gérer 947 visiteurs réels par seconde, mais je suis convaincu que les performances de mon serveur sont meilleures que celles enregistrées auparavant.\ncommentaires</p>"},{"id":"text-62","type":"text","heading":"","plain_text":"Les temps de chargement des pages sont importants pour une bonne expérience utilisateur. Les gens sont plus impliqués avec les sites qui se chargent rapidement et visitent généralement plus de pages.\nPour que les pages se chargent rapidement, il ne suffit pas de rendre les serveurs Web plus rapides. Lorsque les navigateurs chargent des pages, ils doivent d’abord la télécharger à partir d’un serveur Web. Si la page fait référence à d&#39;autres fichiers, tels que CSS, Javascript et images, le navigateur doit également récupérer ces fichiers. Une fois que tous les fichiers ont été téléchargés, le navigateur doit rendre la page. Les pages peuvent être optimisées pour que les navigateurs puissent les charger rapidement et efficacement.\nCe type d’optimisation ne concerne pas le réglage du serveur, mais l’optimisation des pages de votre site afin que les navigateurs puissent les charger facilement. Cela implique de passer du temps à ajuster le modèle HTML d&#39;un site.\nGoogle PageSpeed ​​Insights est un bon endroit pour trouver des idées sur la façon d&#39;optimiser votre site. Vous pouvez utiliser PageSpeed ​​Insights pour analyser les pages d&#39;un site et déterminer des moyens d&#39;améliorer les temps de chargement des pages. PageSpeed ​​Insights donne des suggestions détaillées sur la manière d&#39;améliorer les performances. Un score de classement des pages est attribué à votre site, ce qui s’améliore à mesure que vous parcourez la liste des problèmes.\nCSS en ligne\nJ&#39;avais l&#39;habitude de garder le code CSS pour mon site dans un fichier séparé dans /var/www/default_theme.css. Il a été référencé dans la section head de mon modèle HTML avec cette ligne:","html":"<p>Les temps de chargement des pages sont importants pour une bonne expérience utilisateur. Les gens sont plus impliqués avec les sites qui se chargent rapidement et visitent généralement plus de pages.\nPour que les pages se chargent rapidement, il ne suffit pas de rendre les serveurs Web plus rapides. Lorsque les navigateurs chargent des pages, ils doivent d’abord la télécharger à partir d’un serveur Web. Si la page fait référence à d&#039;autres fichiers, tels que CSS, Javascript et images, le navigateur doit également récupérer ces fichiers. Une fois que tous les fichiers ont été téléchargés, le navigateur doit rendre la page. Les pages peuvent être optimisées pour que les navigateurs puissent les charger rapidement et efficacement.\nCe type d’optimisation ne concerne pas le réglage du serveur, mais l’optimisation des pages de votre site afin que les navigateurs puissent les charger facilement. Cela implique de passer du temps à ajuster le modèle HTML d&#039;un site.\nGoogle PageSpeed ​​Insights est un bon endroit pour trouver des idées sur la façon d&#039;optimiser votre site. Vous pouvez utiliser PageSpeed ​​Insights pour analyser les pages d&#039;un site et déterminer des moyens d&#039;améliorer les temps de chargement des pages. PageSpeed ​​Insights donne des suggestions détaillées sur la manière d&#039;améliorer les performances. Un score de classement des pages est attribué à votre site, ce qui s’améliore à mesure que vous parcourez la liste des problèmes.\nCSS en ligne\nJ&#039;avais l&#039;habitude de garder le code CSS pour mon site dans un fichier séparé dans /var/www/default_theme.css. Il a été référencé dans la section head de mon modèle HTML avec cette ligne:</p>"},{"id":"text-63","type":"text","heading":"","plain_text":"Lorsque les navigateurs chargeaient les pages de mon site, ceux-ci ne pouvaient plus afficher cette page tant qu&#39;ils n&#39;avaient pas fait une nouvelle demande à mon serveur et téléchargé le fichier CSS. J&#39;ai éliminé ce délai en incluant le code CSS directement dans la section head de mon modèle HTML. J&#39;ai ajouté les balises suivantes à la section d&#39;en-tête de mon modèle, puis ai collé le contenu de mon fichier CSS entre elles:","html":"<p>Lorsque les navigateurs chargeaient les pages de mon site, ceux-ci ne pouvaient plus afficher cette page tant qu&#039;ils n&#039;avaient pas fait une nouvelle demande à mon serveur et téléchargé le fichier CSS. J&#039;ai éliminé ce délai en incluant le code CSS directement dans la section head de mon modèle HTML. J&#039;ai ajouté les balises suivantes à la section d&#039;en-tête de mon modèle, puis ai collé le contenu de mon fichier CSS entre elles:</p>"},{"id":"text-64","type":"text","heading":"","plain_text":"Cela agrandit chaque page Web, mais réduit le nombre de demandes que mon serveur doit traiter. Cela signifie également que les navigateurs peuvent rendre la page plus efficacement.\nJavascript différé Chargement\nIl est assez courant de référencer les fichiers source javascript dans la section head d&#39;une page Web. J&#39;avais l&#39;habitude d&#39;avoir la balise suivante dans la tête de mon site afin que les images puissent être visionnées à l&#39;aide du plugin Javascript Lightbox:","html":"<p>Cela agrandit chaque page Web, mais réduit le nombre de demandes que mon serveur doit traiter. Cela signifie également que les navigateurs peuvent rendre la page plus efficacement.\nJavascript différé Chargement\nIl est assez courant de référencer les fichiers source javascript dans la section head d&#039;une page Web. J&#039;avais l&#039;habitude d&#039;avoir la balise suivante dans la tête de mon site afin que les images puissent être visionnées à l&#039;aide du plugin Javascript Lightbox:</p>"},{"id":"text-65","type":"text","heading":"","plain_text":"Le problème, c&#39;est que lorsqu&#39;une page est téléchargée, le navigateur doit suspendre le traitement de la page pour télécharger le fichier Javascript. Cela interrompt le navigateur avant qu&#39;il puisse commencer à afficher la page.\nLa solution consiste à déplacer les références aux fichiers Javascript &quot;en dessous du pli&quot;. J&#39;ai mis à jour mon modèle HTML pour inclure cette ligne juste après le pied de page plutôt que dans la section head. Lorsque les pages de mon site sont chargées dans un navigateur, la plupart des pages sont rendues avant que le navigateur ne doive obtenir le fichier Javascript.\nBoutons de partage Javascript asynchrones\nLes boutons de partage sont un excellent moyen d&#39;augmenter le trafic sur votre site. Les visiteurs cliquent sur les boutons de partage pour partager votre site avec leurs amis et leurs abonnés sur les réseaux sociaux, augmentant ainsi le trafic généré par votre site à partir des réseaux sociaux. Il existe de nombreuses sociétés fournissant des plugins pouvant être ajoutés à un site. L&#39;inconvénient de certains plugins de partage est qu&#39;ils peuvent réduire la vitesse de chargement de la page en raison de problèmes liés à Javascript.\nAu lieu d&#39;utiliser un seul plug-in pour afficher les boutons de partage, vous pouvez utiliser des boutons de différents sites. Chaque réseau social possède ses propres boutons de partage que vous pouvez utiliser pour mettre des boutons de partage sur votre site. La plupart d&#39;entre eux sont asynchrones (mais pas Reddit au moment de la rédaction). Les boutons asynchrones sont chargés après le rendu de la page, ce qui accélère son chargement.\nDepuis que j&#39;ai supprimé le plug-in de partage et que je l&#39;ai remplacé par des boutons de partage individuels, les temps de chargement des pages affichés dans Google Analytics sont devenus beaucoup plus cohérents et beaucoup plus courts.\nMinify CSS et Javascript\nLes fichiers CSS et Javascript contiennent souvent beaucoup d&#39;espaces, tels que des espaces et des caractères de nouvelle ligne. L&#39;utilisation d&#39;espaces permet de rendre le code plus lisible, mais ajoute également à la taille des fichiers. La suppression de caractères blancs rend le code illisible, mais peut considérablement réduire la charge de votre serveur. J&#39;ai décidé de ne pas minifier mon code CSS car je veux pouvoir le lire, mais j&#39;ai supprimé beaucoup d&#39;espaces, tout en préservant un formatage de base. Voici à quoi ressemblait mon code CSS:","html":"<p>Le problème, c&#039;est que lorsqu&#039;une page est téléchargée, le navigateur doit suspendre le traitement de la page pour télécharger le fichier Javascript. Cela interrompt le navigateur avant qu&#039;il puisse commencer à afficher la page.\nLa solution consiste à déplacer les références aux fichiers Javascript &quot;en dessous du pli&quot;. J&#039;ai mis à jour mon modèle HTML pour inclure cette ligne juste après le pied de page plutôt que dans la section head. Lorsque les pages de mon site sont chargées dans un navigateur, la plupart des pages sont rendues avant que le navigateur ne doive obtenir le fichier Javascript.\nBoutons de partage Javascript asynchrones\nLes boutons de partage sont un excellent moyen d&#039;augmenter le trafic sur votre site. Les visiteurs cliquent sur les boutons de partage pour partager votre site avec leurs amis et leurs abonnés sur les réseaux sociaux, augmentant ainsi le trafic généré par votre site à partir des réseaux sociaux. Il existe de nombreuses sociétés fournissant des plugins pouvant être ajoutés à un site. L&#039;inconvénient de certains plugins de partage est qu&#039;ils peuvent réduire la vitesse de chargement de la page en raison de problèmes liés à Javascript.\nAu lieu d&#039;utiliser un seul plug-in pour afficher les boutons de partage, vous pouvez utiliser des boutons de différents sites. Chaque réseau social possède ses propres boutons de partage que vous pouvez utiliser pour mettre des boutons de partage sur votre site. La plupart d&#039;entre eux sont asynchrones (mais pas Reddit au moment de la rédaction). Les boutons asynchrones sont chargés après le rendu de la page, ce qui accélère son chargement.\nDepuis que j&#039;ai supprimé le plug-in de partage et que je l&#039;ai remplacé par des boutons de partage individuels, les temps de chargement des pages affichés dans Google Analytics sont devenus beaucoup plus cohérents et beaucoup plus courts.\nMinify CSS et Javascript\nLes fichiers CSS et Javascript contiennent souvent beaucoup d&#039;espaces, tels que des espaces et des caractères de nouvelle ligne. L&#039;utilisation d&#039;espaces permet de rendre le code plus lisible, mais ajoute également à la taille des fichiers. La suppression de caractères blancs rend le code illisible, mais peut considérablement réduire la charge de votre serveur. J&#039;ai décidé de ne pas minifier mon code CSS car je veux pouvoir le lire, mais j&#039;ai supprimé beaucoup d&#039;espaces, tout en préservant un formatage de base. Voici à quoi ressemblait mon code CSS:</p>"},{"id":"text-66","type":"text","heading":"","plain_text":".navbar li","html":"<p>.navbar li</p>"},{"id":"text-67","type":"text","heading":"","plain_text":"    affichage: en ligne;\n    bordure gauche: noir 1px solide;\n    padding-left: 6px;","html":"<p>    affichage: en ligne;\n    bordure gauche: noir 1px solide;\n    padding-left: 6px;</p>"},{"id":"text-68","type":"text","heading":"","plain_text":"premier","html":"<p>premier</p>"},{"id":"text-69","type":"text","heading":"","plain_text":"    frontière gauche: aucune;","html":"<p>    frontière gauche: aucune;</p>"},{"id":"text-70","type":"text","heading":"","plain_text":".navbar li: premier enfant","html":"<p>.navbar li: premier enfant</p>"},{"id":"text-71","type":"text","heading":"","plain_text":"    bordure: aucune;","html":"<p>    bordure: aucune;</p>"},{"id":"text-72","type":"text","heading":"","plain_text":"Voici à quoi cela ressemble avec quelques espaces blancs supprimés:","html":"<p>Voici à quoi cela ressemble avec quelques espaces blancs supprimés:</p>"},{"id":"text-73","type":"text","heading":"","plain_text":".navbar li","html":"<p>.navbar li</p>"},{"id":"text-74","type":"text","heading":"","plain_text":" affichage: en ligne;\n bordure gauche: noir 1px solide;\n padding-left: 6px;","html":"<p> affichage: en ligne;\n bordure gauche: noir 1px solide;\n padding-left: 6px;</p>"},{"id":"text-75","type":"text","heading":"","plain_text":"premier","html":"<p>premier</p>"},{"id":"text-76","type":"text","heading":"","plain_text":" frontière gauche: aucune;","html":"<p> frontière gauche: aucune;</p>"},{"id":"text-77","type":"text","heading":"","plain_text":".navbar li: premier enfant","html":"<p>.navbar li: premier enfant</p>"},{"id":"text-78","type":"text","heading":"","plain_text":" bordure: aucune;","html":"<p> bordure: aucune;</p>"},{"id":"text-79","type":"text","heading":"","plain_text":"Le code Javascript peut également être minifié. Je n&#39;ai pas l&#39;intention de modifier le code Javascript, je l&#39;ai donc complètement minifié. Il existe deux fichiers JavaScript que les navigateurs téléchargent sur mon site chaque fois qu&#39;ils chargent une page, /js/lightbox.js, pour afficher des images, et /js/jquery-1.7.2.min.js. Le fichier jQuery est déjà minifié.\nLe code de la visionneuse n’est pas minifié par défaut, je suis donc allé à cet outil de minifier Javascipt et\na collé le code de lightbox.js dans la zone de saisie et a appuyé sur le bouton d&#39;envoi. J&#39;ai créé un nouveau fichier dans / var / www / js appelé lightbox.min.js et ai collé la sortie de l&#39;outil Minifier dans le fichier. J&#39;ai modifié le modèle HTML de mon site afin de référencer ce nouveau fichier au lieu de la version non modifiée d&#39;origine. La version non décomposée de ce fichier était de 11,6 Ko et la version agrandie de 6,2 Ko.\nTirer parti de la mise en cache du navigateur\nLes navigateurs Web peuvent mettre en cache les pages de sorte qu&#39;elles ne doivent plus être téléchargées si un utilisateur revient à une page déjà visitée. Vous pouvez indiquer aux navigateurs de mettre en cache des pages en envoyant un en-tête de contrôle avant que la page soit envoyée par le serveur. Cela nécessite quelques modifications à la configuration d&#39;Apache. Tout d&#39;abord, le module d&#39;en-têtes doit être installé:","html":"<p>Le code Javascript peut également être minifié. Je n&#039;ai pas l&#039;intention de modifier le code Javascript, je l&#039;ai donc complètement minifié. Il existe deux fichiers JavaScript que les navigateurs téléchargent sur mon site chaque fois qu&#039;ils chargent une page, /js/lightbox.js, pour afficher des images, et /js/jquery-1.7.2.min.js. Le fichier jQuery est déjà minifié.\nLe code de la visionneuse n’est pas minifié par défaut, je suis donc allé à cet outil de minifier Javascipt et\na collé le code de lightbox.js dans la zone de saisie et a appuyé sur le bouton d&#039;envoi. J&#039;ai créé un nouveau fichier dans / var / www / js appelé lightbox.min.js et ai collé la sortie de l&#039;outil Minifier dans le fichier. J&#039;ai modifié le modèle HTML de mon site afin de référencer ce nouveau fichier au lieu de la version non modifiée d&#039;origine. La version non décomposée de ce fichier était de 11,6 Ko et la version agrandie de 6,2 Ko.\nTirer parti de la mise en cache du navigateur\nLes navigateurs Web peuvent mettre en cache les pages de sorte qu&#039;elles ne doivent plus être téléchargées si un utilisateur revient à une page déjà visitée. Vous pouvez indiquer aux navigateurs de mettre en cache des pages en envoyant un en-tête de contrôle avant que la page soit envoyée par le serveur. Cela nécessite quelques modifications à la configuration d&#039;Apache. Tout d&#039;abord, le module d&#039;en-têtes doit être installé:</p>"},{"id":"text-80","type":"text","heading":"","plain_text":"$ sudo a2enmod headers","html":"<p>$ sudo a2enmod headers</p>"},{"id":"text-81","type":"text","heading":"","plain_text":"Ensuite, le code suivant doit être collé quelque part dans /etc/apache2/apache2.conf:","html":"<p>Ensuite, le code suivant doit être collé quelque part dans /etc/apache2/apache2.conf:</p>"},{"id":"text-82","type":"text","heading":"","plain_text":"Ensemble d&#39;en-têtes Cache-control &quot;public, max-age = 2592000&quot;","html":"<p>Ensemble d&#039;en-têtes Cache-control &quot;public, max-age = 2592000&quot;</p>"},{"id":"text-83","type":"text","heading":"","plain_text":"Ensemble d&#39;en-têtes Cache-control &quot;public, max-age = 604800&quot;","html":"<p>Ensemble d&#039;en-têtes Cache-control &quot;public, max-age = 604800&quot;</p>"},{"id":"text-84","type":"text","heading":"","plain_text":"Cela indique à Apache que tout fichier avec une terminaison .ico, .png, .gif, .jpg ou .js doit être mis en cache pendant 2592000 secondes (30 jours) et les fichiers avec une fin .html doivent être mis en cache pendant 604800 secondes (7 jours). . La dernière étape consiste à redémarrer Apache:","html":"<p>Cela indique à Apache que tout fichier avec une terminaison .ico, .png, .gif, .jpg ou .js doit être mis en cache pendant 2592000 secondes (30 jours) et les fichiers avec une fin .html doivent être mis en cache pendant 604800 secondes (7 jours). . La dernière étape consiste à redémarrer Apache:</p>"},{"id":"text-85","type":"text","heading":"","plain_text":"$ sudo service apache2 restart","html":"<p>$ sudo service apache2 restart</p>"},{"id":"text-86","type":"text","heading":"","plain_text":"J&#39;ai exécuté cette commande sur un autre ordinateur pour m&#39;assurer que la mise en cache fonctionnait correctement:","html":"<p>J&#039;ai exécuté cette commande sur un autre ordinateur pour m&#039;assurer que la mise en cache fonctionnait correctement:</p>"},{"id":"text-87","type":"text","heading":"","plain_text":"$ wget --save-headers http://raspberrywebserver.com/feed-icon-14x14.png","html":"<p>$ wget --save-headers http://raspberrywebserver.com/feed-icon-14x14.png</p>"},{"id":"text-88","type":"text","heading":"","plain_text":"Lorsque j&#39;ai ouvert le fichier téléchargé dans un éditeur de texte, ces en-têtes HTTP se trouvaient en haut:","html":"<p>Lorsque j&#039;ai ouvert le fichier téléchargé dans un éditeur de texte, ces en-têtes HTTP se trouvaient en haut:</p>"},{"id":"text-89","type":"text","heading":"","plain_text":"HTTP / 1.1 200 OK\nDate: dim. 13 oct. 2013 à 01:24:25 GMT\nServeur: Apache / 2.2.22 (Debian)\nDernière mise à jour: mar. 01 oct 2013 à 03:40:50 GMT\nETag: &quot;226f0-2b1-4e7a5b80cb907&quot;\nAccept-Ranges: octets\nLongueur du contenu: 689\nCache-control: public, max-age = 259200\nKeep-Alive: délai d&#39;attente = 5, max = 100\nConnexion: Keep-Alive\nType de contenu: image / png","html":"<p>HTTP / 1.1 200 OK\nDate: dim. 13 oct. 2013 à 01:24:25 GMT\nServeur: Apache / 2.2.22 (Debian)\nDernière mise à jour: mar. 01 oct 2013 à 03:40:50 GMT\nETag: &quot;226f0-2b1-4e7a5b80cb907&quot;\nAccept-Ranges: octets\nLongueur du contenu: 689\nCache-control: public, max-age = 259200\nKeep-Alive: délai d&#039;attente = 5, max = 100\nConnexion: Keep-Alive\nType de contenu: image / png</p>"},{"id":"text-90","type":"text","heading":"","plain_text":"L&#39;en-tête de contrôle du cache est maintenant visible parmi les autres en-têtes HTTP.\nAffichage de la synchronisation des pages Google Analytics\nLa capture d&#39;écran de Google Analytics à droite montre comment les temps de chargement des pages se sont améliorés. Les temps de chargement des pages ont beaucoup fluctué lorsque j&#39;utilisais un plug-in de partage, mais se sont stabilisés dès que je m&#39;en suis débarrassé le 10 octobre. Au cours des prochains jours, le temps de chargement de la page a été réduit encore plus à mesure que je minifiais CSS et Javascript.\ncommentaires","html":"<p>L&#039;en-tête de contrôle du cache est maintenant visible parmi les autres en-têtes HTTP.\nAffichage de la synchronisation des pages Google Analytics\nLa capture d&#039;écran de Google Analytics à droite montre comment les temps de chargement des pages se sont améliorés. Les temps de chargement des pages ont beaucoup fluctué lorsque j&#039;utilisais un plug-in de partage, mais se sont stabilisés dès que je m&#039;en suis débarrassé le 10 octobre. Au cours des prochains jours, le temps de chargement de la page a été réduit encore plus à mesure que je minifiais CSS et Javascript.\ncommentaires</p>"},{"id":"text-91","type":"text","heading":"","plain_text":"Mon cluster de serveurs Raspberry Pi fonctionne depuis trois mois et dessert maintenant 45 000 pages vues par mois. La quantité de trafic\natteindre mon site est en augmentation constante et il existe parfois de fortes pics de trafic sur les sites de réseaux sociaux.  \nAu fur et à mesure que la charge sur le serveur augmente, il est important de vous assurer qu&#39;elle dispose de suffisamment de capacité. J&#39;ai donc décidé d&#39;augmenter sa puissance de calcul en ajoutant quatre nœuds de serveur Raspberry Pi supplémentaires au cluster.  \nJ&#39;ai construit deux nouveaux racks, chacun contenant quatre serveurs Raspberry Pi. J&#39;ai connecté en série deux commutateurs Ethernet, avec quatre serveurs Pi connectés à chaque commutateur.  \nJ&#39;ai cloné une carte SD à partir de l&#39;un des nœuds Pi et mis en place quatre cartes SD presque identiques. La seule différence entre eux est l&#39;adresse IP dans / etc / network / interfaces. J&#39;ai fait une sauvegarde de mon site à partir du tableau de bord de mon CMS et ai utilisé un script pour synchroniser le contenu de tous les nœuds de travail.\nL&#39;étape suivante consistait à modifier les paramètres de l&#39;équilibreur de charge pour pouvoir utiliser les nouveaux nœuds. Sur l&#39;équilibreur de charge, il fallait mettre à jour / etc / apache2 / sites-available / default pour inclure les nouveaux nœuds dans la déclaration de cluster:","html":"<p>Mon cluster de serveurs Raspberry Pi fonctionne depuis trois mois et dessert maintenant 45 000 pages vues par mois. La quantité de trafic\natteindre mon site est en augmentation constante et il existe parfois de fortes pics de trafic sur les sites de réseaux sociaux.  \nAu fur et à mesure que la charge sur le serveur augmente, il est important de vous assurer qu&#039;elle dispose de suffisamment de capacité. J&#039;ai donc décidé d&#039;augmenter sa puissance de calcul en ajoutant quatre nœuds de serveur Raspberry Pi supplémentaires au cluster.  \nJ&#039;ai construit deux nouveaux racks, chacun contenant quatre serveurs Raspberry Pi. J&#039;ai connecté en série deux commutateurs Ethernet, avec quatre serveurs Pi connectés à chaque commutateur.  \nJ&#039;ai cloné une carte SD à partir de l&#039;un des nœuds Pi et mis en place quatre cartes SD presque identiques. La seule différence entre eux est l&#039;adresse IP dans / etc / network / interfaces. J&#039;ai fait une sauvegarde de mon site à partir du tableau de bord de mon CMS et ai utilisé un script pour synchroniser le contenu de tous les nœuds de travail.\nL&#039;étape suivante consistait à modifier les paramètres de l&#039;équilibreur de charge pour pouvoir utiliser les nouveaux nœuds. Sur l&#039;équilibreur de charge, il fallait mettre à jour / etc / apache2 / sites-available / default pour inclure les nouveaux nœuds dans la déclaration de cluster:</p>"},{"id":"text-92","type":"text","heading":"","plain_text":"BalancerMember http://192.168.1.2:80\n                BalancerMember http://192.168.1.3:80\n                BalancerMember http://192.168.1.4:80\n                BalancerMember http://192.168.1.5:80\n                BalancerMember http://192.168.1.6:80\n                BalancerMember http://192.168.1.7:80\n                BalancerMember http://192.168.1.8:80\n                BalancerMember http://192.168.1.9:80","html":"<p>BalancerMember http://192.168.1.2:80\n                BalancerMember http://192.168.1.3:80\n                BalancerMember http://192.168.1.4:80\n                BalancerMember http://192.168.1.5:80\n                BalancerMember http://192.168.1.6:80\n                BalancerMember http://192.168.1.7:80\n                BalancerMember http://192.168.1.8:80\n                BalancerMember http://192.168.1.9:80</p>"},{"id":"text-93","type":"text","heading":"","plain_text":"                AllowOverride None\n                Ordre permettre, refuser\n                permettre à tous","html":"<p>                AllowOverride None\n                Ordre permettre, refuser\n                permettre à tous</p>"},{"id":"text-94","type":"text","heading":"","plain_text":"                ProxySet lbmethod = byrequests","html":"<p>                ProxySet lbmethod = byrequests</p>"},{"id":"text-95","type":"text","heading":"","plain_text":"Une fois les modifications apportées, j&#39;ai exécuté cette commande pour les charger dans Apache:","html":"<p>Une fois les modifications apportées, j&#039;ai exécuté cette commande pour les charger dans Apache:</p>"},{"id":"text-96","type":"text","heading":"","plain_text":"$ sudo /etc/init.d/apache2 reload","html":"<p>$ sudo /etc/init.d/apache2 reload</p>"},{"id":"text-97","type":"text","heading":"","plain_text":"Cela indique à Apache de recharger ses fichiers de configuration sans redémarrer. Je suis allé à l&#39;interface du gestionnaire d&#39;équilibrage à l&#39;adresse 192.168.0.3/balancer-manager pour m&#39;assurer que les nouveaux nœuds avaient été ajoutés:\nEssai\nJ&#39;ai testé le nouveau cluster à huit Pi en utilisant les mêmes tests que lorsque je n&#39;utilisais que quatre serveurs Pi. D&#39;abord, j&#39;ai utilisé seige pour générer 200 demandes simultanées en une minute:","html":"<p>Cela indique à Apache de recharger ses fichiers de configuration sans redémarrer. Je suis allé à l&#039;interface du gestionnaire d&#039;équilibrage à l&#039;adresse 192.168.0.3/balancer-manager pour m&#039;assurer que les nouveaux nœuds avaient été ajoutés:\nEssai\nJ&#039;ai testé le nouveau cluster à huit Pi en utilisant les mêmes tests que lorsque je n&#039;utilisais que quatre serveurs Pi. D&#039;abord, j&#039;ai utilisé seige pour générer 200 demandes simultanées en une minute:</p>"},{"id":"text-98","type":"text","heading":"","plain_text":"$ siege -d1 -c200 -t1m http://192.168.0.3/specs.html","html":"<p>$ siege -d1 -c200 -t1m http://192.168.0.3/specs.html</p>"},{"id":"text-99","type":"text","heading":"","plain_text":"Lever le siège du serveur ... c&#39;est fait.\nTransactions: 23492 hits\nDisponibilité: 100.00%\nTemps écoulé: 59.81 secondes\nDonnées transférées: 48,93 Mo\nTemps de réponse: 0.01 sec\nTaux de transaction: 392,78 trans / s\nDébit: 0.82 Mo / sec\nAccès simultané: 3,81\nTransactions réussies: 23492\nTransactions échouées: 0\nLa transaction la plus longue: 0,63\nLa transaction la plus courte: 0.00","html":"<p>Lever le siège du serveur ... c&#039;est fait.\nTransactions: 23492 hits\nDisponibilité: 100.00%\nTemps écoulé: 59.81 secondes\nDonnées transférées: 48,93 Mo\nTemps de réponse: 0.01 sec\nTaux de transaction: 392,78 trans / s\nDébit: 0.82 Mo / sec\nAccès simultané: 3,81\nTransactions réussies: 23492\nTransactions échouées: 0\nLa transaction la plus longue: 0,63\nLa transaction la plus courte: 0.00</p>"},{"id":"text-100","type":"text","heading":"","plain_text":"Le résultat est très similaire à celui obtenu pour le même test sur le cluster avec seulement quatre nœuds (voir &#39;Test du cluster entier&#39;).\nAméliorer les performances du cluster en ajustant Apache).  \nEnsuite, j&#39;ai lancé le siège avec 800 demandes simultanées:","html":"<p>Le résultat est très similaire à celui obtenu pour le même test sur le cluster avec seulement quatre nœuds (voir &#039;Test du cluster entier&#039;).\nAméliorer les performances du cluster en ajustant Apache).  \nEnsuite, j&#039;ai lancé le siège avec 800 demandes simultanées:</p>"},{"id":"text-101","type":"text","heading":"","plain_text":"Lever le siège du serveur ... c&#39;est fait.\nTransactions: 76510 hits\nDisponibilité: 100.00%\nTemps écoulé: 59.76 secondes\nDonnées transférées: 159,39 MB\nTemps de réponse: 0,12 seconde\nTaux de transaction: 1280.29 trans / s\nDébit: 2,67 Mo / sec\nAccès simultané: 148.45\nTransactions réussies: 76510\nTransactions échouées: 0\nLa transaction la plus longue: 13.04\nLa transaction la plus courte: 0.00","html":"<p>Lever le siège du serveur ... c&#039;est fait.\nTransactions: 76510 hits\nDisponibilité: 100.00%\nTemps écoulé: 59.76 secondes\nDonnées transférées: 159,39 MB\nTemps de réponse: 0,12 seconde\nTaux de transaction: 1280.29 trans / s\nDébit: 2,67 Mo / sec\nAccès simultané: 148.45\nTransactions réussies: 76510\nTransactions échouées: 0\nLa transaction la plus longue: 13.04\nLa transaction la plus courte: 0.00</p>"},{"id":"text-102","type":"text","heading":"","plain_text":"Le temps de transaction le plus long a augmenté, mais le débit et le nombre de transactions par seconde ont également augmenté.\nLes performances avec un faible nombre de demandes simultanées n&#39;ont pas vraiment changé, mais les performances se sont améliorées pour un nombre accru de demandes simultanées.\ndemandes. Cela est prévisible, car l&#39;ajout de nouveaux nœuds ne rend pas un cluster plus rapide, mais vise à augmenter la capacité du cluster.\nJ&#39;ai été surpris que le temps pour la plus longue transaction a augmenté. La plupart des demandes sont traitées en 20 ms ou moins, et malheureusement, le siège ne fonctionne pas\nenregistrer le temps de réponse moyen. \nLes tests avec Apache Bench, ab, montrent que le temps de transaction le plus long était de 5,111 secondes, mais que le temps moyen de transaction était de 0,214 seconde.\nL&#39;augmentation du temps de transaction le plus long ne signifie pas que la performance globale est pire, mais c&#39;est une source de préoccupation. Je me suis connecté à la charge\nl’équilibreur à l’aide de ssh et a relancé les tests sur mon cluster. J&#39;ai exécuté la commande uptime suivie de free sur l&#39;équilibreur de charge:","html":"<p>Le temps de transaction le plus long a augmenté, mais le débit et le nombre de transactions par seconde ont également augmenté.\nLes performances avec un faible nombre de demandes simultanées n&#039;ont pas vraiment changé, mais les performances se sont améliorées pour un nombre accru de demandes simultanées.\ndemandes. Cela est prévisible, car l&#039;ajout de nouveaux nœuds ne rend pas un cluster plus rapide, mais vise à augmenter la capacité du cluster.\nJ&#039;ai été surpris que le temps pour la plus longue transaction a augmenté. La plupart des demandes sont traitées en 20 ms ou moins, et malheureusement, le siège ne fonctionne pas\nenregistrer le temps de réponse moyen. \nLes tests avec Apache Bench, ab, montrent que le temps de transaction le plus long était de 5,111 secondes, mais que le temps moyen de transaction était de 0,214 seconde.\nL&#039;augmentation du temps de transaction le plus long ne signifie pas que la performance globale est pire, mais c&#039;est une source de préoccupation. Je me suis connecté à la charge\nl’équilibreur à l’aide de ssh et a relancé les tests sur mon cluster. J&#039;ai exécuté la commande uptime suivie de free sur l&#039;équilibreur de charge:</p>"},{"id":"text-103","type":"text","heading":"","plain_text":"$ disponibilité\n 13:30:04 up 1 day,  5:20,  1 user,  load average: 9.27, 3.52, 1.33\n$ free\n             total       used       free     shared    buffers     cached\nMem:        498268     487188      11080          0      37328     299752\n-/+ buffers/cache:     150108     348160\nSwap:       513020         20     513000","html":"<p>$ disponibilité\n 13:30:04 up 1 day,  5:20,  1 user,  load average: 9.27, 3.52, 1.33\n$ free\n             total       used       free     shared    buffers     cached\nMem:        498268     487188      11080          0      37328     299752\n-/+ buffers/cache:     150108     348160\nSwap:       513020         20     513000</p>"},{"id":"text-104","type":"text","heading":"","plain_text":"The load average figures for the load balancer are much higher than for the servers.  The load balancer only has 11MB of RAM left and has \nstarted to use swap.  When web servers start to use swap space, they slow down dramatically, so I need to look into the performance and memory \nusage of my load balancer.  Using siege to test with 800 concurrent users is testing for the worst case.  At the moment my site isn&#39;t getting \nthat much traffic, so the performance issues with the load balancer aren&#39;t an immediate problem, but it&#39;s something I need to look at.  \nI still don&#39;t know how much traffic this system can actually handle because serving real traffic is not the same as testing with siege. je fais\nknow that my server can handle at least 45,000 hits a month, and probably a lot more now that I have added more nodes.\ncommentaires","html":"<p>The load average figures for the load balancer are much higher than for the servers.  The load balancer only has 11MB of RAM left and has \nstarted to use swap.  When web servers start to use swap space, they slow down dramatically, so I need to look into the performance and memory \nusage of my load balancer.  Using siege to test with 800 concurrent users is testing for the worst case.  At the moment my site isn&#039;t getting \nthat much traffic, so the performance issues with the load balancer aren&#039;t an immediate problem, but it&#039;s something I need to look at.  \nI still don&#039;t know how much traffic this system can actually handle because serving real traffic is not the same as testing with siege. je fais\nknow that my server can handle at least 45,000 hits a month, and probably a lot more now that I have added more nodes.\ncommentaires</p>"},{"id":"text-105","type":"text","heading":"","plain_text":"Ever since I built my cluster people have been asking me why I used Apache and not Nginx.  I started using Apache because I was just used to it.  People say it&#39;s slow and takes up too much memory, but I find that with a little tuning it can perform quite well.\nStill, Nginx does have a reputation for being fast.  I wanted to see which web server would be best for my cluster, so I installed Apache on one Pi and Nginx on another.  \nI used two Raspberry Pi model B servers, each with identical Sandisk 4GB class 4 SD cards.  In raspi-config, I overclocked each Pi to 800MHz, and allocated 16MB of memory to the GPU.  I used the same version of Raspbian (released on 2013-09-25) on both servers.  I used exactly the same test data and scripts on each Pi.\nFollow this link to see how I set up Nginx and uWSGI.\nI tuned Apache by removing modules and increasing the number of server processes.  These tuning techniques don&#39;t apply to Nginx.\nI tested each server with three different types of request: a static HTML file, a simple CGI script, and a complex CGI script.  The HTML file is a cached page in my Content Management System (the CMS doesn&#39;t need to execute for cached pages to be served, they can be served by Apache as normal HTML files).  The simple script just prints an HTTP header, prints &quot;Hello World!&quot; and exits.\nThe complex script used in these tests was the CMS that this site is built on.  I disabled page caching on both Pi servers, so that pages had to be generated dynamically by the CMS.  When a page is served, the CMS script has to parse two XML files to get meta data, read several snippets of HTML from the file system, and print them to a socket.\nRequests were generated with Apache Bench using a command like this:","html":"<p>Ever since I built my cluster people have been asking me why I used Apache and not Nginx.  I started using Apache because I was just used to it.  People say it&#039;s slow and takes up too much memory, but I find that with a little tuning it can perform quite well.\nStill, Nginx does have a reputation for being fast.  I wanted to see which web server would be best for my cluster, so I installed Apache on one Pi and Nginx on another.  \nI used two Raspberry Pi model B servers, each with identical Sandisk 4GB class 4 SD cards.  In raspi-config, I overclocked each Pi to 800MHz, and allocated 16MB of memory to the GPU.  I used the same version of Raspbian (released on 2013-09-25) on both servers.  I used exactly the same test data and scripts on each Pi.\nFollow this link to see how I set up Nginx and uWSGI.\nI tuned Apache by removing modules and increasing the number of server processes.  These tuning techniques don&#039;t apply to Nginx.\nI tested each server with three different types of request: a static HTML file, a simple CGI script, and a complex CGI script.  The HTML file is a cached page in my Content Management System (the CMS doesn&#039;t need to execute for cached pages to be served, they can be served by Apache as normal HTML files).  The simple script just prints an HTTP header, prints &quot;Hello World!&quot; and exits.\nThe complex script used in these tests was the CMS that this site is built on.  I disabled page caching on both Pi servers, so that pages had to be generated dynamically by the CMS.  When a page is served, the CMS script has to parse two XML files to get meta data, read several snippets of HTML from the file system, and print them to a socket.\nRequests were generated with Apache Bench using a command like this:</p>"},{"id":"text-106","type":"text","heading":"","plain_text":"ab -n 1000 -c 250 http://192.168.0.21/spec.html","html":"<p>ab -n 1000 -c 250 http://192.168.0.21/spec.html</p>"},{"id":"text-107","type":"text","heading":"","plain_text":"where 1000 is the number of requests to issue, and 250 is the number of concurrent users.  \nThe Raspberry Pi running Nginx had IP address 192.168.0.21, and the Pi running Apache had 192.168.0.22.  I tested each server over a range of concurrent users for each type of request.  \nStatic files\nStatic files are easy to serve, so I used a range of 50 to 250 concurrent users in these tests.  Apache handled 220 connections per second, while Nginx handled around 300 connections per second.\nNginx came out ahead on these tests.\nDynamic content tests\nSimple script\nIn these tests I used ab to request this URL: http://192.168.0.21/cgi-bin/hello.py.  I set the number of request to 100, and tested over a range of 10 to 50 concurrent users.\nApache handled 4.78 connections per second, and Nginx handled 4.65 connections per second, but the results showed that the mean transaction time was lower for Nginx than Apache, so Apache was slower in this test.  The difference was not very pronounced under a low load, but it increased as the load increased.\nComplex script\nThe URL used in these test was http://192.168.0.21/spec.html.  This test is the most CPU intensive so I used from 5 to 25 concurrent users in these tests.  \nUnder a low load, Apache&#39;s performance was slightly better than Nginx, but only by a very slim margin.  With 25 concurrent users, Apache was slower than Nginx.  The difference under a low load is negligible, but with 25 concurrent users, Nginx was noticeably faster than Apache.\nConclusions\nThere are many variables involved in server performance.  These tests don&#39;t definitively determine which server is &#39;better&#39;, they just helped me decide which one is best for my specific needs.\nMost of the pages on my site are static, and Nginx is faster when it comes to static pages.  It looks like Nginx is a better choice for me.  \ncommentaires","html":"<p>where 1000 is the number of requests to issue, and 250 is the number of concurrent users.  \nThe Raspberry Pi running Nginx had IP address 192.168.0.21, and the Pi running Apache had 192.168.0.22.  I tested each server over a range of concurrent users for each type of request.  \nStatic files\nStatic files are easy to serve, so I used a range of 50 to 250 concurrent users in these tests.  Apache handled 220 connections per second, while Nginx handled around 300 connections per second.\nNginx came out ahead on these tests.\nDynamic content tests\nSimple script\nIn these tests I used ab to request this URL: http://192.168.0.21/cgi-bin/hello.py.  I set the number of request to 100, and tested over a range of 10 to 50 concurrent users.\nApache handled 4.78 connections per second, and Nginx handled 4.65 connections per second, but the results showed that the mean transaction time was lower for Nginx than Apache, so Apache was slower in this test.  The difference was not very pronounced under a low load, but it increased as the load increased.\nComplex script\nThe URL used in these test was http://192.168.0.21/spec.html.  This test is the most CPU intensive so I used from 5 to 25 concurrent users in these tests.  \nUnder a low load, Apache&#039;s performance was slightly better than Nginx, but only by a very slim margin.  With 25 concurrent users, Apache was slower than Nginx.  The difference under a low load is negligible, but with 25 concurrent users, Nginx was noticeably faster than Apache.\nConclusions\nThere are many variables involved in server performance.  These tests don&#039;t definitively determine which server is &#039;better&#039;, they just helped me decide which one is best for my specific needs.\nMost of the pages on my site are static, and Nginx is faster when it comes to static pages.  It looks like Nginx is a better choice for me.  \ncommentaires</p>"},{"id":"text-108","type":"text","heading":"","plain_text":"Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]","html":"<p>Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]</p>"}],"sections":[{"id":"text-1","heading":"Text","content":"Accueil / Cluster Raspberry Pi"},{"id":"text-2","heading":"Text","content":"Une utilisation courante des ordinateurs Raspberry Pi consiste à créer des grappes. Les tartes aux framboises sont petites et peu coûteuses; il est donc plus facile de les utiliser pour créer un cluster que ce ne serait le cas avec les PC. Une grappe de tartes aux framboises devrait être assez grosse pour concurrencer un seul PC; vous aurez probablement besoin d&#39;environ 20 Pies pour produire un cluster avec autant de puissance de calcul qu&#39;un PC. Même si un cluster Pi n&#39;est peut-être pas aussi puissant, c&#39;est une excellente opportunité pour en apprendre davantage sur l&#39;informatique distribuée.\nIl existe différents types d’ordinateurs distribués qui peuvent être utilisés à des fins différentes. Il existe des super-ordinateurs utilisés pour résoudre des problèmes mathématiques tels que la modélisation des conditions météorologiques ou la simulation de réactions chimiques. Ces systèmes utilisent souvent l&#39;interface MPI (Message Passing Interface). Une équipe de l’Université de Southampton a construit un superordinateur basé sur MPI à 64 nœuds. Ce système est utilisé pour enseigner aux élèves la superinformatique.\nHadoop est une autre technologie souvent utilisée dans l&#39;informatique distribuée. Elle permet de distribuer des données sur plusieurs nœuds. Hadoop est souvent utilisé pour le traitement de grands ensembles de données et l&#39;exploration de données. Un ingénieur chez Nvidia a construit un petit cluster Hadoop en utilisant des tartes aux framboises. Il utilise son cluster pour expérimenter et tester des idées avant de les déployer sur des systèmes plus puissants.\nUtilisation d&#39;un cluster Raspberry Pi en tant que serveur Web\nLes clusters peuvent être utilisés comme serveurs Web. De nombreux sites Web génèrent trop de trafic pour s&#39;exécuter sur un seul serveur, de sorte que plusieurs serveurs doivent être utilisés. Les demandes des navigateurs Web sont reçues par un nœud appelé équilibreur de charge, qui transmet les demandes aux serveurs de travail. L&#39;équilibreur de charge transmet ensuite les réponses des serveurs aux clients.\nCe site est maintenant hébergé sur un cluster Raspberry Pi. Les nœuds de travail sont des serveurs Web standard ayant un contenu identique. Je viens d&#39;installer Apache sur eux et de copier mon site sur chaque nœud.\nJ&#39;utilise un Raspberry Pi supplémentaire pour héberger une copie de développement de ce site et pour contrôler le cluster. Ce Pi est connecté à mon réseau local via wifi, afin que je puisse accéder à la copie de développement de mon site depuis mon ordinateur portable.  \nLe Pi supplémentaire dispose également d’une connexion Ethernet au cluster Pi. Lorsque je souhaite mettre à jour mon site, je peux transférer les modifications du site de développement vers le site actif du cluster. Les mises à jour du site sont placées dans des fichiers .tar.gz que les nœuds de travail téléchargent automatiquement à partir du site de développement. Une fois téléchargées, les mises à jour sont ensuite décompressées dans le système de fichiers local. \nConfiguration des serveurs Raspberry Pi\nToutes les tartes dans ce système sont sans tête. Je peux me connecter au Pi avec le site de développement en utilisant le protocole Remote Desktop, et à partir de ce Pi, je peux me connecter aux travailleurs Pies en utilisant SSH.\nTous les Pies du cluster utilisent une adresse IP statique. Dans un cluster plus grand, il serait probablement préférable de configurer un serveur DHCP sur l&#39;équilibreur de charge. Les adresses IP utilisées dans le cluster se trouvent sur le sous-réseau 192.168.1.xxx.\nPour chaque travailleur Pi, j&#39;ai configuré une carte SD de 4 Go en utilisant la dernière version de Raspbian. Dans raspi-config, je définis les options suivantes:"},{"id":"text-3","heading":"Text","content":"développer fs\ndéfinir le nom d&#39;hôte\ndéfinir le mot de passe\ndéfinir la mémoire partagée à 16 Mo pour le GPU\noverclocker le processeur à 800 MHz\nactiver ssh"},{"id":"text-4","heading":"Text","content":"Sur chaque carte, j&#39;ai installé Apache et certaines bibliothèques requises par mon CMS, libxml2 et python-libxml2. J&#39;ai utilisé cette commande pour activer le mod rewrite, qui est également requis par mon CMS:\n$ sudo a2enmod rewrite"},{"id":"text-5","heading":"Text","content":"Enfin, j&#39;ai copié sur chaque carte SD des scripts qui permettent à chaque Pi de synchroniser son contenu avec le développement Pi. Dans un cluster plus grand, il serait intéressant de créer une image de carte SD avec toutes ces modifications effectuées à l’avance.\nConstruire un équilibreur de charge\nL&#39;équilibreur de charge doit avoir deux interfaces réseau, une pour recevoir les demandes d&#39;un routeur et une autre interface réseau pour transmettre les demandes au cluster de serveurs. Les nœuds du cluster se trouvent sur un sous-réseau différent du reste du réseau. L&#39;adresse IP de la deuxième interface de l&#39;équilibreur de charge doit donc se trouver sur le même sous-réseau que le reste du cluster. La première interface de l&#39;équilibreur de charge a l&#39;adresse IP 192.168.0.3, tandis que l&#39;adresse IP de la deuxième interface est 192.168.1.1. Tous les Pies du cluster ont des adresses IP sur le sous-réseau 192.168.1.xxx.\nJ&#39;ai construit mon équilibreur de charge en utilisant un ancien PC doté de 512 Mo de RAM et d&#39;un processeur x86 à 2,7 GHz. J&#39;ai ajouté une deuxième carte Ethernet PCI et installé Lubuntu, une version allégée d&#39;Ubuntu. J&#39;allais installer Ubuntu, mais ce PC est assez ancien, donc Lubuntu est probablement un meilleur choix. J&#39;ai utilisé un PC parce que je ne savais pas si un seul Pi serait assez puissant pour jouer le rôle d&#39;équilibreur de charge, et un Pi ne dispose que d&#39;une seule connexion Ethernet. Je souhaite que les deux connexions réseau de mon équilibreur de charge soient Ethernet afin d&#39;améliorer les performances et la stabilité.\nNotez que le transfert IP n&#39;est pas activé. L&#39;équilibreur de charge n&#39;est pas un routeur, il ne doit transmettre que les requêtes HTTP et pas tous les paquets IP qu&#39;il reçoit. \nConfiguration du logiciel d&#39;équilibrage de charge\nIl existe de nombreuses implémentations logicielles d&#39;équilibrage de charge. J&#39;ai utilisé le module d&#39;équilibrage de charge d&#39;Apache car il est facile à configurer. Tout d&#39;abord, je me suis assuré que le système d&#39;exploitation de mon PC était à jour:\nsudo apt-get updatesudo apt-get upgrade"},{"id":"text-6","heading":"Text","content":"Puis j&#39;ai installé Apache:\nsudo apt-get install apache2"},{"id":"text-7","heading":"Text","content":"Ces modules Apache doivent être activés:\nproxy sudo a2enmodsudo a2enmod proxy_httpsudo a2enmod proxy_balancer"},{"id":"text-8","heading":"Text","content":"L&#39;étape suivante consiste à modifier / etc / apache2 / sites-available / default afin de configurer l&#39;équilibreur de charge. Le module proxy est nécessaire pour le transfert HTTP, mais il est préférable de ne pas permettre à votre serveur de se comporter comme un proxy. Les spammeurs et les pirates informatiques utilisent souvent les serveurs proxy d&#39;autres personnes pour masquer leur adresse IP. Il est donc important de désactiver cette fonctionnalité en ajoutant cette ligne:\n\tProxyRequests off"},{"id":"text-9","heading":"Text","content":"Bien que les demandes de proxy soient désactivées, le module de proxy est toujours activé et agit en tant que proxy inverse. Ensuite, définissez le cluster et ses membres en ajoutant ce code:"},{"id":"text-10","heading":"Text","content":"BalancerMember http://192.168.1.2:80\nBalancerMember http://192.168.1.3:80\nBalancerMember http://192.168.1.4:80\nBalancerMember http://192.168.1.5:80"},{"id":"text-11","heading":"Text","content":"AllowOverride None\nOrdre permettre, refuser\npermettre à tous"},{"id":"text-12","heading":"Text","content":"ProxySet lbmethod = byrequests"},{"id":"text-13","heading":"Text","content":"Interface du gestionnaire d&#39;équilibrage\nLe module d&#39;équilibrage dispose d&#39;une interface Web permettant de surveiller l&#39;état des serveurs principaux et de configurer leurs paramètres. Vous pouvez activer l&#39;interface Web en ajoutant ce code à / etc / apache2 / sites-available / default:"},{"id":"text-14","heading":"Text","content":"SetHandler balancer-manager"},{"id":"text-15","heading":"Text","content":"Ordre permettre, refuser\nautoriser à partir de 192.168.0"},{"id":"text-16","heading":"Text","content":"Il est également nécessaire de demander à Apache de gérer localement les demandes adressées à la page / balancer-manager au lieu de les transférer à un serveur de travail. Toutes les autres demandes sont transférées au cluster défini ci-dessus."},{"id":"text-17","heading":"Text","content":"ProxyPass / balancer-manager!\nProxyPass / balancer: // rpicluster /"},{"id":"text-18","heading":"Text","content":"Une fois ces modifications enregistrées, Apache doit être redémarré avec cette commande:\n$ sudo /etc/init.d/apache2 restart"},{"id":"text-19","heading":"Text","content":"lorsque j&#39;ouvre un navigateur et que je visite http://192.168.0.3, je vois la page d&#39;accueil de mon site Web. Si je vais à http://192.168.0.3/balancer-manager, je vois cette page dans l&#39;image à droite.\nLa dernière étape pour mettre le cluster en ligne consiste à ajuster les paramètres de redirection de port dans mon routeur. Je devais juste configurer une règle pour transférer les paquets HTTP vers http://192.168.0.3.\nVoici l&#39;intégralité de / etc / apache2 / sites-available / default pour l&#39;équilibreur de charge:"},{"id":"text-20","heading":"Text","content":"Webmaster ServerAdmin @ localhost"},{"id":"text-21","heading":"Text","content":"DocumentRoot / var / www\n\t\n\t\tOptions FollowSymLinks\nAllowOverride All\n\t\n\t\n\t\t\n\t\t\n\t\t\n\t\tOptions Index FollowSymLinks MultiViews\nAllowOverride All\nOrdre permettre, refuser\npermettre à tous"},{"id":"text-22","heading":"Text","content":"ScriptAlias ​​/ cgi-bin / / usr / lib / cgi-bin /\n\t\n\t\tAllowOverride None\nOptions + ExecCGI -MultiViews + SymLinksIfOwnerMatch\n                AddHandler cgi-script .py\nOrdre permettre, refuser\nAutoriser de tous"},{"id":"text-23","heading":"Text","content":"ProxyRequests Off"},{"id":"text-24","heading":"Text","content":"BalancerMember http://192.168.1.2:80\n                BalancerMember http://192.168.1.3:80\n                BalancerMember http://192.168.1.4:80\n                BalancerMember http://192.168.1.5:80"},{"id":"text-25","heading":"Text","content":"                AllowOverride None\n                Ordre permettre, refuser\n                permettre à tous"},{"id":"text-26","heading":"Text","content":"                ProxySet lbmethod = byrequests"},{"id":"text-27","heading":"Text","content":"SetHandler balancer-manager"},{"id":"text-28","heading":"Text","content":"                Ordre permettre, refuser\n                autoriser à partir de 192.168.0"},{"id":"text-29","heading":"Text","content":"ProxyPass / balancer-manager!\n        ProxyPass / balancer: // rpicluster /"},{"id":"text-30","heading":"Text","content":"ErrorLog $ APACHE_LOG_DIR /error.log"},{"id":"text-31","heading":"Text","content":"# Les valeurs possibles incluent: debug, info, notice, avertir, erreur, crit,\n# alerte, émergent.\nLogLevel avertir"},{"id":"text-32","heading":"Text","content":"CustomLog $ APACHE_LOG_DIR /access.log combiné"},{"id":"text-33","heading":"Text","content":"commentaires"},{"id":"text-34","heading":"Text","content":"Maintenant que j&#39;ai construit un simple cluster de serveurs Raspberry Pi, il serait intéressant de voir combien de trafic il peut gérer par rapport à un seul Pi. Il existe de nombreux outils d&#39;analyse comparative de serveur disponibles. Je vais utiliser le siège.  \nUtiliser Siege pour tester les temps de réponse du serveur\nSiege est un programme qui peut être utilisé pour envoyer un grand nombre de demandes à un serveur Web. L’utilisation de la commande suivante enverra des requêtes HTTP à un serveur de mon réseau local:\nsiège -d10 -c10 -t1m http://192.168.0.10/spec.html"},{"id":"text-35","heading":"Text","content":"L&#39;option -c spécifie qu&#39;il doit y avoir 10 utilisateurs simultanés à la fois. L&#39;option -d spécifie le délai maximum entre les demandes. Le délai réel est aléatoire, mais le sera dans le délai utilisé avec l&#39;option -d. L&#39;option -t indique au siège combien de temps le test devrait durer &#8211; 1 minute dans ce cas.\nDans chacun des tests que j&#39;ai effectués, j&#39;ai utilisé un délai maximum de 10 secondes et une durée totale de test de 1 minute. Tous les tests utilisaient le siège pour faire des demandes sur mon réseau local, pas via Internet.\nTest de l&#39;équilibreur de charge avec un seul Raspberry Pi\nJe voulais voir comment un seul Raspberry Pi gère le trafic avec et sans l&#39;équilibreur de charge. Je soupçonnais que l&#39;équilibreur de charge introduirait un léger retard, mais en réalité, un seul Pi semble fonctionner plus efficacement lorsqu&#39;il est derrière un équilibreur de charge. Il semble que les demandes soient mises en mémoire tampon avant d’atteindre le Pi. Ce graphique montre les temps de réponse moyens pour différents nombres d&#39;utilisateurs simultanés, avec et sans l&#39;équilibreur de charge:\nVoir comment les performances s&#39;améliorent avec plus de nœuds\nLe test suivant que j&#39;ai effectué a consisté à vérifier l&#39;évolution des performances en fonction de l&#39;ajout de nœuds au cluster. J&#39;ai effectué des tests avec un nombre variable d&#39;utilisateurs simultanés, mais pour des raisons de simplicité, je ne montrerai que les résultats des tests effectués avec 10 utilisateurs simultanés.\nCe graphique indique les temps de réponse maximum et minimum moyens pour un nombre croissant de noeuds de travail:\nComme vous pouvez le constater, le temps de réponse minimum ne s’améliore pas réellement car plusieurs nœuds sont ajoutés, ce qui est logique. Le temps de réponse minimum est aussi rapide que l&#39;un des nœuds du cluster, et l&#39;ajout de nœuds ne changera rien. \nLe temps de réponse maximal s&#39;est considérablement amélioré avec l&#39;ajout de nouveaux noeuds. L&#39;utilisation d&#39;un cluster a nettement augmenté la capacité de mon serveur.  \n    En savoir plus sur le siège.\ncommentaires"},{"id":"text-36","heading":"Text","content":"Dans mon dernier article sur les performances des grappes, je trouvais qu&#39;une grappe fonctionnait mieux qu&#39;un simple Pi, mais il restait encore beaucoup à faire. J&#39;ai modifié les fichiers de configuration d&#39;Apache et modifié le mode de fonctionnement de la mise en cache des pages dans mon CMS.\nDéplacer le cache de la page\nLe CMS que j&#39;ai écrit peut générer des pages de manière dynamique et peut mettre en cache des pages afin qu&#39;elles puissent être servies instantanément sans être assemblées. Seules les pages composées de HTML statique peuvent être mises en cache. Les pages contenant du contenu dynamique généré par des scripts exécutables ne sont pas mises en cache.\nLe cache de pages se trouvait dans / usr / share / cms / cache. L&#39;interpréteur Python devait être chargé pour servir les pages en cache à partir de / usr / share / cms / cache. Désormais, le répertoire racine du cache de pages est / var / www. Apache peut donc servir les pages en cache sans appeler Python pour exécuter le script CMS.  \nUn inconvénient est que le CMS ne peut plus compter le trafic de piste. Lorsque le CMS s&#39;exécutait chaque fois qu&#39;une page était demandée, une fonction était appelée pour incrémenter un nombre dans un fichier de données. Cela ne fonctionne pas maintenant que les pages peuvent être servies sans l&#39;exécution du CMS.\nDécharger les modules inutilisés\nL&#39;un des meilleurs moyens d&#39;améliorer les performances d&#39;Apache consiste à décharger des modules inutiles. Tout d&#39;abord, vous devez répertorier tous les modules actuellement chargés à l&#39;aide de cette commande:\napache2ctl -M"},{"id":"text-37","heading":"Text","content":"Il peut être difficile de déterminer quels modules sont utilisés. Cela dépend vraiment des directives utilisées dans les fichiers .htaccess et les fichiers hôtes virtuels. Par exemple, si vous désactivez authz_host_module, les directives Allow, Order et Deny ne fonctionneront pas. Chaque fois que vous désactivez un module, redémarrez Apache avec les commandes suivantes:"},{"id":"text-38","heading":"Text","content":"$ sudo service apache2 stop\n$ sudo service apache2 start"},{"id":"text-39","heading":"Text","content":"Vous pouvez utiliser &#39;redémarrer&#39; au lieu de &#39;démarrer&#39; et &#39;arrêter&#39;, mais certaines variables nécessitent l&#39;arrêt d&#39;Apache avant de pouvoir être mises à jour. Il est judicieux de tester votre site avant de désactiver d&#39;autres modules. J&#39;ai désactivé ces modules:"},{"id":"text-40","heading":"Text","content":"$ sudo a2dismod autoindex\n$ sudo a2dismod auth_basic\nstatut sudo a2dismod\n$ sudo a2dismod dégonfler\n$ sudo a2dismod ssl\n$ sudo a2dismod authz_default"},{"id":"text-41","heading":"Text","content":"Si vous trouvez qu&#39;un module est requis, vous pouvez le réactiver avec la commande a2enmod comme ceci:\n$ sudo a2enmod authz_host"},{"id":"text-42","heading":"Text","content":"Réduire le délai d&#39;attente\nJe règle le délai d&#39;attente dans /etc/apache2/apache2.conf sur 30. Cela évite que des requêtes simultanées n&#39;occupent de la mémoire pendant de longues périodes et réduise l&#39;utilisation de la mémoire.\nAjuster les processus Apache\nApache a plusieurs modèles de multitraitement différents. Ils utilisent chacun un nombre de processus serveur et de fils enfants pour gérer les requêtes HTTP.\nMPM worker est la configuration la plus moderne. MPM prefork était auparavant la norme, mais MPM Worker offre de meilleures performances et une meilleure utilisation de la mémoire. Utilisez cette commande pour vérifier le mode dans lequel se trouve Apache: \n$ sudo apache2 -V"},{"id":"text-43","heading":"Text","content":"Une partie de la sortie ressemblera à ceci:"},{"id":"text-44","heading":"Text","content":"Serveur MPM: Travailleur\n  fileté: oui (nombre de threads fixe)\n    forké: oui (nombre de processus variable)"},{"id":"text-45","heading":"Text","content":"Voici les paramètres par défaut pour MPM Worker:"},{"id":"text-46","heading":"Text","content":"StartServers 5\n    MinSpareThreads 25\n    MaxSpareThreads 75\n    ThreadLimit 64\n    ThreadsPerChild 25\n    MaxClients 150\n    MaxRequestsPerChild 0"},{"id":"text-47","heading":"Text","content":"La taille des processus Apache varie en fonction du contenu servi et des scripts éventuellement en cours d&#39;exécution. Cette commande indique le nombre de processus Apache et leur taille:\nps aux | grep &#39;apache2&#39;"},{"id":"text-48","heading":"Text","content":"La 6ème colonne contient la quantité de mémoire utilisée par chaque processus. En divisant la quantité de mémoire de secours par la taille du processus Apache moyen, vous obtenez une indication approximative du nombre maximal de processus serveur que vous pouvez exécuter. Chaque Pi de mon cluster a environ 280 Mo de RAM libre, et la taille moyenne des processus Apache est d’environ 7 Mo. 280 divisé par 7 donne 40. \nStartServers est le nombre de threads de serveur créés par Apache au démarrage. La création de nouveaux processus de serveur peut prendre beaucoup de temps. Je souhaite donc qu&#39;Apache démarre beaucoup de processus de serveur au démarrage. Cela signifie qu&#39;il n&#39;aura pas à passer du temps à créer plus de processus alors qu&#39;il est occupé à traiter beaucoup de trafic. J&#39;ai mis StartServers à 40.  \nJe ne veux pas qu&#39;Apache puisse créer trop de processus, car mon Pi risque de manquer de mémoire, j&#39;ai donc défini ServerLimit sur 40.\nChaque processus serveur peut avoir un nombre variable de threads. Ce sont les threads qui traitent réellement les demandes. J&#39;ai fixé le nombre de threads par enfant à 8 par défaut. Je n&#39;ai pas calculé cela, j&#39;ai simplement essayé plusieurs nombres et effectué de nombreux tests avec siege jusqu&#39;à ce que je trouve la valeur optimale.\nLe nombre total de threads est le nombre de processus serveur multiplié par ThreadsPerChild, ce qui correspond à 320 avec mes paramètres. J&#39;ai défini MaxClients sur 320 pour empêcher Apache de créer des threads supplémentaires.\nCes paramètres obligeront Apache à créer de nombreux processus et threads qui ne seront pas utilisés immédiatement. Afin d&#39;empêcher Apache de les supprimer, j&#39;ai défini MaxSpareThreads sur 320.\nMaxRequestsPerChild est le nombre de demandes qu&#39;un processus doit gérer avant d&#39;être tué et qu&#39;un processus de remplacement ne soit démarré. Ceci est fait pour empêcher les fuites de mémoire d&#39;accumuler de grandes quantités de mémoire. Il doit être défini sur le nombre de hits qu&#39;un serveur reçoit par jour afin que les processus soient redémarrés une fois par jour.  \nLes paramètres de MPM Worker sont maintenant"},{"id":"text-49","heading":"Text","content":"StartServers 40\n    ServerLimit 40\n    MinSpareThreads 25\n    MaxSpareThreads 320\n    ThreadLimit 64\n    ThreadsPerChild 8\n    MaxClients 320\n    MaxRequestsPerChild 2000"},{"id":"text-50","heading":"Text","content":"Avant de modifier le système de mise en cache, un test de siège avec seulement 25 utilisateurs simultanés a permis d&#39;obtenir les résultats suivants:"},{"id":"text-51","heading":"Text","content":"Lever le siège du serveur ... c&#39;est fait.\nTransactions: 30 hits\nDisponibilité: 100.00%\nTemps écoulé: 59.79 secondes\nDonnées transférées: 0,08 Mo\nTemps de réponse: 26.07 secondes\nTaux de transaction: 0.50 trans / sec\nDébit: 0.00 Mo / sec\nAccès simultané: 13.08\nTransactions réussies: 30\nTransactions échouées: 0\nLa plus longue transaction: 29.32\nOpération la plus courte: 14.03"},{"id":"text-52","heading":"Text","content":"Après avoir amélioré le système de mise en cache, j&#39;ai testé un seul nœud avec 200 utilisateurs simultanés à l&#39;aide de cette commande:\n$ siege -d1 -c200 -t1m http://192.168.0.4/specs.html"},{"id":"text-53","heading":"Text","content":"Les résultats ont été"},{"id":"text-54","heading":"Text","content":"Lever le siège du serveur ... c&#39;est fait.\nTransactions: 6492 hits\nDisponibilité: 100.00%\nTemps écoulé: 59.28 secondes\nDonnées transférées: 38,86 MB\nTemps de réponse: 1,29 secondes\nTaux de transaction: 109,51 trans / s\nDébit: 0.66 Mo / sec\nAccès simultané: 141,10\nTransactions réussies: 6492\nTransactions échouées: 0\nLa transaction la plus longue: 11.23\nOpération la plus courte: 0,32"},{"id":"text-55","heading":"Text","content":"Après avoir redémarré Apache avec les modifications de configuration et exécuté à nouveau le même test, j&#39;ai obtenu les résultats suivants:"},{"id":"text-56","heading":"Text","content":"Lever le siège du serveur ... c&#39;est fait.\nTransactions: 6449 visites\nDisponibilité: 100.00%\nTemps écoulé: 59.53 secondes\nDonnées transférées: 38,60 MB\nTemps de réponse: 1,31 seconde\nTaux de transaction: 108.33 trans / sec\nDébit: 0.65 MB / sec\nAccès simultané: 142.32\nTransactions réussies: 6449\nTransactions échouées: 0\nLa transaction la plus longue: 4.16\nOpération la plus courte: 0.01"},{"id":"text-57","heading":"Text","content":"Après avoir optimisé la mise en cache des pages, supprimé les modules inutilisés d’Apache et optimisé le processus du serveur, le nombre de transactions par seconde pour un seul nœud est passé de 0,5 à plus de cent. Le nombre de demandes de connexion pouvant être traitées a été multiplié par 8.\nLe réglage des processus Apache a entraîné une très légère diminution du nombre de transactions par seconde, mais le temps de transaction le plus long a considérablement diminué.\nTester l&#39;ensemble du cluster\nUne fois satisfait de mes nouveaux paramètres, je les ai transférés dans l&#39;ensemble du cluster. J&#39;ai fait plus de tests avec siege, d&#39;abord avec 200 utilisateurs simultanés:"},{"id":"text-58","heading":"Text","content":"Lever le siège du serveur ... c&#39;est fait.\nTransactions: 23218 hits\nDisponibilité: 100.00%\nTemps écoulé: 59.26 secondes\nDonnées transférées: 48,44 Mo\nTemps de réponse: 0.01 sec\nTaux de transaction: 391.80 trans / s\nDébit: 0.82 Mo / sec\nAccès simultané: 3,90\nTransactions réussies: 23218\nTransactions échouées: 0\nLa transaction la plus longue: 0,66\nLa transaction la plus courte: 0.00"},{"id":"text-59","heading":"Text","content":"&#8230; et ensuite avec 800 utilisateurs simultanés:"},{"id":"text-60","heading":"Text","content":"Lever le siège du serveur ... c&#39;est fait.\nTransactions: 56899 visites\nDisponibilité: 100.00%\nTemps écoulé: 60.05 secondes\nDonnées transférées: 118,59 Mo\nTemps de réponse: 0.34 sec\nTaux de transaction: 947,53 trans / s\nDébit: 1,97 Mo / sec\nAccès simultané: 317.44\nTransactions réussies: 56899\nTransactions échouées: 0\nLa transaction la plus longue: 9.71\nLa transaction la plus courte: 0.00"},{"id":"text-61","heading":"Text","content":"Avant de paramétrer Apache, le cluster pouvait gérer 350 demandes simultanées et le taux de transaction maximal était de 460 transactions par seconde. Le nombre maximal d&#39;utilisateurs simultanés avec un taux de réussite de 100% est désormais de 800. Le nombre maximal de transactions par seconde est maintenant de 947.\nJe surveillerai attentivement la quantité de mémoire disponible au cours des prochains jours. Si le niveau commence à devenir trop bas, je vais réduire certains de ces paramètres.\nL&#39;utilisation du siège n&#39;est pas complètement réaliste. Une demande émanant d&#39;un navigateur impose au serveur une charge beaucoup plus importante qu&#39;une demande émanant d&#39;un siège, et la synchronisation des tests en état de siège diffère de celle du trafic réel. Les tests effectués en utilisant le siège ne prédisent pas le nombre de requêtes qu&#39;un serveur peut gérer. Des tests comme ceux-ci fournissent une base de comparaison des différentes configurations de serveur. Je ne pense pas que mon cluster puisse gérer 947 visiteurs réels par seconde, mais je suis convaincu que les performances de mon serveur sont meilleures que celles enregistrées auparavant.\ncommentaires"},{"id":"text-62","heading":"Text","content":"Les temps de chargement des pages sont importants pour une bonne expérience utilisateur. Les gens sont plus impliqués avec les sites qui se chargent rapidement et visitent généralement plus de pages.\nPour que les pages se chargent rapidement, il ne suffit pas de rendre les serveurs Web plus rapides. Lorsque les navigateurs chargent des pages, ils doivent d’abord la télécharger à partir d’un serveur Web. Si la page fait référence à d&#39;autres fichiers, tels que CSS, Javascript et images, le navigateur doit également récupérer ces fichiers. Une fois que tous les fichiers ont été téléchargés, le navigateur doit rendre la page. Les pages peuvent être optimisées pour que les navigateurs puissent les charger rapidement et efficacement.\nCe type d’optimisation ne concerne pas le réglage du serveur, mais l’optimisation des pages de votre site afin que les navigateurs puissent les charger facilement. Cela implique de passer du temps à ajuster le modèle HTML d&#39;un site.\nGoogle PageSpeed ​​Insights est un bon endroit pour trouver des idées sur la façon d&#39;optimiser votre site. Vous pouvez utiliser PageSpeed ​​Insights pour analyser les pages d&#39;un site et déterminer des moyens d&#39;améliorer les temps de chargement des pages. PageSpeed ​​Insights donne des suggestions détaillées sur la manière d&#39;améliorer les performances. Un score de classement des pages est attribué à votre site, ce qui s’améliore à mesure que vous parcourez la liste des problèmes.\nCSS en ligne\nJ&#39;avais l&#39;habitude de garder le code CSS pour mon site dans un fichier séparé dans /var/www/default_theme.css. Il a été référencé dans la section head de mon modèle HTML avec cette ligne:"},{"id":"text-63","heading":"Text","content":"Lorsque les navigateurs chargeaient les pages de mon site, ceux-ci ne pouvaient plus afficher cette page tant qu&#39;ils n&#39;avaient pas fait une nouvelle demande à mon serveur et téléchargé le fichier CSS. J&#39;ai éliminé ce délai en incluant le code CSS directement dans la section head de mon modèle HTML. J&#39;ai ajouté les balises suivantes à la section d&#39;en-tête de mon modèle, puis ai collé le contenu de mon fichier CSS entre elles:"},{"id":"text-64","heading":"Text","content":"Cela agrandit chaque page Web, mais réduit le nombre de demandes que mon serveur doit traiter. Cela signifie également que les navigateurs peuvent rendre la page plus efficacement.\nJavascript différé Chargement\nIl est assez courant de référencer les fichiers source javascript dans la section head d&#39;une page Web. J&#39;avais l&#39;habitude d&#39;avoir la balise suivante dans la tête de mon site afin que les images puissent être visionnées à l&#39;aide du plugin Javascript Lightbox:"},{"id":"text-65","heading":"Text","content":"Le problème, c&#39;est que lorsqu&#39;une page est téléchargée, le navigateur doit suspendre le traitement de la page pour télécharger le fichier Javascript. Cela interrompt le navigateur avant qu&#39;il puisse commencer à afficher la page.\nLa solution consiste à déplacer les références aux fichiers Javascript &quot;en dessous du pli&quot;. J&#39;ai mis à jour mon modèle HTML pour inclure cette ligne juste après le pied de page plutôt que dans la section head. Lorsque les pages de mon site sont chargées dans un navigateur, la plupart des pages sont rendues avant que le navigateur ne doive obtenir le fichier Javascript.\nBoutons de partage Javascript asynchrones\nLes boutons de partage sont un excellent moyen d&#39;augmenter le trafic sur votre site. Les visiteurs cliquent sur les boutons de partage pour partager votre site avec leurs amis et leurs abonnés sur les réseaux sociaux, augmentant ainsi le trafic généré par votre site à partir des réseaux sociaux. Il existe de nombreuses sociétés fournissant des plugins pouvant être ajoutés à un site. L&#39;inconvénient de certains plugins de partage est qu&#39;ils peuvent réduire la vitesse de chargement de la page en raison de problèmes liés à Javascript.\nAu lieu d&#39;utiliser un seul plug-in pour afficher les boutons de partage, vous pouvez utiliser des boutons de différents sites. Chaque réseau social possède ses propres boutons de partage que vous pouvez utiliser pour mettre des boutons de partage sur votre site. La plupart d&#39;entre eux sont asynchrones (mais pas Reddit au moment de la rédaction). Les boutons asynchrones sont chargés après le rendu de la page, ce qui accélère son chargement.\nDepuis que j&#39;ai supprimé le plug-in de partage et que je l&#39;ai remplacé par des boutons de partage individuels, les temps de chargement des pages affichés dans Google Analytics sont devenus beaucoup plus cohérents et beaucoup plus courts.\nMinify CSS et Javascript\nLes fichiers CSS et Javascript contiennent souvent beaucoup d&#39;espaces, tels que des espaces et des caractères de nouvelle ligne. L&#39;utilisation d&#39;espaces permet de rendre le code plus lisible, mais ajoute également à la taille des fichiers. La suppression de caractères blancs rend le code illisible, mais peut considérablement réduire la charge de votre serveur. J&#39;ai décidé de ne pas minifier mon code CSS car je veux pouvoir le lire, mais j&#39;ai supprimé beaucoup d&#39;espaces, tout en préservant un formatage de base. Voici à quoi ressemblait mon code CSS:"},{"id":"text-66","heading":"Text","content":".navbar li"},{"id":"text-67","heading":"Text","content":"    affichage: en ligne;\n    bordure gauche: noir 1px solide;\n    padding-left: 6px;"},{"id":"text-68","heading":"Text","content":"premier"},{"id":"text-69","heading":"Text","content":"    frontière gauche: aucune;"},{"id":"text-70","heading":"Text","content":".navbar li: premier enfant"},{"id":"text-71","heading":"Text","content":"    bordure: aucune;"},{"id":"text-72","heading":"Text","content":"Voici à quoi cela ressemble avec quelques espaces blancs supprimés:"},{"id":"text-73","heading":"Text","content":".navbar li"},{"id":"text-74","heading":"Text","content":" affichage: en ligne;\n bordure gauche: noir 1px solide;\n padding-left: 6px;"},{"id":"text-75","heading":"Text","content":"premier"},{"id":"text-76","heading":"Text","content":" frontière gauche: aucune;"},{"id":"text-77","heading":"Text","content":".navbar li: premier enfant"},{"id":"text-78","heading":"Text","content":" bordure: aucune;"},{"id":"text-79","heading":"Text","content":"Le code Javascript peut également être minifié. Je n&#39;ai pas l&#39;intention de modifier le code Javascript, je l&#39;ai donc complètement minifié. Il existe deux fichiers JavaScript que les navigateurs téléchargent sur mon site chaque fois qu&#39;ils chargent une page, /js/lightbox.js, pour afficher des images, et /js/jquery-1.7.2.min.js. Le fichier jQuery est déjà minifié.\nLe code de la visionneuse n’est pas minifié par défaut, je suis donc allé à cet outil de minifier Javascipt et\na collé le code de lightbox.js dans la zone de saisie et a appuyé sur le bouton d&#39;envoi. J&#39;ai créé un nouveau fichier dans / var / www / js appelé lightbox.min.js et ai collé la sortie de l&#39;outil Minifier dans le fichier. J&#39;ai modifié le modèle HTML de mon site afin de référencer ce nouveau fichier au lieu de la version non modifiée d&#39;origine. La version non décomposée de ce fichier était de 11,6 Ko et la version agrandie de 6,2 Ko.\nTirer parti de la mise en cache du navigateur\nLes navigateurs Web peuvent mettre en cache les pages de sorte qu&#39;elles ne doivent plus être téléchargées si un utilisateur revient à une page déjà visitée. Vous pouvez indiquer aux navigateurs de mettre en cache des pages en envoyant un en-tête de contrôle avant que la page soit envoyée par le serveur. Cela nécessite quelques modifications à la configuration d&#39;Apache. Tout d&#39;abord, le module d&#39;en-têtes doit être installé:"},{"id":"text-80","heading":"Text","content":"$ sudo a2enmod headers"},{"id":"text-81","heading":"Text","content":"Ensuite, le code suivant doit être collé quelque part dans /etc/apache2/apache2.conf:"},{"id":"text-82","heading":"Text","content":"Ensemble d&#39;en-têtes Cache-control &quot;public, max-age = 2592000&quot;"},{"id":"text-83","heading":"Text","content":"Ensemble d&#39;en-têtes Cache-control &quot;public, max-age = 604800&quot;"},{"id":"text-84","heading":"Text","content":"Cela indique à Apache que tout fichier avec une terminaison .ico, .png, .gif, .jpg ou .js doit être mis en cache pendant 2592000 secondes (30 jours) et les fichiers avec une fin .html doivent être mis en cache pendant 604800 secondes (7 jours). . La dernière étape consiste à redémarrer Apache:"},{"id":"text-85","heading":"Text","content":"$ sudo service apache2 restart"},{"id":"text-86","heading":"Text","content":"J&#39;ai exécuté cette commande sur un autre ordinateur pour m&#39;assurer que la mise en cache fonctionnait correctement:"},{"id":"text-87","heading":"Text","content":"$ wget --save-headers http://raspberrywebserver.com/feed-icon-14x14.png"},{"id":"text-88","heading":"Text","content":"Lorsque j&#39;ai ouvert le fichier téléchargé dans un éditeur de texte, ces en-têtes HTTP se trouvaient en haut:"},{"id":"text-89","heading":"Text","content":"HTTP / 1.1 200 OK\nDate: dim. 13 oct. 2013 à 01:24:25 GMT\nServeur: Apache / 2.2.22 (Debian)\nDernière mise à jour: mar. 01 oct 2013 à 03:40:50 GMT\nETag: &quot;226f0-2b1-4e7a5b80cb907&quot;\nAccept-Ranges: octets\nLongueur du contenu: 689\nCache-control: public, max-age = 259200\nKeep-Alive: délai d&#39;attente = 5, max = 100\nConnexion: Keep-Alive\nType de contenu: image / png"},{"id":"text-90","heading":"Text","content":"L&#39;en-tête de contrôle du cache est maintenant visible parmi les autres en-têtes HTTP.\nAffichage de la synchronisation des pages Google Analytics\nLa capture d&#39;écran de Google Analytics à droite montre comment les temps de chargement des pages se sont améliorés. Les temps de chargement des pages ont beaucoup fluctué lorsque j&#39;utilisais un plug-in de partage, mais se sont stabilisés dès que je m&#39;en suis débarrassé le 10 octobre. Au cours des prochains jours, le temps de chargement de la page a été réduit encore plus à mesure que je minifiais CSS et Javascript.\ncommentaires"},{"id":"text-91","heading":"Text","content":"Mon cluster de serveurs Raspberry Pi fonctionne depuis trois mois et dessert maintenant 45 000 pages vues par mois. La quantité de trafic\natteindre mon site est en augmentation constante et il existe parfois de fortes pics de trafic sur les sites de réseaux sociaux.  \nAu fur et à mesure que la charge sur le serveur augmente, il est important de vous assurer qu&#39;elle dispose de suffisamment de capacité. J&#39;ai donc décidé d&#39;augmenter sa puissance de calcul en ajoutant quatre nœuds de serveur Raspberry Pi supplémentaires au cluster.  \nJ&#39;ai construit deux nouveaux racks, chacun contenant quatre serveurs Raspberry Pi. J&#39;ai connecté en série deux commutateurs Ethernet, avec quatre serveurs Pi connectés à chaque commutateur.  \nJ&#39;ai cloné une carte SD à partir de l&#39;un des nœuds Pi et mis en place quatre cartes SD presque identiques. La seule différence entre eux est l&#39;adresse IP dans / etc / network / interfaces. J&#39;ai fait une sauvegarde de mon site à partir du tableau de bord de mon CMS et ai utilisé un script pour synchroniser le contenu de tous les nœuds de travail.\nL&#39;étape suivante consistait à modifier les paramètres de l&#39;équilibreur de charge pour pouvoir utiliser les nouveaux nœuds. Sur l&#39;équilibreur de charge, il fallait mettre à jour / etc / apache2 / sites-available / default pour inclure les nouveaux nœuds dans la déclaration de cluster:"},{"id":"text-92","heading":"Text","content":"BalancerMember http://192.168.1.2:80\n                BalancerMember http://192.168.1.3:80\n                BalancerMember http://192.168.1.4:80\n                BalancerMember http://192.168.1.5:80\n                BalancerMember http://192.168.1.6:80\n                BalancerMember http://192.168.1.7:80\n                BalancerMember http://192.168.1.8:80\n                BalancerMember http://192.168.1.9:80"},{"id":"text-93","heading":"Text","content":"                AllowOverride None\n                Ordre permettre, refuser\n                permettre à tous"},{"id":"text-94","heading":"Text","content":"                ProxySet lbmethod = byrequests"},{"id":"text-95","heading":"Text","content":"Une fois les modifications apportées, j&#39;ai exécuté cette commande pour les charger dans Apache:"},{"id":"text-96","heading":"Text","content":"$ sudo /etc/init.d/apache2 reload"},{"id":"text-97","heading":"Text","content":"Cela indique à Apache de recharger ses fichiers de configuration sans redémarrer. Je suis allé à l&#39;interface du gestionnaire d&#39;équilibrage à l&#39;adresse 192.168.0.3/balancer-manager pour m&#39;assurer que les nouveaux nœuds avaient été ajoutés:\nEssai\nJ&#39;ai testé le nouveau cluster à huit Pi en utilisant les mêmes tests que lorsque je n&#39;utilisais que quatre serveurs Pi. D&#39;abord, j&#39;ai utilisé seige pour générer 200 demandes simultanées en une minute:"},{"id":"text-98","heading":"Text","content":"$ siege -d1 -c200 -t1m http://192.168.0.3/specs.html"},{"id":"text-99","heading":"Text","content":"Lever le siège du serveur ... c&#39;est fait.\nTransactions: 23492 hits\nDisponibilité: 100.00%\nTemps écoulé: 59.81 secondes\nDonnées transférées: 48,93 Mo\nTemps de réponse: 0.01 sec\nTaux de transaction: 392,78 trans / s\nDébit: 0.82 Mo / sec\nAccès simultané: 3,81\nTransactions réussies: 23492\nTransactions échouées: 0\nLa transaction la plus longue: 0,63\nLa transaction la plus courte: 0.00"},{"id":"text-100","heading":"Text","content":"Le résultat est très similaire à celui obtenu pour le même test sur le cluster avec seulement quatre nœuds (voir &#39;Test du cluster entier&#39;).\nAméliorer les performances du cluster en ajustant Apache).  \nEnsuite, j&#39;ai lancé le siège avec 800 demandes simultanées:"},{"id":"text-101","heading":"Text","content":"Lever le siège du serveur ... c&#39;est fait.\nTransactions: 76510 hits\nDisponibilité: 100.00%\nTemps écoulé: 59.76 secondes\nDonnées transférées: 159,39 MB\nTemps de réponse: 0,12 seconde\nTaux de transaction: 1280.29 trans / s\nDébit: 2,67 Mo / sec\nAccès simultané: 148.45\nTransactions réussies: 76510\nTransactions échouées: 0\nLa transaction la plus longue: 13.04\nLa transaction la plus courte: 0.00"},{"id":"text-102","heading":"Text","content":"Le temps de transaction le plus long a augmenté, mais le débit et le nombre de transactions par seconde ont également augmenté.\nLes performances avec un faible nombre de demandes simultanées n&#39;ont pas vraiment changé, mais les performances se sont améliorées pour un nombre accru de demandes simultanées.\ndemandes. Cela est prévisible, car l&#39;ajout de nouveaux nœuds ne rend pas un cluster plus rapide, mais vise à augmenter la capacité du cluster.\nJ&#39;ai été surpris que le temps pour la plus longue transaction a augmenté. La plupart des demandes sont traitées en 20 ms ou moins, et malheureusement, le siège ne fonctionne pas\nenregistrer le temps de réponse moyen. \nLes tests avec Apache Bench, ab, montrent que le temps de transaction le plus long était de 5,111 secondes, mais que le temps moyen de transaction était de 0,214 seconde.\nL&#39;augmentation du temps de transaction le plus long ne signifie pas que la performance globale est pire, mais c&#39;est une source de préoccupation. Je me suis connecté à la charge\nl’équilibreur à l’aide de ssh et a relancé les tests sur mon cluster. J&#39;ai exécuté la commande uptime suivie de free sur l&#39;équilibreur de charge:"},{"id":"text-103","heading":"Text","content":"$ disponibilité\n 13:30:04 up 1 day,  5:20,  1 user,  load average: 9.27, 3.52, 1.33\n$ free\n             total       used       free     shared    buffers     cached\nMem:        498268     487188      11080          0      37328     299752\n-/+ buffers/cache:     150108     348160\nSwap:       513020         20     513000"},{"id":"text-104","heading":"Text","content":"The load average figures for the load balancer are much higher than for the servers.  The load balancer only has 11MB of RAM left and has \nstarted to use swap.  When web servers start to use swap space, they slow down dramatically, so I need to look into the performance and memory \nusage of my load balancer.  Using siege to test with 800 concurrent users is testing for the worst case.  At the moment my site isn&#39;t getting \nthat much traffic, so the performance issues with the load balancer aren&#39;t an immediate problem, but it&#39;s something I need to look at.  \nI still don&#39;t know how much traffic this system can actually handle because serving real traffic is not the same as testing with siege. je fais\nknow that my server can handle at least 45,000 hits a month, and probably a lot more now that I have added more nodes.\ncommentaires"},{"id":"text-105","heading":"Text","content":"Ever since I built my cluster people have been asking me why I used Apache and not Nginx.  I started using Apache because I was just used to it.  People say it&#39;s slow and takes up too much memory, but I find that with a little tuning it can perform quite well.\nStill, Nginx does have a reputation for being fast.  I wanted to see which web server would be best for my cluster, so I installed Apache on one Pi and Nginx on another.  \nI used two Raspberry Pi model B servers, each with identical Sandisk 4GB class 4 SD cards.  In raspi-config, I overclocked each Pi to 800MHz, and allocated 16MB of memory to the GPU.  I used the same version of Raspbian (released on 2013-09-25) on both servers.  I used exactly the same test data and scripts on each Pi.\nFollow this link to see how I set up Nginx and uWSGI.\nI tuned Apache by removing modules and increasing the number of server processes.  These tuning techniques don&#39;t apply to Nginx.\nI tested each server with three different types of request: a static HTML file, a simple CGI script, and a complex CGI script.  The HTML file is a cached page in my Content Management System (the CMS doesn&#39;t need to execute for cached pages to be served, they can be served by Apache as normal HTML files).  The simple script just prints an HTTP header, prints &quot;Hello World!&quot; and exits.\nThe complex script used in these tests was the CMS that this site is built on.  I disabled page caching on both Pi servers, so that pages had to be generated dynamically by the CMS.  When a page is served, the CMS script has to parse two XML files to get meta data, read several snippets of HTML from the file system, and print them to a socket.\nRequests were generated with Apache Bench using a command like this:"},{"id":"text-106","heading":"Text","content":"ab -n 1000 -c 250 http://192.168.0.21/spec.html"},{"id":"text-107","heading":"Text","content":"where 1000 is the number of requests to issue, and 250 is the number of concurrent users.  \nThe Raspberry Pi running Nginx had IP address 192.168.0.21, and the Pi running Apache had 192.168.0.22.  I tested each server over a range of concurrent users for each type of request.  \nStatic files\nStatic files are easy to serve, so I used a range of 50 to 250 concurrent users in these tests.  Apache handled 220 connections per second, while Nginx handled around 300 connections per second.\nNginx came out ahead on these tests.\nDynamic content tests\nSimple script\nIn these tests I used ab to request this URL: http://192.168.0.21/cgi-bin/hello.py.  I set the number of request to 100, and tested over a range of 10 to 50 concurrent users.\nApache handled 4.78 connections per second, and Nginx handled 4.65 connections per second, but the results showed that the mean transaction time was lower for Nginx than Apache, so Apache was slower in this test.  The difference was not very pronounced under a low load, but it increased as the load increased.\nComplex script\nThe URL used in these test was http://192.168.0.21/spec.html.  This test is the most CPU intensive so I used from 5 to 25 concurrent users in these tests.  \nUnder a low load, Apache&#39;s performance was slightly better than Nginx, but only by a very slim margin.  With 25 concurrent users, Apache was slower than Nginx.  The difference under a low load is negligible, but with 25 concurrent users, Nginx was noticeably faster than Apache.\nConclusions\nThere are many variables involved in server performance.  These tests don&#39;t definitively determine which server is &#39;better&#39;, they just helped me decide which one is best for my specific needs.\nMost of the pages on my site are static, and Nginx is faster when it comes to static pages.  It looks like Nginx is a better choice for me.  \ncommentaires"},{"id":"text-108","heading":"Text","content":"Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]"}],"media":{"primary_image":""},"relations":[{"rel":"canonical","href":"https://tutos-gameserver.fr/2019/06/10/serveur-web-raspberry-pi-raspberry-pi-cluster-serveur-dimpression/"},{"rel":"alternate","href":"https://tutos-gameserver.fr/2019/06/10/serveur-web-raspberry-pi-raspberry-pi-cluster-serveur-dimpression/llm","type":"text/html"},{"rel":"alternate","href":"https://tutos-gameserver.fr/2019/06/10/serveur-web-raspberry-pi-raspberry-pi-cluster-serveur-dimpression/llm.json","type":"application/json"},{"rel":"llm-manifest","href":"https://tutos-gameserver.fr/llm-endpoints-manifest.json","type":"application/json"}],"http_headers":{"X-LLM-Friendly":"1","X-LLM-Schema":"1.1.0","Content-Security-Policy":"default-src 'none'; img-src * data:; style-src 'unsafe-inline'"},"license":"CC BY-ND 4.0","attribution_required":true,"allow_cors":false}