{"id":250,"date":"2023-09-26T09:00:07","date_gmt":"2023-09-26T09:00:07","guid":{"rendered":"https:\/\/atled.it\/atled\/?p=250"},"modified":"2023-09-26T09:02:05","modified_gmt":"2023-09-26T09:02:05","slug":"come-utilizzare-apachebench-introduzione-al-benchmarking-web","status":"publish","type":"post","link":"https:\/\/atled.it\/atled\/come-utilizzare-apachebench-introduzione-al-benchmarking-web\/","title":{"rendered":"Come utilizzare ApacheBench: introduzione al Benchmarking Web"},"content":{"rendered":"<p class=\"wp-block-paragraph \">Nel mondo dello sviluppo software, l&#8217;ottimizzazione delle prestazioni &egrave; una priorit&agrave; costante. La capacit&agrave; di valutare e misurare come una determinata applicazione (o API) si comporta sotto carico &egrave; cruciale per garantire una performance affidabile, specie quando la soluzione interessa tecnologie web e coinvolge dunque un server remoto. Tra i numerosi strumenti a disposizione degli sviluppatori per le attivit&agrave; di testing, ApacheBench &egrave; noto per la semplicit&agrave; e la versatilit&agrave; che lo caratterizzano.<\/p>\n\n\n<p class=\"wp-block-paragraph \">Rapido e di facile utilizzo, permette di valutare le prestazioni di un server web o di un&#8217;API attraverso una serie di richieste HTTP concorrenti. Proprio a causa della sua struttura essenziale, ApacheBench &egrave; un ottimo punto di partenza per comprendere le dinamiche del benchmarking e ottenere rapidamente informazioni cruciali sulle prestazioni del servizio web. Allo stesso tempo &egrave; importante riconoscere che esistono molte soluzioni pi&ugrave; avanzate e sofisticate per simulare scenari di utilizzo reali e complessi, alcune delle quali vanno oltre la semplice esecuzione di richieste concorrenti e consentono ad esempio di modellare il comportamento degli utenti in modo pi&ugrave; accurato. Si segnalano a riguardo strumenti come Apache JMeter, Gatling, o locust.io.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\" style=\"padding-top:var(--wp--preset--spacing--xl);padding-bottom:var(--wp--preset--spacing--xl)\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/09\/apache.png\" alt=\"\" class=\"wp-image-365\" style=\"width:185px;height:48px\" width=\"185\" height=\"48\" srcset=\"https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/09\/apache.png 1024w, https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/09\/apache-300x79.png 300w, https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/09\/apache-768x201.png 768w, https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/09\/apache-18x5.png 18w\" sizes=\"(max-width: 185px) 100vw, 185px\" \/><\/figure>\n\n\n<h4 class=\"wp-block-heading wp-block-heading\" id=\"apachebench-informazioni-essenziali\">ApacheBench: informazioni essenziali<\/h4>\n\n\n<p class=\"wp-block-paragraph \">Ab &egrave; spesso incluso nel pacchetto di installazione dei server HTTP Apache, ed &egrave; essenzialmente uno strumento molto compatto eseguibile da linea di comando. Online si trovano svariate guide all&#8217;installazione su diversi sistemi operativi. In questo articolo si riportano degli esempi eseguiti in Windows, ambiente per il quale &egrave; sufficiente individuare ed eseguire (da CLI) il file ab.exe. La sintassi dei comandi rimane comunque la medesima per l&#8217;esecuzione dei test in ambiente Unix.<\/p>\n\n\n<p class=\"wp-block-paragraph \">Nonostante la sua sostanziale semplicit&agrave;, Ab supporta diversi parametri per la personalizzazione del test da eseguire. Una lista completa &egrave; riportata alla pagina di documentazione ufficiale:<\/p>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-layout-1 wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link has-contrast-color has-text-color has-text-align-center wp-element-button\" href=\"https:\/\/httpd.apache.org\/docs\/2.4\/programs\/ab.html\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Apache HTTP Server<\/strong><\/a><\/div>\n<\/div>\n\n\n<p class=\"wp-block-paragraph \">In questo articolo eseguiremo dei test relativamente semplici, per i quali sar&agrave; necessario specificare tre parametri:<\/p>\n\n\n<ul style=\"\" class=\"wp-block-list \">\n<li>\n<code>-n<\/code>: numero di richieste totali<\/li>\n\n\n\n<li>\n<code>-c<\/code>: numero di richieste concorrenti<\/li>\n\n\n\n<li>\n<code>&lt;url&gt;<\/code>: indirizzo del servizio web da testare<\/li>\n<\/ul>\n\n\n<p class=\"wp-block-paragraph \">il comando apparir&agrave; dunque come segue:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ab.exe -n NUM_REQ -c NUM_CON http:\/\/testing-service-url.example<\/code><\/pre>\n\n\n<h4 class=\"wp-block-heading wp-block-heading\" style=\"padding-top:var(--wp--preset--spacing--md);\" id=\"scenario-di-test\">Scenario di test<\/h4>\n\n\n<p class=\"wp-block-paragraph \">Per eseguire alcuni test, abbiamo predisposto un endpoint dedicato sulla piattaforma di hosting ATLED delnHost. Il web server utilizza LiteSpeed, che &egrave; strutturalmente molto simile ad Apache. All&#8217;indirizzo definito per i test risponde uno script che esegue alcuni calcoli numerici e fornisce poi una risposta positiva (200). Al fine di poter osservare anche la differenza di prestazioni in caso di codice pi&ugrave; dispendioso, &egrave; possibile passare un queryparam che definisce un fattore di complessit&agrave; dei calcoli da svolgere.<\/p>\n\n\n<p class=\"wp-block-paragraph \">Le chiamate saranno quindi da indirizzarsi al seguente URL:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;delnhost.pro\/testing\/?n=COMPLEXITY_FACTOR<\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph \">con opportuna sostituzione di un valore intero come <code>COMPLEXITY_FACTOR<\/code>.<\/p>\n\n\n<h4 class=\"wp-block-heading wp-block-heading\" style=\"padding-top:var(--wp--preset--spacing--md);\" id=\"definizione-dei-test-case\">Definizione dei test-case<\/h4>\n\n\n<p class=\"wp-block-paragraph \">Ogni attivit&agrave; di test, specialmente se a scopo di misura delle prestazioni, necessita di una chiara strategia di testing. Ci&ograve; significa definire quante prove svolgere, come svolgerle, con che parametrizzazioni, ma anche chiarire sin dall&#8217;inizio come andranno interpretati i risultati.<\/p>\n\n\n<p class=\"wp-block-paragraph \">Per fare un esempio banale, si potrebbe d&#8217;istinto credere che se 100 richieste devono essere servite insieme, allora il test vada eseguito con <code>concurrency = 100<\/code>. In questo ragionamento si sta per&ograve; ignorando che ogni richiesta &egrave; un evento che dura pochi millisecondi (ipotizziamo 50), e se decidiamo che 100 sono le richieste per secondo, la contemporaneit&agrave; effettiva da gestire sar&agrave; solamente di <code>(100 x 50) \/ 1000 = 5<\/code>.<\/p>\n\n\n<p class=\"wp-block-paragraph \">Ci&ograve; che &egrave; necessario fare, dunque, per condurre un&#8217;efficace attivit&agrave; di benchtesting, &egrave; porsi una domanda chiara, e definire una strategia efficace per rispondervi sperimentalmente. Nel nostro caso, cercheremo di rispondere alla seguente domanda:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p class=\"wp-block-paragraph \"><strong>Quante richieste al secondo posso gestire per far s&igrave; che meno del 5% di queste superi un tempo limite di 500ms?<\/strong><\/p>\n<\/blockquote>\n\n\n<p class=\"wp-block-paragraph \">La procedura per rispondere a questa domanda &egrave; molto semplice, e si pu&ograve; riassumere nei seguenti passaggi:<\/p>\n\n\n<ol style=\"\" class=\"wp-block-list \">\n<li>Definizione dei parametri costanti (numero di richieste, tempo massimo di esecuzione, indice di complessit&agrave; del carico da elaborare);<\/li>\n\n\n\n<li>Esecuzione di un primo test con concurrency uguale ad 1;<\/li>\n\n\n\n<li>Esecuzione di una serie di test con concurrency crescente;<\/li>\n\n\n\n<li>Osservazione del valore di concurrency che causa il superamento del limite di performance imposto (in questo caso, il valore che fa salire sopra al 5% il numero di richieste che impiegano pi&ugrave; di mezzo secondo);<\/li>\n\n\n\n<li>Calcolo delle richieste per secondo in base alla media dei tempi di esecuzione ottenuti nel test-limite del punto precedente.<\/li>\n<\/ol>\n\n\n<h4 class=\"wp-block-heading wp-block-heading\" style=\"padding-top:var(--wp--preset--spacing--md);\" id=\"prima-di-iniziare\">Prima di iniziare<\/h4>\n\n\n<p class=\"wp-block-paragraph \">Alcuni concetti sono importanti da tenere a mente nel procedere con questo tipo di prova. Va innanzitutto considerato che questo test esegue una serie di reali richieste che partono dal proprio PC e raggiungono il server remoto. Dunque, ogni prova pu&ograve; essere alterata dalla situazione di rete, soprattutto nel caso in cui il server e il client non si trovino in locale.<\/p>\n\n\n<p class=\"wp-block-paragraph \">Allo stesso tempo, un alto numero di richieste (soprattutto concorrenti) potrebbe essere visto dal server come un&#8217;attivit&agrave; malevola, e potrebbe causare l&#8217;inclusione del proprio IP in una blacklist, o scatenare altri meccanismi di protezione. Vanno dunque prese le corrette precauzioni per evitare problemi di questo tipo.<\/p>\n\n\n<p class=\"wp-block-paragraph \">Infine, &egrave; bene ricordare che lo scopo di questo test &egrave; di introdurre il concetto di benchmarking, e non di simulare una complessa situazione di richieste web generate &#8211; ad esempio &#8211; dal traffico di un dato numero di utenti. L&#8217;esito della prova fornir&agrave; dunque la mera misura di quante singole richieste possono essere servite da questo stack e da questo script in un secondo.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\" style=\"padding-top:var(--wp--preset--spacing--lg);padding-bottom:var(--wp--preset--spacing--lg)\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/09\/req_schema-2.png\" alt=\"\" class=\"wp-image-371\" style=\"width:297px;height:220px\" width=\"297\" height=\"220\" srcset=\"https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/09\/req_schema-2.png 640w, https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/09\/req_schema-2-300x222.png 300w, https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/09\/req_schema-2-16x12.png 16w\" sizes=\"(max-width: 297px) 100vw, 297px\" \/><\/figure>\n\n\n<h4 class=\"wp-block-heading wp-block-heading\" id=\"esecuzione-dei-test-di-esempio\">Esecuzione dei test di esempio<\/h4>\n\n\n<p class=\"wp-block-paragraph \">Decidiamo dunque di procedere iterando dei test caratterizzati da un numero di richieste pari a 100. La prima prova avr&agrave; ovviamente la concurrency fissata ad 1, valore che crescer&agrave; nelle prove successive fino al superamento del valore-soglia identificato.<\/p>\n\n\n<p class=\"wp-block-paragraph \">Per l&#8217;osservazione della soglia (che ricordiamo essere il superamento del 5% di richieste servite in un tempo maggiore o uguale a 500ms), possiamo sfruttare l&#8217;apposita sezione della schermata di risultato, titolata <em>&#8220;Percentage of the requests served within a certain time&#8221;.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\" style=\"padding-top:var(--wp--preset--spacing--md);padding-bottom:var(--wp--preset--spacing--md)\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/09\/ab_res_example.png\" alt=\"\" class=\"wp-image-360\" style=\"width:800px;height:630px\" width=\"800\" height=\"630\" srcset=\"https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/09\/ab_res_example.png 997w, https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/09\/ab_res_example-300x236.png 300w, https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/09\/ab_res_example-768x604.png 768w, https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/09\/ab_res_example-15x12.png 15w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n<p class=\"wp-block-paragraph \">Si noti che un numero consistente di richieste &egrave; segnalato come &#8220;failed&#8221;, ma che la totalit&agrave; dei fallimenti rientra nella categoria &#8220;length&#8221;. Questo &egrave; dovuto alla dinamicit&agrave; della pagina, che ritorna un contenuto html simile ma non sempre identico. Di conseguenza, Ab nota la differenza tra la lunghezza delle risposte e segnala alcune di esse come errori. Si pu&ograve; ovviare a questo disturbo includendo nel comando l&#8217;opzione <code>-l<\/code>,  appositamente predisposta per pagine dinamiche.<\/p>\n\n\n<h4 class=\"wp-block-heading wp-block-heading\" style=\"padding-top:var(--wp--preset--spacing--md);\" id=\"risultati\">Risultati<\/h4>\n\n\n<p class=\"wp-block-paragraph \">Si riportano di seguito i risultati raccolti in una sessione di 20 test.<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes has-14-font-size\" style=\"padding-top:0;padding-bottom:0\"><table style=\"border-style:none;border-width:0px\"><thead><tr><th class=\"has-text-align-center\" data-align=\"center\">Concurrency<\/th><th class=\"has-text-align-center\" data-align=\"center\">95% best time<\/th><th class=\"has-text-align-center\" data-align=\"center\">Outcome<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\">1<\/td><td class=\"has-text-align-center\" data-align=\"center\">73<\/td><td class=\"has-text-align-center\" data-align=\"center\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#32dd00\" class=\"has-inline-color\">Within time limit<\/mark><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">2<\/td><td class=\"has-text-align-center\" data-align=\"center\">78<\/td><td class=\"has-text-align-center\" data-align=\"center\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#32dd00\" class=\"has-inline-color\">Within time limit<\/mark><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">3<\/td><td class=\"has-text-align-center\" data-align=\"center\">97<\/td><td class=\"has-text-align-center\" data-align=\"center\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#32dd00\" class=\"has-inline-color\">Within time limit<\/mark><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">4<\/td><td class=\"has-text-align-center\" data-align=\"center\">129<\/td><td class=\"has-text-align-center\" data-align=\"center\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#32dd00\" class=\"has-inline-color\">Within time limit<\/mark><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">5<\/td><td class=\"has-text-align-center\" data-align=\"center\">162<\/td><td class=\"has-text-align-center\" data-align=\"center\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#32dd00\" class=\"has-inline-color\">Within time limit<\/mark><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">6<\/td><td class=\"has-text-align-center\" data-align=\"center\">201<\/td><td class=\"has-text-align-center\" data-align=\"center\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#32dd00\" class=\"has-inline-color\">Within time limit<\/mark><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">7<\/td><td class=\"has-text-align-center\" data-align=\"center\">228<\/td><td class=\"has-text-align-center\" data-align=\"center\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#32dd00\" class=\"has-inline-color\">Within time limit<\/mark><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">8<\/td><td class=\"has-text-align-center\" data-align=\"center\">254<\/td><td class=\"has-text-align-center\" data-align=\"center\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#32dd00\" class=\"has-inline-color\">Within time limit<\/mark><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">9<\/td><td class=\"has-text-align-center\" data-align=\"center\">290<\/td><td class=\"has-text-align-center\" data-align=\"center\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#32dd00\" class=\"has-inline-color\">Within time limit<\/mark><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">10<\/td><td class=\"has-text-align-center\" data-align=\"center\">327<\/td><td class=\"has-text-align-center\" data-align=\"center\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#32dd00\" class=\"has-inline-color\">Within time limit<\/mark><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">11<\/td><td class=\"has-text-align-center\" data-align=\"center\">363<\/td><td class=\"has-text-align-center\" data-align=\"center\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#32dd00\" class=\"has-inline-color\">Within time limit<\/mark><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">12<\/td><td class=\"has-text-align-center\" data-align=\"center\">381<\/td><td class=\"has-text-align-center\" data-align=\"center\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#32dd00\" class=\"has-inline-color\">Within time limit<\/mark><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">13<\/td><td class=\"has-text-align-center\" data-align=\"center\">428<\/td><td class=\"has-text-align-center\" data-align=\"center\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#32dd00\" class=\"has-inline-color\">Within time limit<\/mark><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">14<\/td><td class=\"has-text-align-center\" data-align=\"center\">443<\/td><td class=\"has-text-align-center\" data-align=\"center\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#32dd00\" class=\"has-inline-color\">Within time limit<\/mark><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">15<\/td><td class=\"has-text-align-center\" data-align=\"center\">476<\/td><td class=\"has-text-align-center\" data-align=\"center\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#32dd00\" class=\"has-inline-color\">Within time limit<\/mark><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">16<\/td><td class=\"has-text-align-center\" data-align=\"center\">521<\/td><td class=\"has-text-align-center\" data-align=\"center\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#ff0000\" class=\"has-inline-color\">Out of time limit<\/mark><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">17<\/td><td class=\"has-text-align-center\" data-align=\"center\">537<\/td><td class=\"has-text-align-center\" data-align=\"center\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#ff0000\" class=\"has-inline-color\">Out of time limit<\/mark><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">18<\/td><td class=\"has-text-align-center\" data-align=\"center\">565<\/td><td class=\"has-text-align-center\" data-align=\"center\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#ff0000\" class=\"has-inline-color\">Out of time limit<\/mark><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">19<\/td><td class=\"has-text-align-center\" data-align=\"center\">602<\/td><td class=\"has-text-align-center\" data-align=\"center\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#ff0000\" class=\"has-inline-color\">Out of time limit<\/mark><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">20<\/td><td class=\"has-text-align-center\" data-align=\"center\">639<\/td><td class=\"has-text-align-center\" data-align=\"center\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#ff0000\" class=\"has-inline-color\">Out of time limit<\/mark><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<h4 class=\"wp-block-heading wp-block-heading\" style=\"padding-top:var(--wp--preset--spacing--md);\" id=\"conclusioni\">Conclusioni<\/h4>\n\n\n<p class=\"wp-block-paragraph \">Si nota con chiarezza che la tendenza delle prestazioni &egrave; lineare, e si pu&ograve; individuare a 15 la soglia di concurrency oltre a quale le prestazioni dei best 95% degradano sotto al limite imposto.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\" style=\"padding-top:var(--wp--preset--spacing--sm);padding-bottom:var(--wp--preset--spacing--sm)\"><img loading=\"lazy\" decoding=\"async\" width=\"649\" height=\"401\" src=\"https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/09\/chart1.png\" alt=\"\" class=\"wp-image-374\" srcset=\"https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/09\/chart1.png 649w, https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/09\/chart1-300x185.png 300w, https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/09\/chart1-18x12.png 18w\" sizes=\"(max-width: 649px) 100vw, 649px\" \/><\/figure>\n\n\n<p class=\"wp-block-paragraph \">Dato che il tempo medio di risposta con la concurrency limite di 15 &egrave; pari a 489ms, si pu&ograve; infine definire il numero massimo di richieste gestibili al secondo attraverso il semplice calcolo che segue:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\" style=\"padding-top:var(--wp--preset--spacing--xs);padding-right:var(--wp--preset--spacing--xxs);padding-bottom:var(--wp--preset--spacing--xs);padding-left:var(--wp--preset--spacing--xxs)\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/atled.it\/atled\/wp-content\/uploads\/2023\/09\/formula-1.png\" alt=\"\" class=\"wp-image-393\" style=\"width:280px;height:38px\" width=\"280\" height=\"38\"\/><\/figure>\n\n\n<p class=\"wp-block-paragraph \">In conclusione si potr&agrave; dunque rispondere alla domanda iniziale affermando che<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p class=\"wp-block-paragraph \"><strong>In condizioni ordinarie, l&#8217;API pu&ograve; gestire fino ad un massimo di 30 richieste al secondo facendo s&igrave; che meno del 5% di queste superino un tempo limite di 500ms<\/strong>.<\/p>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Nel mondo dello sviluppo software, l&#8217;ottimizzazione delle prestazioni &egrave; una priorit&agrave; costante. La capacit&agrave; di valutare e misurare come una determinata applicazione (o API) si comporta sotto carico &egrave; cruciale per garantire una performance affidabile, specie quando la soluzione interessa tecnologie web e coinvolge dunque un server remoto. Tra i numerosi strumenti a disposizione degli &hellip;<\/p>\n","protected":false},"author":2,"featured_media":358,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,7],"tags":[],"_links":{"self":[{"href":"https:\/\/atled.it\/atled\/wp-json\/wp\/v2\/posts\/250"}],"collection":[{"href":"https:\/\/atled.it\/atled\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/atled.it\/atled\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/atled.it\/atled\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/atled.it\/atled\/wp-json\/wp\/v2\/comments?post=250"}],"version-history":[{"count":49,"href":"https:\/\/atled.it\/atled\/wp-json\/wp\/v2\/posts\/250\/revisions"}],"predecessor-version":[{"id":395,"href":"https:\/\/atled.it\/atled\/wp-json\/wp\/v2\/posts\/250\/revisions\/395"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/atled.it\/atled\/wp-json\/wp\/v2\/media\/358"}],"wp:attachment":[{"href":"https:\/\/atled.it\/atled\/wp-json\/wp\/v2\/media?parent=250"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/atled.it\/atled\/wp-json\/wp\/v2\/categories?post=250"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/atled.it\/atled\/wp-json\/wp\/v2\/tags?post=250"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}