{"id":35106,"date":"2019-10-31T22:02:22","date_gmt":"2019-10-31T19:02:22","guid":{"rendered":"https:\/\/prohoster.info\/blog\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie\/"},"modified":"2019-10-31T22:02:22","modified_gmt":"2019-10-31T19:02:22","slug":"proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","title":{"rendered":"Performance des applications r\u00e9seau Linux. Introduction","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Les applications web sont d\u00e9sormais omnipr\u00e9sentes, et parmi tous les protocoles de transport, HTTP en occupe une grande partie. En explorant les subtilit\u00e9s du d\u00e9veloppement d'applications web, la plupart des gens accordent tr\u00e8s peu d'attention au syst\u00e8me d'exploitation sur lequel ces applications s'ex\u00e9cutent r\u00e9ellement. La s\u00e9paration entre le d\u00e9veloppement (Dev) et l'exploitation (Ops) n'a fait qu'aggraver la situation. Cependant, avec la mont\u00e9e de la culture DevOps, les d\u00e9veloppeurs commencent \u00e0 assumer la responsabilit\u00e9 de la mise en route de leurs applications dans le cloud. Il est donc tr\u00e8s utile pour eux de se familiariser en profondeur avec le backend du syst\u00e8me d'exploitation. Cela est particuli\u00e8rement b\u00e9n\u00e9fique si vous essayez de d\u00e9ployer un syst\u00e8me pour des milliers ou des dizaines de milliers de connexions simultan\u00e9es.<\/p>\n<p>Les restrictions dans les services web ressemblent beaucoup \u00e0 celles rencontr\u00e9es dans d'autres applications. Que ce soit les \u00e9quilibreurs de charge ou les serveurs de bases de donn\u00e9es, toutes ces applications pr\u00e9sentent des probl\u00e8mes similaires dans un environnement hautes performances. Comprendre ces limitations fondamentales et les moyens de les surmonter permettra d'\u00e9valuer la performance et la scalabilit\u00e9 de vos applications web.<\/p>\n<p>J'\u00e9cris cette s\u00e9rie d'articles en r\u00e9ponse aux questions de jeunes d\u00e9veloppeurs qui souhaitent devenir des architectes syst\u00e8mes bien inform\u00e9s. Il est impossible de comprendre clairement les m\u00e9thodes d'optimisation des applications Linux sans plonger dans leurs fondements et leur fonctionnement au niveau du syst\u00e8me d'exploitation. Bien qu'il existe de nombreux types d'applications, dans ce cycle, je souhaite explorer les applications r\u00e9seau plut\u00f4t que les applications de bureau comme les navigateurs ou les \u00e9diteurs de texte. Ce mat\u00e9riel s'adresse aux d\u00e9veloppeurs et architectes qui souhaitent comprendre comment fonctionnent les programmes Linux ou Unix et comment les structurer pour des performances \u00e9lev\u00e9es.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nLinux est <i>un syst\u00e8me d'exploitation<\/i> serveur, et la plupart du temps, vos applications fonctionnent sur ce syst\u00e8me d'exploitation. Bien que je dise \u00ab Linux \u00bb, vous pouvez souvent supposer avec confiance que cela fait r\u00e9f\u00e9rence \u00e0 toutes les syst\u00e8mes d'exploitation de type Unix au sens large. Cependant, je n'ai pas test\u00e9 le code d'accompagnement sur d'autres syst\u00e8mes. Donc, si vous \u00eates int\u00e9ress\u00e9 par FreeBSD ou OpenBSD, les r\u00e9sultats peuvent varier. Lorsque j'essaie quelque chose de sp\u00e9cifique \u00e0 Linux, je l'indique.<\/p>\n<p>Bien que vous puissiez utiliser les connaissances acquises pour cr\u00e9er une application depuis z\u00e9ro, qui sera parfaitement optimis\u00e9e, il est pr\u00e9f\u00e9rable de ne pas le faire. Si vous \u00e9crivez un nouveau serveur web en C ou C++ pour l'application commerciale de votre organisation, cela pourrait \u00eatre votre dernier jour de travail. Cependant, conna\u00eetre la structure de ces applications vous aidera \u00e0 choisir parmi les programmes existants. Vous pourrez comparer les syst\u00e8mes bas\u00e9s sur les processus avec ceux bas\u00e9s sur les threads, ainsi que sur les \u00e9v\u00e9nements. Vous comprendrez et appr\u00e9cierez pourquoi Nginx fonctionne mieux qu'Apache httpd, et pourquoi une application Python bas\u00e9e sur Tornado peut servir plus d'utilisateurs qu'une application Python bas\u00e9e sur Django.<\/p>\n<h1>ZeroHTTPd : outil d'apprentissage<\/h1>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/shuveb\/zerohttpd\">ZeroHTTPd<\/a><\/noindex>\u00a0\u2014 un serveur web que j'ai \u00e9crit depuis z\u00e9ro en C en tant qu'outil p\u00e9dagogique. Il n'a aucune d\u00e9pendance externe, y compris l'acc\u00e8s \u00e0 Redis. Nous ex\u00e9cutons nos propres proc\u00e9dures Redis. Pour plus de d\u00e9tails, voir ci-dessous.<\/p>\n<p>Bien que nous puissions discuter longuement de la th\u00e9orie, rien ne vaut le fait d'\u00e9crire du code, de l'ex\u00e9cuter et de comparer toutes les architectures de serveurs. C'est la m\u00e9thode la plus illustrative. Par cons\u00e9quent, nous allons \u00e9crire le simple serveur web ZeroHTTPd, en appliquant chaque mod\u00e8le : bas\u00e9 sur des processus, des threads et des \u00e9v\u00e9nements. Nous v\u00e9rifierons chacun de ces serveurs et verrons comment ils fonctionnent les uns par rapport aux autres. ZeroHTTPd est impl\u00e9ment\u00e9 dans un seul fichier C. Le serveur bas\u00e9 sur les \u00e9v\u00e9nements comprend <noindex><a rel=\"nofollow\" href=\"https:\/\/troydhanson.github.io\/uthash\/\">uthash<\/a><\/noindex>, une excellente impl\u00e9mentation de table de hachage qui est fournie dans un seul fichier d'en-t\u00eate. Dans les autres cas, il n'y a aucune d\u00e9pendance afin de ne pas compliquer le projet.<\/p>\n<p>Le code contient de nombreux commentaires pour aider \u00e0 la compr\u00e9hension. \u00c9tant un simple serveur web en quelques lignes de code, ZeroHTTPd sert \u00e9galement de cadre minimal pour le d\u00e9veloppement web. Il a une fonctionnalit\u00e9 limit\u00e9e, mais il est capable de servir des fichiers statiques et des pages 'dynamiques' tr\u00e8s simples. Je dois dire que ZeroHTTPd est bien adapt\u00e9 pour apprendre \u00e0 cr\u00e9er des applications Linux haute performance. En principe, la plupart des services web attendent des requ\u00eates, les v\u00e9rifient et les traitent. C'est exactement ce que fera ZeroHTTPd. C'est un outil d'apprentissage, pas un outil de production. Il n'est pas fort en gestion d'erreurs et n'a probablement pas les meilleures pratiques de s\u00e9curit\u00e9 (oh oui, j'ai utilis\u00e9 <code>strcpy<\/code>) ou des tours de langage en C. Mais j'esp\u00e8re qu'il s'en sortira bien avec sa t\u00e2che.<\/p>\n<p><img decoding=\"async\" alt=\"Performance des applications r\u00e9seau Linux. Introduction\" src=\"\/wp-content\/uploads\/33fd0a5353667001523d5d4c8ada9ecf.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Page d'accueil de ZeroHTTPd. Il peut fournir diff\u00e9rents types de fichiers, y compris des images.<\/i><\/p>\n<h1>Application de livre d'or<\/h1>\n<p>\nLes applications web modernes ne se limitent g\u00e9n\u00e9ralement pas aux fichiers statiques. Elles ont des interactions complexes avec diverses bases de donn\u00e9es, caches, etc. Nous allons donc cr\u00e9er une simple application web appel\u00e9e \u00ab Livre d'or \u00bb, o\u00f9 les visiteurs laissent des messages sous leurs noms. Le livre d'or conserve les messages laiss\u00e9s auparavant. Il y a aussi un compteur de visiteurs en bas de la page.<\/p>\n<p><img decoding=\"async\" alt=\"Performance des applications r\u00e9seau Linux. Introduction\" src=\"\/wp-content\/uploads\/ed8e828e8567d3d114875520988742d7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Application web \u00ab Livre d'or \u00bb ZeroHTTPd<\/i><\/p>\n<p>Le compteur de visiteurs et les messages du livre d'or sont stock\u00e9s dans Redis. Des proc\u00e9dures personnalis\u00e9es ont \u00e9t\u00e9 mises en place pour communiquer avec Redis, ind\u00e9pendamment des biblioth\u00e8ques externes. Je ne suis pas un grand fan de d\u00e9velopper un code maison alors qu'il existe des solutions publiques et bien test\u00e9es. Mais l'objectif de ZeroHTTPd est d'explorer la performance de Linux et l'acc\u00e8s aux services externes, tandis que le traitement des requ\u00eates HTTP a un impact significatif sur la performance. Nous devons contr\u00f4ler compl\u00e8tement les communications avec Redis dans chacune de nos architectures serveur. Dans une architecture, nous utilisons des appels bloquants, tandis que dans d'autres, nous utilisons des proc\u00e9dures bas\u00e9es sur les \u00e9v\u00e9nements. L'utilisation d'une biblioth\u00e8que cliente Redis externe ne fournirait pas un tel contr\u00f4le. De plus, notre petit client Redis ex\u00e9cute seulement quelques fonctions (obtenir, configurer et incr\u00e9menter une cl\u00e9 ; obtenir et ajouter \u00e0 un tableau). De plus, le protocole Redis est d'une \u00e9l\u00e9gance et d'une simplicit\u00e9 exceptionnelles. On n'a m\u00eame pas besoin d'apprendre sp\u00e9cifiquement \u00e0 l'utiliser. Le fait que tout le travail du protocole soit r\u00e9alis\u00e9 en environ cent lignes de code montre \u00e0 quel point il est bien con\u00e7u.<\/p>\n<p>La figure suivante montre les actions de l'application lorsque le client (navigateur) fait une demande. <code>\/guestbookURL<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"Performance des applications r\u00e9seau Linux. Introduction\" src=\"\/wp-content\/uploads\/5c5e6740419384b7232aeead95db491b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>M\u00e9canisme de fonctionnement de l'application livre d'or<\/i><\/p>\n<p>Lorsqu'il est n\u00e9cessaire de d\u00e9livrer une page du livre d'or, un appel est effectu\u00e9 au syst\u00e8me de fichiers pour lire le mod\u00e8le en m\u00e9moire et trois appels r\u00e9seau \u00e0 Redis. Le fichier mod\u00e8le contient la majeure partie du contenu HTML de la page visible sur la capture d'\u00e9cran ci-dessus. Il y a \u00e9galement des espaces r\u00e9serv\u00e9s sp\u00e9ciaux pour la partie dynamique du contenu : les entr\u00e9es et le compteur de visiteurs. Nous les r\u00e9cup\u00e9rons depuis Redis, les ins\u00e9rons sur la page et d\u00e9livrons un contenu compl\u00e8tement form\u00e9 au client. Le troisi\u00e8me appel \u00e0 Redis peut \u00eatre \u00e9vit\u00e9 car Redis renvoie une nouvelle valeur de la cl\u00e9 lorsqu'elle est incr\u00e9ment\u00e9e. Cependant, pour notre serveur avec une architecture asynchrone bas\u00e9e sur des \u00e9v\u00e9nements, de nombreux appels r\u00e9seau constituent une bonne \u00e9preuve \u00e0 des fins \u00e9ducatives. Ainsi, nous d\u00e9daignons la valeur renvoy\u00e9e par Redis concernant le nombre de visiteurs et la demandons dans un appel s\u00e9par\u00e9.<\/p>\n<h1>Architectures serveurs ZeroHTTPd<\/h1>\n<p>\nNous construisons sept versions de ZeroHTTPd avec des fonctionnalit\u00e9s identiques, mais avec des architectures diff\u00e9rentes :<\/p>\n<ul>\n<li>It\u00e9rative\n<\/li>\n<li>Serveur fork (un processus fils par requ\u00eate)\n<\/li>\n<li>Serveur pr\u00e9-fork (forking de processus \u00e0 l'avance)\n<\/li>\n<li>Serveur avec des threads d'ex\u00e9cution (un thread par requ\u00eate)\n<\/li>\n<li>Serveur avec threads pr\u00e9-cr\u00e9\u00e9s\n<\/li>\n<li>Architecture bas\u00e9e sur <code>poll()<\/code>\n<\/li>\n<li>Architecture bas\u00e9e sur <code>epoll<\/code><\/li>\n<\/ul>\n<p>\nNous mesurons la performance de chaque architecture en chargeant le serveur avec des requ\u00eates HTTP. Mais lors de la comparaison des architectures avec un haut degr\u00e9 de parall\u00e9lisme, le nombre de requ\u00eates augmente. Nous effectuons trois tests et calculons la moyenne.<\/p>\n<h1>M\u00e9thodologie de test<\/h1>\n<p>\n<img decoding=\"async\" alt=\"Performance des applications r\u00e9seau Linux. Introduction\" src=\"\/wp-content\/uploads\/aa4f337b6e90fa032fbef5374fac8f53.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Configuration pour le test de charge de ZeroHTTPd<\/i> <\/p>\n<p>Il est important que, lors de l'ex\u00e9cution des tests, tous les composants ne fonctionnent pas sur une seule machine. Dans ce cas, le syst\u00e8me d'exploitation entra\u00eene des frais g\u00e9n\u00e9raux suppl\u00e9mentaires en raison de la planification, car les composants rivalisent pour le CPU. Mesurer les frais g\u00e9n\u00e9raux du syst\u00e8me d'exploitation avec chacune des architectures serveur choisies est l'un des objectifs les plus importants de cet exercice. L'ajout de variables suppl\u00e9mentaires serait pr\u00e9judiciable au processus. Par cons\u00e9quent, la configuration illustr\u00e9e ci-dessus fonctionne le mieux.<\/p>\n<h3>Que fait chacun de ces serveurs<\/h3>\n<p><\/p>\n<ul>\n<li>load.unixism.net : ici nous ex\u00e9cutons <code>ab<\/code>, l'outil Apache Benchmark. Il g\u00e9n\u00e8re la charge n\u00e9cessaire pour tester nos architectures serveurs.\n<\/li>\n<li>nginx.unixism.net : parfois, nous voulons ex\u00e9cuter plusieurs instances d'un programme serveur. Pour cela, le serveur Nginx, avec les configurations appropri\u00e9es, fonctionne comme un r\u00e9partiteur de charge recevant des requ\u00eates de <i>ab<\/i> nos processus serveur.\n<\/li>\n<li>zerohttpd.unixism.net : ici, nous ex\u00e9cutons nos programmes serveur sur sept architectures diff\u00e9rentes, un \u00e0 la fois.\n<\/li>\n<li>redis.unixism.net : sur ce serveur, le d\u00e9mon Redis fonctionne, o\u00f9 les enregistrements du livre d'or et le compteur de visiteurs sont stock\u00e9s.<\/li>\n<\/ul>\n<p>\nTous les serveurs fonctionnent sur un seul c\u0153ur de processeur. L'id\u00e9e est d'\u00e9valuer la performance maximale de chacune des architectures. Comme tous les programmes serveur sont test\u00e9s sur le m\u00eame mat\u00e9riel, cela constitue une base pour leur comparaison. Mon installation de test se compose de serveurs virtuels lou\u00e9s chez Digital Ocean.<\/p>\n<h3>Qu'est-ce que nous mesurons ?<\/h3>\n<p>\nDiff\u00e9rents indicateurs peuvent \u00eatre mesur\u00e9s. Nous \u00e9valuons la performance de chaque architecture dans cette configuration, en chargeant les serveurs avec des requ\u00eates \u00e0 diff\u00e9rents niveaux de parall\u00e9lisme : la charge augmente de 20 \u00e0 15 000 utilisateurs simultan\u00e9s.<\/p>\n<h1>R\u00e9sultats des tests<\/h1>\n<p>\nLe graphique suivant montre la performance des serveurs sur diff\u00e9rentes architectures \u00e0 divers niveaux de parall\u00e9lisme. Sur l'axe y, le nombre de requ\u00eates par seconde, sur l'axe x, les connexions parall\u00e8les.<\/p>\n<p><img decoding=\"async\" alt=\"Performance des applications r\u00e9seau Linux. Introduction\" src=\"\/wp-content\/uploads\/3415bcfb66503152d644130f68bd19da.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Performance des applications r\u00e9seau Linux. Introduction\" src=\"\/wp-content\/uploads\/ba457b671eb758f3226e0eeafaadc6aa.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Performance des applications r\u00e9seau Linux. Introduction\" src=\"\/wp-content\/uploads\/aea06856d61d4d4bdda9814c53a28d4a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCi-dessous, un tableau avec les r\u00e9sultats.<\/p>\n<p> requ\u00eates par seconde <\/p>\n<p><strong>parall\u00e9lisme<\/strong><br \/>\n<strong>it\u00e9ratif<\/strong><br \/>\n<strong>fork<\/strong><br \/>\n<strong>pr\u00e9-fork<\/strong><br \/>\n<strong>thread\u00e9<\/strong><br \/>\n<strong>pr\u00e9-thread\u00e9<\/strong><br \/>\n<strong>poll<\/strong><br \/>\n<strong>epoll<\/strong><\/p>\n<p>20<br \/>\n7<br \/>\n112<br \/>\n2100<br \/>\n1800<br \/>\n2250<br \/>\n1900<br \/>\n2050<\/p>\n<p>50<br \/>\n7<br \/>\n190<br \/>\n2200<br \/>\n1700<br \/>\n2200<br \/>\n2000<br \/>\n2000<\/p>\n<p>100<br \/>\n7<br \/>\n245<br \/>\n2200<br \/>\n1700<br \/>\n2200<br \/>\n2150<br \/>\n2100<\/p>\n<p>200<br \/>\n7<br \/>\n330<br \/>\n2300<br \/>\n1750<br \/>\n2300<br \/>\n2200<br \/>\n2100<\/p>\n<p>300<br \/>\n\u2013<br \/>\n380<br \/>\n2200<br \/>\n1800<br \/>\n2400<br \/>\n2250<br \/>\n2150<\/p>\n<p>400<br \/>\n\u2013<br \/>\n410<br \/>\n2200<br \/>\n1750<br \/>\n2600<br \/>\n2000<br \/>\n2000<\/p>\n<p>500<br \/>\n\u2013<br \/>\n440<br \/>\n2300<br \/>\n1850<br \/>\n2700<br \/>\n1900<br \/>\n2212<\/p>\n<p>600<br \/>\n\u2013<br \/>\n460<br \/>\n2400<br \/>\n1800<br \/>\n2500<br \/>\n1700<br \/>\n2519<\/p>\n<p>700<br \/>\n\u2013<br \/>\n460<br \/>\n2400<br \/>\n1600<br \/>\n2490<br \/>\n1550<br \/>\n2607<\/p>\n<p>800<br \/>\n\u2013<br \/>\n460<br \/>\n2400<br \/>\n1600<br \/>\n2540<br \/>\n1400<br \/>\n2553<\/p>\n<p>900<br \/>\n\u2013<br \/>\n460<br \/>\n2300<br \/>\n1600<br \/>\n2472<br \/>\n1200<br \/>\n2567<\/p>\n<p>1000<br \/>\n\u2013<br \/>\n475<br \/>\n2300<br \/>\n1700<br \/>\n2485<br \/>\n1150<br \/>\n2439<\/p>\n<p>1500<br \/>\n\u2013<br \/>\n490<br \/>\n2400<br \/>\n1550<br \/>\n2620<br \/>\n900<br \/>\n2479<\/p>\n<p>2000<br \/>\n\u2013<br \/>\n350<br \/>\n2400<br \/>\n1400<br \/>\n2396<br \/>\n550<br \/>\n2200<\/p>\n<p>2500<br \/>\n\u2013<br \/>\n280<br \/>\n2100<br \/>\n1300<br \/>\n2453<br \/>\n490<br \/>\n2262<\/p>\n<p>3000<br \/>\n\u2013<br \/>\n280<br \/>\n1900<br \/>\n1250<br \/>\n2502<br \/>\nlarge variation<br \/>\n2138<\/p>\n<p>5000<br \/>\n\u2013<br \/>\nlarge variation<br \/>\n1600<br \/>\n1100<br \/>\n2519<br \/>\n\u2013<br \/>\n2235<\/p>\n<p>8000<br \/>\n\u2013<br \/>\n\u2013<br \/>\n1200<br \/>\nlarge variation<br \/>\n2451<br \/>\n\u2013<br \/>\n2100<\/p>\n<p>10\u00a0000<br \/>\n\u2013<br \/>\n\u2013<br \/>\nlarge variation<br \/>\n\u2013<br \/>\n2200<br \/>\n\u2013<br \/>\n2200<\/p>\n<p>11\u00a0000<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n2200<br \/>\n\u2013<br \/>\n2122<\/p>\n<p>12\u00a0000<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n970<br \/>\n\u2013<br \/>\n1958<\/p>\n<p>13\u00a0000<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n730<br \/>\n\u2013<br \/>\n1897<\/p>\n<p>14\u00a0000<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n590<br \/>\n\u2013<br \/>\n1466<\/p>\n<p>15\u00a0000<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n532<br \/>\n\u2013<br \/>\n1281<\/p>\n<p>\nD'apr\u00e8s le graphique et le tableau, on peut voir qu'au-del\u00e0 de 8000 requ\u00eates simultan\u00e9es, il ne reste que deux options : pr\u00e9-fork et epoll. Avec l'augmentation de la charge, le serveur bas\u00e9 sur poll performe moins bien que le thread\u00e9. L'architecture avec cr\u00e9ation anticip\u00e9e de threads constitue une s\u00e9rieuse concurrence pour epoll : cela t\u00e9moigne de l'efficacit\u00e9 avec laquelle le noyau Linux g\u00e8re un grand nombre de threads.<\/p>\n<h1>Code source de ZeroHTTPd<\/h1>\n<p>\nCode source de ZeroHTTPd <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/shuveb\/zerohttpd\">ici<\/a><\/noindex>. Un r\u00e9pertoire distinct pour chaque architecture.<\/p>\n<pre>ZeroHTTPd\n\u2502\n\u251c\u2500\u2500 01_iterative\n\u2502   \u251c\u2500\u2500 main.c\n\u251c\u2500\u2500 02_forking\n\u2502   \u251c\u2500\u2500 main.c\n\u251c\u2500\u2500 03_preforking\n\u2502   \u251c\u2500\u2500 main.c\n\u251c\u2500\u2500 04_threading\n\u2502   \u251c\u2500\u2500 main.c\n\u251c\u2500\u2500 05_prethreading\n\u2502   \u251c\u2500\u2500 main.c\n\u251c\u2500\u2500 06_poll\n\u2502   \u251c\u2500\u2500 main.c\n\u251c\u2500\u2500 07_epoll\n\u2502    \u2514\u2500\u2500 main.c\n\u251c\u2500\u2500 Makefile\n\u251c\u2500\u2500 public\n\u2502   \u251c\u2500\u2500 index.html\n\u2502   \u2514\u2500\u2500 tux.png\n\u2514\u2500\u2500 templates\n    \u2514\u2500\u2500 guestbook\n        \u2514\u2500\u2500 index.html<\/pre>\n<p>\nEn plus des sept r\u00e9pertoires pour toutes les architectures, il y a deux autres dans le r\u00e9pertoire principal : public et templates. Dans le premier se trouve le fichier index.html et l'image du premier \u00e9cran. Vous pouvez y placer d'autres fichiers et dossiers, et ZeroHTTPd doit \u00eatre en mesure de servir ces fichiers statiques sans probl\u00e8me. Si le chemin dans le navigateur correspond \u00e0 celui dans le dossier public, ZeroHTTPd recherche le fichier index.html dans ce r\u00e9pertoire. Le contenu du livre d'or est g\u00e9n\u00e9r\u00e9 dynamiquement. Il n'a qu'une seule page d'accueil, et son contenu est bas\u00e9 sur le fichier 'templates\/guestbook\/index.html'. Il est facile d'ajouter des pages dynamiques \u00e0 ZeroHTTPd pour l'\u00e9tendre. L'id\u00e9e est que les utilisateurs peuvent ajouter des mod\u00e8les dans ce r\u00e9pertoire et \u00e9tendre ZeroHTTPd selon leurs besoins.<\/p>\n<p>Pour compiler les sept serveurs, ex\u00e9cutez <code>make all<\/code> depuis le r\u00e9pertoire racine \u2014 et tous les builds appara\u00eetront dans ce r\u00e9pertoire. Les fichiers ex\u00e9cutables recherchent les r\u00e9pertoires public et templates dans le r\u00e9pertoire depuis lequel ils sont lanc\u00e9s.<\/p>\n<h1>API Linux<\/h1>\n<p>\nPour comprendre les informations dans ce cycle d'articles, il n'est pas n\u00e9cessaire de bien conna\u00eetre l'API Linux. Cependant, je recommande de lire davantage sur le sujet, il existe de nombreuses ressources de r\u00e9f\u00e9rence en ligne. Bien que nous abordions plusieurs cat\u00e9gories de l'API Linux, notre attention se concentrera principalement sur les processus, les threads, les \u00e9v\u00e9nements et la pile r\u00e9seau. En plus des livres et articles sur l'API Linux, je recommande \u00e9galement de lire les manuels pour les appels syst\u00e8me et les fonctions de biblioth\u00e8que utilis\u00e9es.<\/p>\n<h1>Performance et \u00e9volutivit\u00e9<\/h1>\n<p>\nUne remarque sur la performance et l'\u00e9volutivit\u00e9. Th\u00e9oriquement, il n'y a aucun lien entre les deux. Vous pouvez avoir un service web qui fonctionne tr\u00e8s bien, avec un temps de r\u00e9ponse de quelques millisecondes, mais qui n'est pas \u00e9volutif du tout. De m\u00eame, une application web peu performante peut prendre plusieurs secondes pour r\u00e9pondre, mais elle peut \u00e9voluer pour g\u00e9rer des dizaines de milliers d'utilisateurs simultan\u00e9s. N\u00e9anmoins, la combinaison d'une haute performance et d'une \u00e9volutivit\u00e9 est une tr\u00e8s puissante. Les applications hautes performances utilisent g\u00e9n\u00e9ralement les ressources de mani\u00e8re \u00e9conomique et par cons\u00e9quent, g\u00e8rent efficacement un plus grand nombre d'utilisateurs simultan\u00e9s sur le serveur, r\u00e9duisant ainsi les co\u00fbts.<\/p>\n<h1>T\u00e2ches CPU et I\/O<\/h1>\n<p>\nEnfin, il existe toujours deux types possibles de t\u00e2ches dans les calculs : celles li\u00e9es \u00e0 l'I\/O et celles li\u00e9es au CPU. La r\u00e9ception de requ\u00eates via Internet (entr\u00e9e\/sortie r\u00e9seau), la gestion de fichiers (entr\u00e9e\/sortie r\u00e9seau et disque), les communications avec la base de donn\u00e9es (entr\u00e9e\/sortie r\u00e9seau et disque) - tout cela constitue des actions I\/O. Certaines requ\u00eates \u00e0 la base de donn\u00e9es peuvent l\u00e9g\u00e8rement solliciter le CPU (tri, calcul de la moyenne d'un million de r\u00e9sultats, etc.). La plupart des applications web sont limit\u00e9es par un I\/O maximal, tandis que le processeur est rarement utilis\u00e9 \u00e0 pleine capacit\u00e9. Lorsque vous constatez qu'une t\u00e2che d'entr\u00e9e\/sortie utilise beaucoup de CPU, c'est probablement un signe d'une mauvaise architecture d'application. Cela peut signifier que les ressources CPU sont d\u00e9pens\u00e9es pour la gestion des processus et le changement de contexte - ce qui n'est pas particuli\u00e8rement utile. Si vous faites quelque chose comme le traitement d'images, la conversion de fichiers audio ou de l'apprentissage automatique, alors l'application n\u00e9cessite une puissance CPU \u00e9lev\u00e9e. Mais pour la plupart des applications, ce n'est pas le cas.<\/p>\n<h1>Plus de d\u00e9tails sur les architectures serveur<\/h1>\n<p><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-i-iterative-servers\/\">Partie I. Architecture it\u00e9rative<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-ii-forking-servers\/\">Partie II. Serveurs fork<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-iii-preforked-servers\/\">Partie III. Serveurs pr\u00e9-fork<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-iv-threaded-servers\/\">Partie IV. Serveurs avec threads d'ex\u00e9cution<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-v-pre-threaded-servers\/\">Partie V. Serveurs avec cr\u00e9ation de threads \u00e0 l'avance<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-vi-polling-servers\/\">Partie VI. Architecture bas\u00e9e sur poll<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-vii-epoll-servers\/\">Partie VII. Architecture bas\u00e9e sur epoll<\/a><\/noindex><\/li>\n<\/ol>\n<p>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/455212\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u044b\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u043e\u0432\u0441\u0435\u043c\u0435\u0441\u0442\u043d\u043e, \u0430 \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 \u043b\u044c\u0432\u0438\u043d\u0443\u044e \u0434\u043e\u043b\u044e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 HTTP. \u0418\u0437\u0443\u0447\u0430\u044f \u043d\u044e\u0430\u043d\u0441\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0443\u0434\u0435\u043b\u044f\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0433\u0434\u0435 \u044d\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f. \u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 (Dev) \u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 (Ops) \u043b\u0438\u0448\u044c \u0443\u0445\u0443\u0434\u0448\u0430\u043b\u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e. \u041d\u043e \u0441 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u044b DevOps \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u043d\u0435\u0441\u0442\u0438 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0437\u0430 \u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u043e\u0431\u043b\u0430\u043a\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-35106","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u044b\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u043e\u0432\u0441\u0435\u043c\u0435\u0441\u0442\u043d\u043e, \u0430 \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 \u043b\u044c\u0432\u0438\u043d\u0443\u044e \u0434\u043e\u043b\u044e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 HTTP.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 Linux. \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u044b\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u043e\u0432\u0441\u0435\u043c\u0435\u0441\u0442\u043d\u043e, \u0430 \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 \u043b\u044c\u0432\u0438\u043d\u0443\u044e \u0434\u043e\u043b\u044e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 HTTP.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:02:22+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:02:22+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Performance des applications r\u00e9seau Linux. Introduction | ProHoster","description":"Les applications web sont d\u00e9sormais omnipr\u00e9sentes, et parmi tous les protocoles de transport, HTTP en constitue la majeure partie.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 Linux. \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 | ProHoster","og:description":"\u0412\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u044b\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u043e\u0432\u0441\u0435\u043c\u0435\u0441\u0442\u043d\u043e, \u0430 \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 \u043b\u044c\u0432\u0438\u043d\u0443\u044e \u0434\u043e\u043b\u044e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 HTTP.","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:02:22+00:00","article:modified_time":"2019-10-31T19:02:22+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35106","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 21:51:33","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:09:55","updated":"2026-01-21 21:51:33","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/35106","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=35106"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/35106\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=35106"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=35106"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=35106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}