{"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\/it\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","title":{"rendered":"La performance delle applicazioni di rete Linux. Introduzione","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Le applicazioni web sono ormai utilizzate ovunque e tra tutti i protocolli di trasporto, HTTP occupa una buona parte. Studiando le complessit\u00e0 dello sviluppo di applicazioni web, la maggior parte presta poca attenzione al sistema operativo su cui queste applicazioni vengono effettivamente eseguite. La separazione dello sviluppo (Dev) e delle operazioni (Ops) ha solo aggravato la situazione. Ma con la diffusione della cultura DevOps, gli sviluppatori iniziano a prendersi la responsabilit\u00e0 del lancio delle proprie applicazioni nel cloud, quindi \u00e8 molto utile per loro familiarizzare a fondo con il backend del sistema operativo. Questo \u00e8 particolarmente utile se stai cercando di implementare un sistema per migliaia o decine di migliaia di connessioni simultanee.<\/p>\n<p>Le restrizioni nei servizi web sono molto simili a quelle in altre applicazioni. Che si tratti di bilanciatore di carico o server DB, tutte queste applicazioni presentano problemi simili in ambienti ad alte prestazioni. Comprendere queste limitazioni fondamentali e i modi per superarle in generale permetter\u00e0 di valutare le prestazioni e la scalabilit\u00e0 delle tue applicazioni web.<\/p>\n<p>Scrivo questa serie di articoli in risposta alle domande di giovani sviluppatori che vogliono diventare architetti di sistema ben informati. \u00c8 impossibile comprendere chiaramente le tecniche di ottimizzazione delle applicazioni Linux senza immergersi nelle basi, nel modo in cui funzionano a livello di sistema operativo. Anche se ci sono molti tipi di applicazioni, in questo ciclo voglio esaminare le applicazioni di rete, non quelle desktop, come browser o editor di testo. Questo materiale \u00e8 destinato a sviluppatori e architetti che vogliono capire come funzionano i programmi Linux o Unix e come strutturarli per alte prestazioni.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nLinux \u00e8 <i>un sistema operativo<\/i> server e pi\u00f9 spesso le tue applicazioni funzionano proprio su questo OS. Anche se dico 'Linux', nella maggior parte del tempo puoi inferire con sicurezza che si riferisce a tutti i sistemi operativi simili a Unix in generale. Tuttavia, non ho testato il codice allegato su altri sistemi. Quindi, se sei interessato a FreeBSD o OpenBSD, i risultati potrebbero variare. Quando provo qualcosa di specifico per Linux, lo indico.<\/p>\n<p>Sebbene tu possa utilizzare le conoscenze acquisite per creare un'applicazione da zero, e sar\u00e0 magnificamente ottimizzata, \u00e8 meglio non farlo. Se scrivi un nuovo server web in C o C++ per l'applicazione commerciale della tua organizzazione, potrebbe essere il tuo ultimo giorno di lavoro. Tuttavia, conoscere la struttura di queste applicazioni aiuter\u00e0 nella scelta di programmi gi\u00e0 esistenti. Sarai in grado di confrontare i sistemi basati su processi con i sistemi basati su thread e anche su eventi. Capirai e apprezzerai perch\u00e9 Nginx funziona meglio di Apache httpd e perch\u00e9 un'applicazione Python basata su Tornado pu\u00f2 gestire pi\u00f9 utenti rispetto a un'applicazione Python basata su Django.<\/p>\n<h1>ZeroHTTPd: strumento di apprendimento<\/h1>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/shuveb\/zerohttpd\">ZeroHTTPd<\/a><\/noindex>\u00a0\u00e8 un server web che ho scritto da zero in C come strumento didattico. Non ha dipendenze esterne, incluso l'accesso a Redis. Eseguiamo le nostre procedure Redis. Maggiori dettagli di seguito.<\/p>\n<p>Sebbene potremmo discutere a lungo la teoria, non c'\u00e8 niente di meglio che scrivere codice, eseguirlo e confrontare insieme tutte le architetture dei server. Questo \u00e8 il metodo pi\u00f9 visivo. Pertanto, scriveremo un semplice server web ZeroHTTPd, applicando ciascun modello: basato su processi, thread ed eventi. Verificheremo ciascuno di questi server e vedremo come funzionano l'uno rispetto all'altro. ZeroHTTPd \u00e8 implementato in un singolo file C. Il server basato su eventi include <noindex><a rel=\"nofollow\" href=\"https:\/\/troydhanson.github.io\/uthash\/\">uthash<\/a><\/noindex>, un'eccellente implementazione di una tabella hash, fornita in un unico file di intestazione. Negli altri casi non ci sono dipendenze per non complicare il progetto.<\/p>\n<p>Il codice \u00e8 ricco di commenti per aiutare la comprensione. Essendo un semplice server web in poche righe di codice, ZeroHTTPd \u00e8 anche un framework minimo per lo sviluppo web. Ha funzionalit\u00e0 limitate, ma \u00e8 in grado di servire file statici e alcune semplici pagine \"dinamiche\". Devo dire che ZeroHTTPd \u00e8 molto adatto per imparare a creare applicazioni Linux ad alte prestazioni. In generale, la maggior parte dei servizi web attende richieste, le verifica e le elabora. Questo \u00e8 ci\u00f2 che far\u00e0 ZeroHTTPd. \u00c8 uno strumento per l'apprendimento, non per la produzione. Non \u00e8 robusto nella gestione degli errori e difficilmente pu\u00f2 vantare le migliori pratiche di sicurezza (oh s\u00ec, ho usato <code>strcpy<\/code>) o con trucchi astrusi del linguaggio C. Ma spero che riesca a svolgere bene il suo compito.<\/p>\n<p><img decoding=\"async\" alt=\"La performance delle applicazioni di rete Linux. Introduzione\" src=\"\/wp-content\/uploads\/33fd0a5353667001523d5d4c8ada9ecf.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Pagina principale di ZeroHTTPd. Pu\u00f2 servire diversi tipi di file, inclusi le immagini<\/i><\/p>\n<h1>Applicazione del libro degli ospiti<\/h1>\n<p>\nLe moderne web application non si limitano solitamente a file statici. Hanno interazioni complesse con vari database, cache, ecc. Pertanto, creeremo una semplice web application chiamata \"Libro degli ospiti\", dove i visitatori possono lasciare messaggi a nome loro. Nel libro degli ospiti vengono salvati i messaggi lasciati in precedenza. C'\u00e8 anche un contatore di visitatori in fondo alla pagina.<\/p>\n<p><img decoding=\"async\" alt=\"La performance delle applicazioni di rete Linux. Introduzione\" src=\"\/wp-content\/uploads\/ed8e828e8567d3d114875520988742d7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Web application \"Libro degli ospiti\" di ZeroHTTPd<\/i><\/p>\n<p>Il contatore di visitatori e i messaggi del libro degli ospiti sono memorizzati in Redis. Per le comunicazioni con Redis sono state implementate procedure personalizzate, che non dipendono da librerie esterne. Non sono un grande fan di scrivere codice artigianale quando esistono soluzioni pubbliche ben testate. Ma l'obiettivo di ZeroHTTPd \u00e8 studiare le prestazioni di Linux e l'accesso a servizi esterni, mentre la gestione delle richieste HTTP influisce notevolmente sulle prestazioni. Dobbiamo avere il controllo completo delle comunicazioni con Redis in ciascuna delle nostre architetture server. In un'architettura utilizziamo chiamate bloccanti, in altre procedure basate su eventi. L'uso di una libreria client esterna per Redis non ci darebbe questo controllo. Inoltre, il nostro piccolo client Redis esegue solo alcune funzioni (recupero, impostazione e incremento della chiave; recupero e aggiunta a un array). Inoltre, il protocollo Redis \u00e8 estremamente elegante e semplice. Non \u00e8 nemmeno necessario studiarlo specificamente. Il fatto che tutto il lavoro del protocollo venga effettuato in circa cento righe di codice dimostra quanto sia ben progettato.<\/p>\n<p>Nell'immagine seguente sono mostrate le azioni dell'applicazione quando il cliente (browser) richiede <code>\/guestbookURL<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"La performance delle applicazioni di rete Linux. Introduzione\" src=\"\/wp-content\/uploads\/5c5e6740419384b7232aeead95db491b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Meccanismo di funzionamento dell'applicazione libro degli ospiti<\/i><\/p>\n<p>Quando \u00e8 necessario fornire la pagina del libro degli ospiti, viene effettuata una chiamata al sistema di file per leggere il modello in memoria e tre chiamate di rete a Redis. Il file del modello contiene gran parte del contenuto HTML per la pagina nello screenshot sopra. Ci sono anche segnaposto speciali per la parte dinamica del contenuto: le voci e il contatore dei visitatori. Li otteniamo da Redis, li inseriamo nella pagina e forniamo al cliente contenuti completamente formati. La terza chiamata a Redis pu\u00f2 essere evitata, poich\u00e9 Redis restituisce un nuovo valore della chiave quando aumenta. Tuttavia, per il nostro server con un'architettura asincrona basata su eventi, un gran numero di chiamate di rete rappresenta una buona prova a scopo didattico. Pertanto, scartiamo il valore restituito da Redis riguardo al numero di visitatori e lo richiediamo con una chiamata separata.<\/p>\n<h1>Architetture server ZeroHTTPd<\/h1>\n<p>\nCostruiamo sette versioni di ZeroHTTPd con funzionalit\u00e0 identiche, ma architetture diverse:<\/p>\n<ul>\n<li>Iterativa\n<\/li>\n<li>Server fork (un processo figlio per richiesta)\n<\/li>\n<li>Server pre-fork (forking dei processi in anticipo)\n<\/li>\n<li>Server con thread (un thread per richiesta)\n<\/li>\n<li>Server con thread pre-allocati\n<\/li>\n<li>Architettura basata su <code>poll()<\/code>\n<\/li>\n<li>Architettura basata su <code>epoll<\/code><\/li>\n<\/ul>\n<p>\nMisuriamo le prestazioni di ciascuna architettura caricando il server con richieste HTTP. Ma confrontando le architetture con un alto grado di parallelismo, il numero di richieste aumenta. Testiamo tre volte e calcoliamo la media.<\/p>\n<h1>Metodologia di test<\/h1>\n<p>\n<img decoding=\"async\" alt=\"La performance delle applicazioni di rete Linux. Introduzione\" src=\"\/wp-content\/uploads\/aa4f337b6e90fa032fbef5374fac8f53.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Impostazione per il test di carico di ZeroHTTPd<\/i> <\/p>\n<p>\u00c8 importante che durante l'esecuzione dei test tutti i componenti non siano in esecuzione su una sola macchina. In questo caso, il sistema operativo comporta costi aggiuntivi per la pianificazione, poich\u00e9 i componenti competono per la CPU. Misurare le spese generali del sistema operativo con ciascuna delle architetture server selezionate \u00e8 uno degli obiettivi pi\u00f9 importanti di questo esercizio. Aggiungere un numero maggiore di variabili sarebbe controproducente per il processo. Pertanto, la configurazione nell'immagine sopra funziona meglio.<\/p>\n<h3>Cosa fa ciascuno di questi server<\/h3>\n<p><\/p>\n<ul>\n<li>load.unixism.net: qui eseguiamo <code>ab<\/code>, l'utilit\u00e0 Apache Benchmark. Essa genera il carico necessario per testare le nostre architetture server.\n<\/li>\n<li>nginx.unixism.net: a volte vogliamo avviare pi\u00f9 di un'istanza di un programma server. A tal fine, il server Nginx con le impostazioni appropriate funziona come bilanciatore di carico per le richieste provenienti da <i>ab<\/i> ai nostri processi server.\n<\/li>\n<li>zerohttpd.unixism.net: qui eseguiamo i nostri programmi server su sette architetture diverse, una alla volta.\n<\/li>\n<li>redis.unixism.net: su questo server \u00e8 in funzione il demone Redis, dove sono memorizzati i messaggi nel libro degli ospiti e il contatore delle visite.<\/li>\n<\/ul>\n<p>\nTutti i server lavorano su un singolo core del processore. L'idea \u00e8 di valutare le massime prestazioni di ciascuna architettura. Poich\u00e9 tutti i programmi server sono testati su un'unica attrezzatura, ci\u00f2 costituisce il livello base per il loro confronto. La mia installazione di test \u00e8 composta da server virtuali affittati da Digital Ocean.<\/p>\n<h3>Cosa misuriamo?<\/h3>\n<p>\nPossiamo misurare diversi parametri. Valutiamo le prestazioni di ciascuna architettura in questa configurazione, caricando i server con richieste a diversi livelli di parallelismo: il carico cresce da 20 a 15.000 utenti simultanei.<\/p>\n<h1>Risultati dei test<\/h1>\n<p>\nNel diagramma seguente \u00e8 mostrata la prestazione dei server su diverse architetture a vari livelli di parallelismo. Sull'asse y - numero di richieste al secondo, sull'asse x - connessioni parallele.<\/p>\n<p><img decoding=\"async\" alt=\"La performance delle applicazioni di rete Linux. Introduzione\" src=\"\/wp-content\/uploads\/3415bcfb66503152d644130f68bd19da.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"La performance delle applicazioni di rete Linux. Introduzione\" src=\"\/wp-content\/uploads\/ba457b671eb758f3226e0eeafaadc6aa.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"La performance delle applicazioni di rete Linux. Introduzione\" src=\"\/wp-content\/uploads\/aea06856d61d4d4bdda9814c53a28d4a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDi seguito \u00e8 riportata una tabella con i risultati.<\/p>\n<p> richieste al secondo <\/p>\n<p><strong>parallelismo<\/strong><br \/>\n<strong>iterativo<\/strong><br \/>\n<strong>un fork<\/strong><br \/>\n<strong>pre-fork<\/strong><br \/>\n<strong>multithreading<\/strong><br \/>\n<strong>pre-multithreading<\/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 \/>\nampia variabilit\u00e0<br \/>\n2138<\/p>\n<p>5000<br \/>\n\u2013<br \/>\nampia variabilit\u00e0<br \/>\n1600<br \/>\n1100<br \/>\n2519<br \/>\n\u2013<br \/>\n2235<\/p>\n<p>8000<br \/>\n\u2013<br \/>\n\u2013<br \/>\n1200<br \/>\nampia variabilit\u00e0<br \/>\n2451<br \/>\n\u2013<br \/>\n2100<\/p>\n<p>10\u00a0000<br \/>\n\u2013<br \/>\n\u2013<br \/>\nampia variabilit\u00e0<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>\nDal grafico e dalla tabella si evince che oltre 8000 richieste simultanee rimangono soltanto due contendenti: pre-fork e epoll. Con l'aumento del carico, il server basato su poll funziona peggio del multithreading. L'architettura con creazione anticipata di thread \u00e8 una valida concorrente di epoll: ci\u00f2 testimonia quanto bene il kernel Linux gestisca un grande numero di thread.<\/p>\n<h1>Codice sorgente ZeroHTTPd<\/h1>\n<p>\nCodice sorgente ZeroHTTPd <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/shuveb\/zerohttpd\">qui<\/a><\/noindex>. Per ciascuna architettura \u00e8 presente una directory separata.<\/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>\nOltre alle sette directory per tutte le architetture, nella directory principale ci sono anche due directory: public e templates. Nella prima si trova il file index.html e l'immagine dello screenshot iniziale. Qui puoi inserire altri file e cartelle, e ZeroHTTPd dovrebbe restituire senza problemi questi file statici. Se il path nel browser corrisponde al percorso nella cartella public, ZeroHTTPd cerca il file index.html in questa directory. Il contenuto per il libro degli ospiti viene generato dinamicamente. Ha solo una pagina principale, il cui contenuto \u00e8 basato sul file 'templates\/guestbook\/index.html'. In ZeroHTTPd \u00e8 facile aggiungere pagine dinamiche per l'espansione. L'idea \u00e8 che gli utenti possono aggiungere modelli in questa directory e ampliare ZeroHTTPd secondo necessit\u00e0.<\/p>\n<p>Per costruire tutti e sette i server, esegui <code>make all<\/code> dalla directory principale \u2013 e tutte le build appariranno in questa directory. I file eseguibili cercano le directory public e templates nella directory da cui vengono avviati.<\/p>\n<h1>API Linux<\/h1>\n<p>\nPer comprendere le informazioni in questo ciclo di articoli, non \u00e8 necessario essere esperti di API Linux. Tuttavia, consiglio di leggere di pi\u00f9 su questo argomento, ci sono molte risorse di riferimento disponibili online. Sebbene toccheremo diverse categorie delle API Linux, la nostra attenzione sar\u00e0 focalizzata principalmente su processi, thread, eventi e lo stack di rete. Oltre a libri e articoli sulle API Linux, consiglio anche di leggere i manuali per le chiamate di sistema e le funzioni di libreria utilizzate.<\/p>\n<h1>Prestazioni e scalabilit\u00e0<\/h1>\n<p>\nUna nota sulle prestazioni e scalabilit\u00e0. Teoricamente, non c'\u00e8 alcuna connessione tra di loro. Puoi avere un servizio web che funziona molto bene, con tempi di risposta di pochi millisecondi, ma che non \u00e8 affatto scalabile. Allo stesso modo, un'applicazione web pu\u00f2 avere prestazioni scarse, richiedendo alcuni secondi per rispondere, ma \u00e8 scalabile per gestire decine di migliaia di utenti simultanei. Tuttavia, la combinazione di elevate prestazioni e scalabilit\u00e0 \u00e8 una combinazione molto potente. Le applicazioni ad alte prestazioni, in generale, utilizzano le risorse in modo efficiente e, in tal modo, servono pi\u00f9 utenti simultanei sul server, riducendo i costi.<\/p>\n<h1>Compiti CPU e I\/O<\/h1>\n<p>\nInfine, nei calcoli ci sono sempre due tipi di problemi possibili: per I\/O e CPU. L'acquisizione di richieste tramite Internet (input\/output di rete), la gestione dei file (input\/output di rete e disco), le comunicazioni con il database (input\/output di rete e disco) \u2014 tutte queste sono operazioni di I\/O. Alcune richieste al database possono caricare leggermente la CPU (ordinamento, calcolo della media di un milione di risultati, ecc.). La maggior parte delle applicazioni web ha limiti sul massimo I\/O possibile, mentre la CPU viene raramente utilizzata al massimo. Quando vedi che in una certa operazione di input\/output si utilizza molta CPU, \u00e8 probabile che sia un segno di una cattiva architettura dell'applicazione. Questo potrebbe significare che le risorse CPU vengono spese per la gestione dei processi e il cambio di contesto \u2014 e ci\u00f2 non \u00e8 molto utile. Se stai facendo qualcosa come l'elaborazione delle immagini, la conversione di file audio o il machine learning, allora l'applicazione richiede potenti risorse CPU. Ma per la maggior parte delle applicazioni non \u00e8 cos\u00ec.<\/p>\n<h1>Maggiori dettagli sulle architetture server<\/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\/\">Parte I. Architettura iterativa<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-ii-forking-servers\/\">Parte II. Server fork<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-iii-preforked-servers\/\">Parte III. Server pre-fork<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-iv-threaded-servers\/\">Parte IV. Server con thread di esecuzione<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-v-pre-threaded-servers\/\">Parte V. Server con thread pre-creati<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-vi-polling-servers\/\">Parte VI. Architettura basata su poll<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-vii-epoll-servers\/\">Parte VII. Architettura basata su epoll<\/a><\/noindex><\/li>\n<\/ol>\n<p>Fonte: <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.1.1 - 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\/it\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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\/it\/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 delle applicazioni di rete Linux. Introduzione | ProHoster","description":"Le applicazioni web sono ormai utilizzate ovunque, e tra tutti i protocolli di trasporto, HTTP occupa la maggior parte.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/35106","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=35106"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/35106\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=35106"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=35106"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=35106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}