Come determinare un collo di bottiglia del server, risolverlo rapidamente, migliorare le prestazioni del server ed evitare regressioni.
Panoramica
Questa guida spiega come risolvere il problema di un server sovraccaricato in 4 passaggi:
- Valuta: determina il collo di bottiglia del server.
- Stabilizza: implementa soluzioni rapide per ridurre l'impatto.
- Migliora: aumenta e ottimizza le funzionalità del server.
- Monitora: utilizza strumenti automatici per evitare problemi futuri.
Valutazione
Quando il traffico sovraccarica un server, uno o più dei seguenti elementi possono diventare un collo di bottiglia: CPU, rete, memoria o I/O del disco. Identificare quale di questi è il collo di bottiglia consente di concentrare gli sforzi sulle mitigazioni più efficaci.
- CPU: un utilizzo della CPU costantemente superiore all'80% deve essere esaminato e corretto. Le prestazioni del server spesso peggiorano quando l'utilizzo della CPU raggiunge circa l'80-90% e diventano più evidenti man mano che l'utilizzo si avvicina al 100%. L'utilizzo della CPU per l'elaborazione di una singola richiesta è trascurabile, ma farlo su larga scala durante i picchi di traffico può a volte sopraffare un server. Il trasferimento della pubblicazione ad altre infrastrutture, la riduzione delle operazioni costose e la limitazione della quantità di richieste ridurranno l'utilizzo della CPU.
- Rete: durante i periodi di traffico elevato, la velocità effettiva della rete richiesta per soddisfare le richieste degli utenti può superare la capacità. Alcuni siti, a seconda del provider di hosting, potrebbero anche raggiungere i limiti relativi al trasferimento cumulativo dei dati. La riduzione delle dimensioni e della quantità di dati trasferiti da e verso il server rimuoverà questo collo di bottiglia.
- Memoria: quando un sistema non dispone di memoria sufficiente, i dati devono essere trasferiti sul disco per l'archiviazione. L'accesso al disco è notevolmente più lento rispetto alla memoria e questo può rallentare un'intera applicazione. Se la memoria viene completamente esaurita, possono verificarsi errori di memoria insufficiente (OOM). Modificare l'allocazione della memoria, correggere le perdite di memoria e eseguire l'upgrade della memoria può rimuovere questo collo di bottiglia.
- I/O del disco: la velocità con cui i dati possono essere letti o scritti dal disco è limitata dal disco stesso. Se l'I/O del disco è un collo di bottiglia, aumentare la quantità di dati memorizzati nella cache in memoria può attenuare il problema (a costo di un aumento dell'utilizzo della memoria). Se questa operazione non funziona, potrebbe essere necessario eseguire l'upgrade dei dischi.
Le tecniche descritte in questa guida si concentrano sulla risoluzione dei colli di bottiglia della CPU e della rete. Per la maggior parte dei siti, la CPU e la rete saranno i colli di bottiglia più pertinenti durante un picco di traffico.
Eseguire top
sul server interessato è un buon punto di partenza per esaminare i colli di bottiglia. Se disponibili, integrali con i dati storici del tuo provider di hosting o degli strumenti di monitoraggio.
Stabilizza
Un server sovraccaricato può causare rapidamente errori a cascata in altri punti del sistema. Pertanto, è importante stabilizzare il server prima di tentare di apportare modifiche più significative.
Limitazione di frequenza
La limitazione della frequenza protegge l'infrastruttura limitando il numero di richieste in entrata. Questo è sempre più importante con il peggioramento delle prestazioni del server: con l'aumento dei tempi di risposta, gli utenti tendono ad aggiornare in modo aggressivo la pagina, aumentando ulteriormente il carico del server.
Correggi
Sebbene il rifiuto di una richiesta sia relativamente poco costoso, il modo migliore per proteggere il server è gestire il limite di velocità in un punto a monte, ad esempio tramite un bilanciatore del carico, un proxy inverso o una CDN.
Istruzioni:
Visita anche:
Memorizzazione nella cache HTTP
Cerca modi per memorizzare nella cache i contenuti in modo più aggressivo. Se una risorsa può essere pubblicata da una cache HTTP (che si tratti della cache del browser o di una CDN), non è necessario richiederla al server di origine, il che riduce il carico del server.
Intestazioni HTTP come Cache-Control
, Expires
e ETag
indicano come una risorsa deve essere memorizzata nella cache da una cache HTTP. Il controllo e la correzione di queste intestazioni miglioreranno la memorizzazione nella cache.
Anche se i service worker possono essere utilizzati anche per la memorizzazione nella cache, utilizzano una cache separata e sono un supplemento, anziché una sostituzione, per una corretta memorizzazione nella cache HTTP. Per questo motivo, quando si gestisce un server sovraccarico, è necessario concentrarsi sull'ottimizzazione della memorizzazione nella cache HTTP.
Diagnostica
Esegui Lighthouse e controlla l'audit Pubblica le risorse statiche con criteri della cache efficaci per visualizzare un elenco di risorse con una durata (TTL) da breve a media. Per ogni risorsa elencata, valuta se è necessario aumentare il TTL. Come linea guida approssimativa:
- Le risorse statiche devono essere memorizzate nella cache con un TTL lungo (1 anno).
- Le risorse dinamiche devono essere memorizzate nella cache con un TTL breve (3 ore).
Correggi
Imposta la direttiva max-age
dell'intestazione Cache-Control
sul numero di secondi appropriato.
Istruzioni:
Ridotta degradazione
La riduzione controllata è la strategia di riduzione temporanea della funzionalità al fine di scaricare il carico in eccesso da un sistema. Questo concetto può essere applicato in molti modi diversi: ad esempio, pubblicando una pagina di testo statica anziché un'applicazione completa, disattivando la ricerca o restituendo meno risultati di ricerca oppure disattivando determinate funzionalità costose o non essenziali. È necessario concentrarsi sulla rimozione delle funzionalità che possono essere rimosse in modo sicuro e semplice con un impatto minimo sull'attività.
Migliora
Utilizza una rete CDN (Content Delivery Network)
La pubblicazione di asset statici può essere offloaded dal server a una rete CDN (Content Delivery Network), riducendo così il carico.
La funzione principale di una CDN è fornire contenuti agli utenti rapidamente, mettendo a disposizione una vasta rete di server situati nelle vicinanze degli utenti. Tuttavia, la maggior parte delle CDN offre anche funzionalità aggiuntive correlate alle prestazioni, come compressione, bilanciamento del carico e ottimizzazione dei contenuti multimediali.
Configurare una CDN
Le CDN traggono vantaggio dalla scalabilità, quindi raramente ha senso gestire una propria CDN. Una configurazione CDN di base è abbastanza rapida da configurare (~30 minuti) e consiste nell'aggiornare i record DNS in modo che rimandino alla CDN.
Ottimizzare l'utilizzo della CDN
Diagnostica
Identifica le risorse che non vengono pubblicate da una CDN (ma dovrebbero) eseguendo WebPageTest. Nella pagina dei risultati, fai clic sul riquadro sopra "Utilizzo efficace della CDN" per visualizzare l'elenco delle risorse da pubblicare da una CDN.

