Domanda

Voglio sapere quando crei un sito tipico sullo stack LAMP come ottimizzarlo per i migliori tempi di caricamento possibili.Sto immaginando un tipico sito basato su DB.

Questo è un aspetto di alto livello e probabilmente potrebbe mettere in discussione e permettermi di scomporlo in ogni strato dello stack.

L - A livello di sistema (setup e filesystem) si può fare per migliorare la velocità?Una cosa che mi viene in mente sono le dimensioni delle immagini, la compressione qui può aiutare a ottimizzare qualcosa?

R - Ci devono essere moltissime impostazioni relative alla velocità del sito qui nel server web.Non è il mio forte.Probabilmente dipende molto da quanti siti sono attivi contemporaneamente.

M - MySQL in un sito basato su database, le prestazioni del DB sono fondamentali.Esiste un approccio di normalizzazione migliore, ad esempio utilizzando le tabelle di collegamento?Gli sviluppatori Web spesso creano semplicemente semplici tabelle monolitiche simili a 1NF e questo può ridurre le prestazioni.

P - a parte le impostazioni di miglioramento delle prestazioni come la memorizzazione nella cache, cosa può fare il programmatore per influenzare le prestazioni ad alto livello?Mi piacerebbe davvero sapere se gli approcci alla progettazione MVC incidono sulle prestazioni più che in modo rapido e sporco.Sarebbe interessante conoscere altri semplici suggerimenti, ad esempio se le sessioni sono più veloci dei cookie.

Ovviamente devi scendere e sporcarti nei dettagli e scoprire quale codice ti sta rallentando.Inoltre mi rendo conto che molti siti hanno molte caratteristiche prestazionali diverse, ma supponiamo che un sito tipico abbia più letture che scritture.

Mi sto solo chiedendo se possiamo compilare una serie di migliori pratiche e aspettarci che le persone colleghino altre domande in modo da poter elaborare efficacemente una lista di controllo.

Il mio obiettivo è vedere se, oltre ai soliti problemi di prestazioni, possiamo vedere alcune cose strane che potresti non pensare di emergere per accompagnare un riepilogo delle migliori pratiche.

Quindi la mia domanda è: se dovessi iniziare da zero, come faresti? Sicuro il tuo sito LAMP era veloce?

È stato utile?

Soluzione

Ecco alcuni must-dos personali che ho sempre impostato nelle mie applicazioni LAMP.

  • Installa mod_deflate per apache, e non utilizzare i gestori di gzip di PHP. mod_deflate vi permetterà di comprimere contenuto statico, come javascript / css / html statico, nonché la solita uscita PHP dinamico, e è una cosa meno si deve preoccupare circa nel codice.

  • Fare attenzione con i file .htaccess! L'attivazione di file .htaccess per directory nella vostra applicazione significa che Apache deve eseguire la scansione del file system costantemente, alla ricerca di .htaccess direttive. E 'molto meglio mettere direttive all'interno del principale configurazione o un vhost configurazione, dove vengono caricati una volta. Ogni volta che si può sbarazzarsi di un file di accesso a livello di directory spostando in un file di configurazione principale, si risparmia tempo di accesso al disco.

  • Preparate banca dati della vostra applicazione strato di utilizzare una gestione connessione di qualche tipo (io uso un Singleton per la maggior parte delle applicazioni). Non è molto difficile da fare, e la riduzione del numero di connessioni al database tua applicazione si apre consente di risparmiare risorse.

  • Se pensate che la vostra applicazione vedi carico significativo, can memcached compiere miracoli. Tenetelo a mente mentre si scrive il codice ... forse uno giorno invece di creare oggetti al volo, vi sarà inducendole da memcached. Un po 'di previsione farà implementazione indolore.

  • Una volta che l'applicazione è in esecuzione, impostare tempo di risposta lenta di MySQL per un piccolo numero e monitorare il log delle query lente diligentemente. Questo vi mostrerà dove le query problematiche sono provenienti da, e ti permettono di ottimizzare il vostro query e gli indici prima di diventare un problema.

  • Per gravi tweakers prestazioni, è vorranno compilare PHP dai sorgenti. Installazione da un pacchetto installa un sacco di librerie che non può mai uso. Dal momento che gli ambienti PHP sono caricato in ogni istanza di un filo apache, anche una memoria 5MB in testa da librerie extra rapidamente diventa 250 MB di memoria perduta quando c'è 50 thread Apache esistenza. Tengo una lista dei miei linea ./configure standard di uso quando edificio PHP qui , e io Trovalo adatta la maggior parte delle mie applicazioni. Il rovescio della medaglia è che se si finisce che necessitano di una biblioteca, si deve ricompilare PHP per ottenerlo. Analizzare il codice e testarlo in un devel ambiente per assicurarsi di avere tutto il necessario.

  • Minify Javascript.

  • Siate pronti a spostare il contenuto statico, come ad esempio immagini e video, ad un web server non dinamico. Scrivi il tuo codice in modo che tutti gli URL per le immagini e il video sono facilmente configurato per puntare a un altro server in futuro. UN web server ottimizzato per statica contenuto può facilmente servire decine o addirittura centinaia di volte più veloce di un dinamica server dei contenuti.

Questo è quello che mi viene in mente la parte superiore della mia testa. Googling intorno per PHP migliori pratiche troverà un sacco di consigli su come scrivere più velocemente / code meglio così. (Come ad esempio: echo è più veloce di print)

Altri suggerimenti

Innanzitutto, renditi conto che la performance è un processo iterativo.Non crei un'applicazione web in un unico passaggio, la avvii e non ci lavori mai più.Al contrario, inizi in piccolo e risolvi i problemi di prestazioni man mano che il tuo sito cresce.

Ora, nello specifico:

  1. Profilo.Identifica i tuoi colli di bottiglia.Questo è il passo più importante.Devi concentrare i tuoi sforzi dove otterrai i migliori risultati.Dovresti disporre di una sorta di soluzione di monitoraggio (come cactus o munin), che ti dia visibilità su ciò che sta accadendo sui tuoi server
  2. Cache, cache, cache.Probabilmente scoprirai che l'accesso al database è il collo di bottiglia più grande sul back-end, ma dovresti verificarlo da solo.Fortunatamente, probabilmente scoprirai che gran parte del tuo traffico riguarda un piccolo insieme di risorse.Puoi memorizzare nella cache quelle risorse in qualcosa come memcached, risparmiandoti l'impatto del database e ottenendo prestazioni di backend migliori.
  3. Come altri hanno già detto sopra, dai un'occhiata alle regole di prestazione YDN.Considera l'idea di ritirare il libro di accompagnamento.Questo ti aiuterà con le prestazioni front-end
  4. Installare PHP APC, e assicurati che sia configurato con memoria sufficiente per contenere tutto il bytecode PHP compilato.Recentemente abbiamo scoperto che la nostra installazione APC non aveva abbastanza RAM;dargli abbastanza tempo per funzionare riduce della metà il tempo della CPU e l'attività del disco del 10%
  5. Assicurati che le tabelle del tuo database siano indicizzate correttamente.Ciò va di pari passo con il monitoraggio del registro delle query lente.

Quanto sopra ti porterà molto lontano.Vale a dire, anche un sito con un database abbastanza pesante dovrebbe essere in grado di sopravvivere a uno scavo in prima pagina su un singolo server con specifiche modeste se hai fatto quanto sopra.

Alla fine raggiungerai un punto in cui la configurazione predefinita di Apache non sarà sempre in grado di tenere il passo con le richieste in arrivo.Quando colpisci questo muro, ci sono due cose da fare:

  1. Come sopra, profilo.Monitora la tua attività di Apache: dovresti avere un'idea di quante connessioni sono attive in un dato momento, oltre al numero massimo di connessioni attive quando si verificano improvvisi picchi di traffico
  2. Configura Apache tenendo presente questo.Questa è la migliore guida alla configurazione di Apache che ho visto: Capitolo pratico mod_perl 11
  3. Togli più carico possibile da Apache.Apache è troppo pesante per servire il contenuto statico in modo efficiente.Dovresti utilizzare un proxy inverso più leggero (come squid) o un server web (lighttpd o nginx) per servire contenuto statico e assumere il compito di fornire byte ai client lenti.Ciò lascia ad Apache il compito di fare ciò che sa fare meglio:esegui il tuo codiceAncora una volta, il libro mod_perl fa un buon lavoro spiegando questo.

Una volta che sei arrivato così lontano, è in gran parte una questione di memorizzare di più nella cache e tenere d'occhio il tuo database.Alla fine, diventerai troppo grande per un singolo server.Innanzitutto, probabilmente aggiungerai più caselle front-end, tutte supportate da un singolo server di database.Quindi dovrai iniziare a distribuire il carico del database, probabilmente mediante lo sharding.Per un’eccellente panoramica di questo processo di crescita, cfr questa presentazione del livejournal

Per uno sguardo più approfondito a gran parte di quanto sopra, dai un'occhiata Creazione di siti Web scalabili, di Cal Henderson, famoso su Flickr.Google ha parti del libro disponibili per l'anteprima

Ho usato MysqlTuner per l'analisi delle prestazioni sul mio server MySQL e il suo dato una buona visione ulteriori problemi per googling, oltre a rendere le proprie raccomandazioni

Una risorsa si potrebbe trovare utile è il YDN serie di prestazioni regole .

Non dimenticare il fatto che gli utenti saranno in migliaia di miglia di distanza dal server, e il download di decine di file per rendere una singola pagina. Che la latenza, e l'overhead di rendere la pagina nel proprio browser può essere più grande rispetto alla quantità di tempo che si spende la raccolta delle informazioni, e la generazione della pagina.

Si vedano le pagine con Yahoo Developer Network su Best Practices per velocizzare il tuo sito Web , e il YSlow strumento per vedere quale parte del download del sito sta prendendo tempo.

Non dimenticare di spegnere atime per il filesystem!

Mi consiglia di utilizzare Jet Profiler per MySQL per trovare tutte le domande cattive. Ho usato con successo su un paio dei miei siti. Veramente disponibile, e molto più facile da digerire rispetto al log delle query lente.

Mi consiglia di iniziare con http://highscalability.com/

Per quanto riguarda i vostri suggerimenti:

La compressione per le immagini, decisamente no. Tipo di tunning file di sistema, sì, che potrebbe avere qualche effetto, ma minimo. Ma in realtà il migliore è quello di utilizzare in-memory proxy inverso, o meglio ancora CDN.

Per Apache fondamentalmente solo caricare i moduli necessari. Non caricare qualsiasi altra cosa. Come con PHP si può solo utilizzare forking MPM, è importante tenerlo sottile. Per quanto riguarda le impostazioni ottimali, bene bisogna bene loro sintonizzarsi su applicazioni specifiche, hardware, ecc Se avete abbastanza di CPU, è raccomandabile utilizzare mod_deflate. Più veloce il server può inviare i dati al client, più veloce è possibile avviare l'elaborazione successiva richiesta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top