Esperienza nel mondo reale nel ridimensionamento e ottimizzazione delle prestazioni


54

Il sito web su cui sto lavorando avrà un enorme successo subito dopo il lancio . Il cliente sta parlando della possibilità di circa 2500 colpi al secondo in circa un giorno.

Ignorando il fatto che questa hit rate è probabilmente l'ottimismo del client selvaggio e oltre a ottenere i server più grandi possibili, qual è il modo migliore che Drupal debba essere configurato per supportare una hit rate elevata.

Ho letto Scaling the drupal.org Infrastructure , Drupal performance blog , Best Practices for Scaling Drupal e molte altre pagine, ma quello che sto cercando è la vera esperienza di fare questo, cosa funziona, cosa non funziona e cosa fare aspettarsi.

Risposte:


47

La risposta di Markdorison è sostanzialmente il metodo accettato per attaccare questo problema. Lo porterò un po 'oltre.

Quando hai Pressflow per D6 o Drupal per D7, Memcached e Varnish funzionano tutti bene insieme, dovrai codificare il tuo file VCL in modo personalizzato . Ci sono quelli gratuiti disponibili che segnano punti di partenza ma devi sempre giocare con loro.

Per far funzionare Varnish in modo ottimale, assicurati di avviarlo con -s malloc xG piuttosto che con il predefinito -s file / path / to / file. Inoltre con Varnish puoi avere oggetti statici nella cache di Varnish il più a lungo possibile.

Se hai più di un server web, rimuovi ETag dall'intestazione inviata a Varnish in VCL. Inoltre rimuovo Expires e mi baso semplicemente su Age e max-age nelle intestazioni in modo da riportare i browser sul sito.

La versione 1.5 (al 3 marzo 2011) è ancora la versione più veloce del modulo Memcached da Drupal.org. In genere lo distribuisco utilizzando un unico bin per server per ridurre il traffico TCP per le connessioni a più bin su larga scala)

Configurare la memorizzazione nella cache in "Prestazioni" su esterno e impostare un'età massima che invierà le intestazioni corrette a un proxy di memorizzazione nella cache come Varnish.

Se non riesci a far sì che determinate pagine vengano memorizzate nella cache correttamente in Varnish, consulta i post sul blog sul Web che descrivono in dettaglio come controllare le richieste. Ecco un post di esempio che ho scritto qualche tempo fa: Cosa sta impedendo a Varnish e Drupal Pressflow di memorizzare nella cache le visualizzazioni della pagina degli utenti anonimi

Dovresti scegliere InnoDB (o uno dei suoi altri nomi da altri provider come XtraDB) per MySQL e spostare tutte le tabelle in esso. Dai un'occhiata a questo post del blog per consigli di base sulla messa a punto http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/

Avere un grande pool di buffer è di fondamentale importanza. Quando si carica il test, il sito attiva il registro delle query lente. Probabilmente all'inizio è necessario acquisire query che richiedono più di 50 msec, quindi ottimizzare le query e ridurre ripetutamente il tempo di acquisizione del log lento fino a quando la maggior parte delle query viene eseguita utilizzando gli indici e l'esecuzione abbastanza rapidamente.

Altre nozioni di base comprendono avere APC per PHP. Se cerchi CGI veloce piuttosto che mod_php, dedica un po 'di tempo a provare a rendere la cache APC condivisa tra le istanze php configurando un buon script wrapper. Assicurati anche che la cache APC sia in un file mappato in memoria per spremere l'ultimo bit da PHP.


"Se cerchi CGI veloce piuttosto che mod_php, passa un po 'di tempo a provare a rendere la cache APC condivisa tra le istanze php configurando un buon script wrapper. Assicurati anche che la cache APC sia in un file mappato in memoria per comprimere ogni ultimo bit fuori da PHP. " : Ok, come si fa? Grazie
Giovanni,

1
Per la memoria mappata apc dipende dai flag di compilazione ... php.net/manual/en/apc.configuration.php
Stewart Robinson

23

Vorrei raccomandare di iniziare con Pressflow (se si utilizza Drupal 6), Memcache , Varnish e una qualche forma di Content Distribution Network (CDN) come Akamai. Il risultato finale dovrebbe essere il minor numero possibile di utenti effettivamente colpire il tuo server di origine.

Se hai parti della pagina che non sei in grado di memorizzare nella cache per utenti non anonimi (cose specifiche per quell'utente, "Benvenuto utenteX" ecc.), Puoi esplorare le opzioni per popolare queste parti della pagina come asincrone callback o edge edge include.

Se hai un gruppo più piccolo di utenti interni (come un gruppo di editor) che devono essere in grado di visualizzare una versione non memorizzata del sito, ti consiglio di esporre una versione non memorizzata del tuo sito a un URL diverso (protetto dietro una VPN o equivalente se possibile).


Richard: Piacere mio. Fammi sapere se hai domande di follow-up.
markdorison,

16

2500 hit al secondo in un giorno - se per "hit" intendi "pagina consegnata", allora sono 216 milioni di pagine al giorno. Lascia che ti dica questo: non hai 216 milioni di pagine al giorno. Adoro questi clienti ...

Detto questo, un dato di traffico non elaborato non dice nulla. Mentre i consigli in questo thread sono validi su Varnish / CDN se tutto ciò che hai è traffico anonimo ma se hai effettuato l'accesso al traffico, stai affrontando una sfida. Ma prima di spendere una quantità ingenua di tempo e sforzi per risolvere un problema, assicurati di avere un problema. 2500 colpi al secondo, Bing ne ottiene di meno, lo capisci, vero?


2
2500 / sec erano i numeri del cliente in base a ciò che penso tutti abbiamo riconosciuto come un'ipotesi selvaggia; questo è tutto ciò che dovevo continuare. A quanto pare, il lancio non è stato tanto un successo come avevano pianificato (sperato) e abbastanza stranamente il tasso effettivo ha raggiunto il picco a 20 (pagine) al secondo per circa 10 minuti, principalmente anonimo, con una media giornaliera di 7,32 pagine / sec .....
Richard Harrison,

7
  • Lato server

    • Installa Varnish per la memorizzazione nella cache delle pagine per utenti anonimi.
    • Installa un sistema di cache persistente (Memcached, APC, Memcache).
    • Utilizzare un CDN come Akamai per servire file statici (JavaScript, CSS, immagini).
  • Codice lato

    • Usa Pressflow, consente a Varnish di servire pagine cache per utenti anonimi.
    • Pulisci il tavolo da guardia di Drupal. Ogni volta che viene registrato un errore del watchdog, si consumano risorse della CPU sul server Web e sul server database. Inoltre aumenta significativamente il tempo di caricamento.
    • Implementare strategie cache statiche e persistenti fino a quando il registro delle query lente non risulta pulito.
    • Evitare errori PHP che si verificano all'interno di cicli foreach nidificati a tutti i costi.
    • Disinstallare i moduli non utilizzati.
    • Attiva la memorizzazione nella cache per i blocchi core e le viste di Drupal.
  • Banca dati

    • Assicurarsi che le tabelle siano correttamente indicizzate per una ricerca più rapida.
    • Non archiviare record non necessari, si accederà sempre a un database di 100 nodi più velocemente di un database di 3 milioni di nodi.


4

Mentre è molto difficile prevedere i modelli, se si ha una buona idea dei livelli di traffico. Carica prova la tua soluzione. Esistono numerose opzioni diverse e non sarà possibile prevedere molto fino a quando non si avrà traffico in tempo reale, ma se si carica il test il più possibile almeno si avrà un discreto grado di sicurezza che la propria configurazione può gestire il traffico.

Tutta l'accordatura nel mondo non sarà d'aiuto se non la provi prima.

Questa è stata una presentazione al DC SF su come l'economista ha fatto. http://sf2010.drupal.org/conference/sessions/performance-testing-economist-online-using-grinder


Il link alla presentazione è davvero molto utile. Grazie
Richard Harrison il

4

Per i siti Web ad alto traffico è necessario utilizzare più server e bilanciamento del carico o utilizzare semplicemente la CDN. Inoltre è molto importante memorizzare nella cache il più possibile per ridurre al minimo il carico sui server Web.

L'uso di Content Delivery Network ( CDN ) aiuta a distribuire le risorse su più domini (suddivisione del dominio), riducendo il carico sul server Web.

L'uso della CDN aiuta con la cache distribuita e l'accelerazione remota, aiuta anche a mitigare gli attacchi DDoS , a causa di più end-point. Aiuta con sicurezza, perché il contenuto memorizzato nella cache è più difficile da sfruttare.

Provider di esempio: Fastly , Rackspace , Akamai , Azure, CloudFlare, Amazon, MaxCDN, Verizon.

Ecco alcuni altri suggerimenti:

  • Con CDN, utilizzare domini senza cookie per i componenti statici da memorizzare nella cache (come sstatic.net ). Poiché alcuni proxy potrebbero rifiutare di memorizzare nella cache i componenti richiesti con i cookie.
  • Riscalda le cache dopo averle cancellate (usando wget, Cache Warmer , Drush ECL ).
  • Usa il monitoraggio delle prestazioni (ad esempio New Relic o Yottaa che hanno l'integrazione per Drupal).
  • Utilizza lo strumento di monitoraggio per il tuo sito Web (ad esempio Nagios).
  • Installa il modulo di integrazione Varnish e Varnish HTTP Accelerator , quindi configuralo .
  • Varnish + Authcache: controlla questo VCL di esempio per il file di configurazione di Authcache Varnish.
  • Prendi in considerazione Pound o NGINX di fronte a Varnish. Vedi: Perché Pound è fantastico di fronte a Varnish .
  • NGINX può funzionare come proxy inverso e bilanciamento del carico, quindi può sostituire Pound e Varnish.
  • Prendi in considerazione una versione commerciale di Varnish o NGINX per utilizzare funzionalità non disponibili nella versione open source "community".
  • Prendi in considerazione il bilanciamento del carico hardware / la memorizzazione nella cache per sostituire Varnish e Pound (ad esempio BIG-IP F5 ).
  • Utilizza strumenti come abJMeter per TTFB , test di carico e sollecitazione sulla tua applicazione web.

Quindi la tua architettura web dal punto di vista dell'utente può apparire come:

  1. Utente (memorizzazione nella cache del browser locale).
  2. NGINX o Pound + Varnish (bilanciamento del carico, proxy inverso come acceleratore HTTP).
  3. Apache (web server).
  4. PHP-FPM (PHP FastCGI Process Manager).
  5. MariaDB (database).

Per i suggerimenti sull'ottimizzazione di Drupal, controlla: Come puoi migliorare le prestazioni di Drupal?


1

Abilita due estensioni:

  • Zend OPcache
  • wincache

La tua performance funzionerà meglio.

Se stai cercando di ramificare Zend OPcache e Wincache in Microsoft Azure, crea prima un nome di cartella ' ini' sotto ' D:\home\site\'. Inoltre, crea 2 file, ' .user.ini' e ' settings.ini'

Aggiungi la seguente configurazione in ciascun file:

.user.ini

[PHP]
post_max_size = 32M
memory_limit = 512M
zend.enable_gc = On
upload_max_filesize = 32M
opcache.enable=1

setting.ini

wincache.ocenabled = 1
wincache.ocachesize = 255

Inoltre, aggiungi un'impostazione dell'app alla tua app Web con la chiave PHP_INI_SCAN_DIR e il valore d:\home\site\ini

Dopo aver modificato PHP_INI_SYSTEM, riavvia l'app Web. Se vuoi saperne di più sulla configurazione di twigging, consulta la documentazione di Microsoft .

Dopo l'impostazione sopra, il mio sito Drupal (Drupal 8.3) si carica entro 3 secondi.


0

È inoltre possibile esaminare la ridistribuzione del carico su più server con l'aiuto di una soluzione basata su DNS o di bilanciamento del carico software / hardware. Ciò genererebbe anche tolleranza d'errore.


Questa non è una buona risposta in quanto non affronta come raggiungere questo obiettivo. come menzionato in OQ, è l'esperienza del ridimensionamento nel mondo reale che sto cercando.
Richard Harrison,

Se i poteri che verranno decisi potremo eseguire drupal al lavoro, sarò felice di fornire il post sul blog di 5+ pagine che delineerà il nostro hardware e la nostra configurazione.
James Stallings

Eccellente. Potrebbe essere un riferimento utile. Pubblicalo comunque ...
Richard Harrison,

Hai ottenuto il permesso di ripubblicare il tuo profilo?
Richard Harrison,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.