Correggi
Se una risorsa non viene memorizzata nella cache dalla CDN, verifica che siano soddisfatte le seguenti condizioni:
- Deve avere un'intestazione
Cache-Control: public
. - Ha un'intestazione
Cache-Control: s-maxage
,Cache-Control: max-age
oExpires
. - Ha un
Content-Length
,Content-Range
oTransfer-Encoding header
.
Applica la scalabilità delle risorse di computing
La decisione di scalare le risorse di calcolo deve essere presa con attenzione. Sebbene sia spesso necessario scalare le risorse di calcolo, farlo prematuramente può generare complessità architettonica e costi finanziari non necessari.
Diagnostica
Un tempo per primo byte (TTFB) elevato può indicare che un server sta per raggiungere la sua capacità. Puoi trovare queste informazioni nel controllo Lighthouse Riduci i tempi di risposta del server (TTFB).
Per effettuare ulteriori accertamenti, utilizza uno strumento di monitoraggio per valutare l'utilizzo della CPU. Se l'utilizzo attuale o previsto della CPU supera l'80%, ti consigliamo di aumentare il numero di server.
Correggi
L'aggiunta di un bilanciatore del carico consente di distribuire il traffico su più server. Un bilanciatore del carico si trova davanti a un pool di server e instrada il traffico al server appropriato. I provider cloud offrono i propri bilanciatori del carico (Google Cloud, AWS, Azure) oppure puoi configurarne uno utilizzando HAProxy o NGINX. Una volta implementato un bilanciatore del carico, è possibile aggiungere altri server.
Oltre al bilanciamento del carico, la maggior parte dei fornitori di servizi cloud offre la scalabilità automatica (Google Cloud, AWS, Azure). La scalabilità automatica funziona in combinazione con il bilanciamento del carico: aumenta e riduce automaticamente le risorse di calcolo in base alla domanda in un determinato momento. Detto questo, la scalabilità automatica non è magica: le nuove istanze richiedono tempo per essere messe online e richiedono una configurazione significativa. A causa della complessità aggiuntiva che comporta la scalabilità automatica, è consigliabile prendere in considerazione innanzitutto una configurazione più semplice basata su bilanciatori del carico.
Abilita la compressione
Le risorse basate sul testo devono essere compresse utilizzando gzip o brotli. Gzip può ridurre le dimensioni del trasferimento di queste risorse di circa il 70%.
Diagnostica
Utilizza il controllo Attiva la compressione del testo di Lighthouse per identificare le risorse da comprimere.
Correggi
Attiva la compressione aggiornando la configurazione del server. Istruzioni:
Ottimizzare immagini e contenuti multimediali
Le immagini costituiscono la maggior parte delle dimensioni dei file della maggior parte dei siti web; ottimizzarle può ridurre in modo rapido e significativo le dimensioni di un sito.
Diagnostica
Lighthouse offre una serie di controlli che segnalano potenziali ottimizzazioni delle immagini. In alternativa, puoi utilizzare DevTools per identificare i file immagine più grandi, che probabilmente sono buoni candidati per l'ottimizzazione.
Controlli Lighthouse pertinenti:
- Usa immagini di dimensioni adeguate
- Rimandare le immagini fuori schermo
- Codifica in modo efficace le immagini
- Pubblicare immagini in formati di nuova generazione
- Utilizzare i formati video per i contenuti animati
Flusso di lavoro di Chrome DevTools:
- Registrare l'attività di rete
- Fai clic su Imm per escludere le risorse non di immagini.
- Fai clic sulla colonna Dimensioni per ordinare i file immagine in base alle dimensioni.
Correggi
Se hai poco tempo…
Concentrati sull'identificazione delle immagini di grandi dimensioni e caricate di frequente e sulla loro ottimizzazione manuale con uno strumento come Squoosh. Le immagini hero sono spesso ottime candidate per l'ottimizzazione.
Aspetti da tenere presenti:
- Dimensioni: le immagini non devono essere più grandi del necessario.
- Compressione: in generale, un livello di qualità di 80-85 avrà un effetto minimo sulla qualità delle immagini, con una riduzione del 30-40% delle dimensioni del file.
- Formato: utilizza i file JPEG per le foto anziché i file PNG; utilizza i file MP4 per i contenuti animati anziché i file GIF.
Se hai più tempo…
Valuta la possibilità di configurare una CDN per le immagini se queste costituiscono una parte significativa del tuo sito. Le CDN di immagini sono progettate per pubblicare e ottimizzare le immagini e trasferire il carico della pubblicazione delle immagini dal server di origine. La configurazione di una CDN di immagini è semplice, ma richiede l'aggiornamento degli URL immagine esistenti in modo che rimandino alla CDN di immagini.
Visita anche:
Minimizza JS e CSS
La minificazione rimuove i caratteri non necessari da JavaScript e CSS.
Diagnostica
Utilizza i controlli Lighthouse Minimizza CSS e Minimizza JavaScript per identificare le risorse che richiedono la minimizzazione.
Correggi
Se hai poco tempo, concentrati sulla minimizzazione del codice JavaScript. La maggior parte dei siti ha più JavaScript che CSS, quindi l'impatto sarà maggiore.
Monitoraggio
Gli strumenti di monitoraggio del server forniscono raccolta dei dati, dashboard e avvisi relativi alle prestazioni del server. Il loro utilizzo può contribuire a prevenire e ridurre i problemi di prestazioni del server in futuro.
La configurazione del monitoraggio deve essere il più semplice possibile. La raccolta e l'invio di avvisi eccessivi hanno un costo: maggiore è l'ambito o la frequenza della raccolta dei dati, più costoso è raccoglierli e archiviarli; un numero eccessivo di avvisi porta inevitabilmente a pagine ignorate.
Gli avvisi devono utilizzare metriche che rilevano i problemi in modo coerente e accurato. Il tempo di risposta del server (latenza) è una metrica particolarmente efficace per questo scopo: rileva una vasta gamma di problemi ed è direttamente correlata all'esperienza utente. Gli avvisi basati su metriche di livello inferiore come l'utilizzo della CPU possono essere un complemento utile, ma rilevano un sottoinsieme più piccolo di problemi. Inoltre, gli avvisi devono essere basati sul rendimento osservato nella coda (in altre parole, i 95° o 99° percentile), anziché sulle medie. In caso contrario, le medie possono facilmente nascondere i problemi che non interessano tutti gli utenti.
Correggi
Tutti i principali fornitori di servizi cloud offrono i propri strumenti di monitoraggio (Google Cloud, AWS, Azure). Inoltre, Netdata è un'eccellente alternativa senza costi e open source. Indipendentemente dallo strumento scelto, dovrai installare l'agente di monitoraggio dello strumento su ogni server che vuoi monitorare. Al termine, assicurati di configurare gli avvisi.
Istruzioni: