40/sec a 500/sec
Introduzione
Sorprendo, dal titolo? bene, questo è un
giro di come abbiamo spezzato il jinx di scalability dal maneggiamento
40 annotazioni magre al secondo a 500 annotazioni al secondo.
Guardisi da, la maggior parte dei problemi che abbiamo
affrontato erano diritto di andata, in modo da la gente esperta
potrebbe trovare questa superflua.
Indice
* 1.0 dove eravamo?
1.1 La memoria colpisce il cielo
1.2 tasso di elaborazione basso
1.3 Perdita di dati: - (
1.4 Mysql li tira in giù
1.5 Web client Lento
* strada 2.0 al nirvana
2.1 Memoria di controllo!
2.2 Miglioramento del tasso di elaborazione
2.3 Che uh-uh di perdita di dati?
2.4 Domande Di sintonia di Sql
2.5 Schema di sintonia della base di dati
2.5 Mysql li aiuta a procedere a tutta velocità!
2.6 Più velocemente... più velocemente web client
* linea inferiore 3.0
Dove eravamo?
Inizialmente abbiamo avuti un sistema in grado di regolare
soltanto fino a 40 annotazioni /sec. Potrei persino ricordare la
discussione, circa "che cosa dovrei essere il tasso ideale delle
annotazioni? ". Infine abbiamo deciso che 40/sec era il
tasso ideale per una singola parete refrattaria. Così quando
dobbiamo uscire, atleast abbiamo dovuto sostenere 3 pareti
refrattarie. Quindi abbiamo deciso che 120/sec sarebbe il tasso
ideale. Sulla base dei dati dal nostro competitor(s) siamo
giunto alla conclusione che, potrebbe sostenere intorno a 240/sec.
Abbiamo pensato che fosse giusta! poichè era il nostro
primo rilascio. Poiché tutti i competitori hanno parlato del
numero di pareti refrattarie ha sostenuto ma non sul tasso.
La memoria colpisce il cielo
La nostra memoria stava colpendo sempre il cielo
anche a 512MB! (eccezione di OutOfMemory) abbiamo incolpato del
nascondere inmemory del cewolf(s) del images.But che generato non
potremmo fuoriuscire per lungo! Nessuna materia se abbiamo
collegato il cliente o non noi ha usato colpire pianamente il cielo in
una coppia del massimo di giorni 3-4 giorni! Interessante,
questo era riproducibile quando abbiamo trasmesso i dati a rates(then)
molto alto, intorno a 50/sec. Lo avete indovinato destra, un
amplificatore illimitato che si sviluppa fino a che non colpisse il
tetto.
Tasso di elaborazione basso
Stavamo procedendo le annotazioni al tasso di
40/sec. Stavamo usando l'aggiornamento all'ingrosso di
dataobject(s). Ma non ha dato la velocità prevista! A
causa di questo abbiamo cominciato accumulare i dati nella memoria con
conseguente memoria di tesaurizzazione!
Perdita Di Dati: - (
A velocità molto elevata abbiamo usato mancare molto un
packet(s). Abbiamo sembrato avere poca perdita di dati, ma
quella ha provocato un maiale di memoria. Su alcuno che tweaking
per limitare la dimensione della memoria di transito abbiamo
cominciato avere una perdita costante di dati di circa 20% ai tassi
molto alti.
Mysql li tira in giù
Stavamo affrontando un periodo duro in cui abbiamo
importato una lima di ceppo circa di 140MB. Mysql ha cominciato
hog, strisciare iniziato macchina ed a volte esso persino
responding.Above arrestato tutto, abbiamo cominciato ottenere il
timeout(s) di transazione e del deadlock(s). Quale finalmente ha
ridotto la risposta del sistema.
Web client Lento
Qui abbiamo incolpato ancora del numero di grafici
che abbiamo mostrato in una pagina come l'ingorgo, ignorante il fatto
che ci erano molti altri fattori che stavano tirando in giù il
sistema. Le pagine hanno usato occorrere 30 secondi al carico
per una pagina con 6-8 grafici e tabelle dopo 4 giorni al centro di
dati del Internet.
Strada Al Nirvana
Memoria Di Controllo!
Abbiamo provato a mettere un limite sulla dimensione della
memoria di transito di 10.000, ma non dura lungo. Il difetto
principale nel disegno era che abbiamo supposto che l'amplificatore di
intorno 10000 basterebbe, cioè saremmo annotazioni trattate prima che
l'amplificatore di 10.1000 estensioni. In linea con il principio
"che qualcosa può andare male esso andrà male!" è andato
male. Abbiamo cominciato slacciare i dati. Subsesquently
che abbiamo deciso andare con nascondere basato della lima piana, in
cui i dati sono stati fatti uscire nella lima piana e sarebbero
caricati nella base di dati usando "i dati del carico infile".
Ciò era molte volte più velocemente di un inserto all'ingrosso
via il driver che della base di dati potreste anche desiderare alla
verifica alcune ottimizzazioni possibili con i dati del carico infile.
Ciò ha riparato il nostro problema di aumento della dimensione
della memoria di transito delle annotazioni grezze.
Il secondo problema che abbiamo affrontato era l'aumento
di cewolf(s) nella memoria che nasconde il meccanismo. Per
difetto ha usato "TransientSessionStorage" che nasconde gli oggetti di
immagine nella memoria, là sembrato per essere un certo problema nel
pulire gli oggetti, anche dopo che i rerferences sono stati persi!
Così abbiamo scritto una piccola esecuzione "di FileStorage"
che memorizzano gli oggetti di immagine nella lima locale. E sia
servito man mano che la richiesta entra. Inoltre, inoltre
implmentated un meccanismo di pulizia alle immagini stantie del
images(di pulizia più vecchie di 10mins).
Un'altra funzione che interessante abbiamo trovato qui era
che il collettore dell'immondizia ha avuto la priorità più bassa in
modo da gli oggetti generati per l'ogni annotazioni, appena è stata
pulita. Qui è un poco per la matematica per spiegare la
grandezza del problema. Ogni volta che riceviamo un'annotazione
che del ceppo abbiamo generato il objects(hashmap ~20, tokenized le
stringhe ecc) così al tasso di 500/sec per 1 secondo, il numero di
oggetti era 10,000(20*500*1). dovuto il collettore
d'elaborazione pesante dell'immondizia non ha avuto mai una
probabilità a pulizia gli oggetti. Così tutto che dovessimo
fare era un tweak secondario, noi appena ha assegnato "la posizione di
segnale minimo" ai riferimenti dell'oggetto. Voila! il
collettore dell'immondizia era non torturato mai indovina; -)
Miglioramento del tasso di elaborazione
Il tasso di elaborazione era ad un 40/sec magro
che significa che potremmo appena sostenere persino un piccolo scoppio
delle annotazioni del ceppo! Il controllo di memoria ci ha dato
un certo solace, ma il problema reale era con l'applicazione dei
filtri attenti sopra le annotazioni. Abbiamo avuti intorno 20
proprietà per ogni annotazione, noi abbiamo usato cercare tutte le
proprietà. Abbiamo cambiato l'esecuzione al fiammifero per
quelle proprietà che abbiamo avuti test di verifica per!
Inoltre, inoltre abbiamo avuti una perdita di memoria
nell'elaborazione attenta del filtro. Abbiamo effettuato una
coda che si è sviluppata per sempre. Così abbiamo dovuto
effettuare un oggetto della lima piana che fa uscire per evitare
re-analizzare delle annotazioni per formare gli oggetti!
Inoltre, abbiamo usato fare l'atto di ricerca del fiammifero per
ciascuna della proprietà anche quando non abbiamo fatti configurare
test di verifica attenti.
Che uh-uh di perdita di dati?
Una volta che riparassimo la memoria pubblica nella
ricezione dei dati cioè che fanno uscire nella lima piana, noi mai
non ha perso i dati! Oltre che quella abbiamo dovuto rimuovere
una coppia degli indici indesiderabili nella tabella grezza per
evitare le spese generali mentre facevamo uscire i dati. Noi
indici del hadd per le colonne in grado di avere un massimo di 3
valori possibili. Quale realmente ha reso l'inserto più lento e
non era utile.
Domande Di sintonia di Sql
Le vostre domande sono le vostre chiavi alle
prestazioni. Una volta che cominciate inchiodare le edizioni,
vedrete che potreste persino dovere de-normalizzare le tabelle.
Le abbiamo fatte! Qui sono alcuni dei learnings chiave:
* L'uso "analizza la tabella" per identificare come
la domanda del mysql funziona. Ciò vi darà la comprensione
circa perchè la domanda è lenta, cioè se sta usando gli indici
corretti, se sta usando un'esplorazione ecc del livello della tabella.
* Mai file di cancellazione quando vi occupate dei
dati enormi per 50.000 annotazioni in una singola tabella.
Sempre prova per fare "una tabella di goccia" tanto come
possibile. Se non è possibile, riprogetti il vostro schema, che
è la vostra soltanto uscita!
* Eviti il join(s) indesiderabile, non sono
impaurito de-normalizzare (cioè duplichi i valori della colonna)
evitano il join(s) tanto quanto possibile, tendono a tirare in giù la
vostra domanda. Un vantaggio nascosto è il fatto che impongono
la semplicità nelle vostre domande.
* Sesiete occupandosi iete occupandosi dei dati
all'ingrosso, l'uso "dati del carico infile" là è sempre due opzioni
qui, local e ripresa esterna. Usi il local se il mysql e
l'applicazione sono al contrario nella stessa ripresa esterna di uso
della macchina.
* Provi a tagliare le vostre domande complesse in
due o tre domande più semplici. I vantaggi in questo metodo
sono che la risorsa del mysql non hogged in su per l'intero processo.
Tenda ad usare le tabelle provvisorie. Invece di usando
una singola domanda che misura attraverso 5-6 pospone.
* Quando vi occupate della quantità enorme di dati,
cioè desiderate ai proces dite 50.000 annotazioni o più in una
singola prova di domanda usando il limite al processo discontinuo le
annotazioni. Ciò li aiuterà a regolare il sistema alle nuove
altezze
* Usi sempre il più piccolo transaction(s)
anziché quei grandi cioè che misurano attraverso le tabelle "di n".
Ciò blocca in su le risorse del mysql, che potrebbero causare
la lentezza del sistema anche per le domande semplici
* Usi il join(s) sulle colonne con gli
indici o le chiavi straniere
* Accertisi che le domande dall'interfaccia
di utente abbiano test di verifica o limiti.
* Inoltre accertisi che la colonna di test di
verifica sia spostata ad incrementi
* Non abbia il valore numerico nei test di
verifica di sql all'interno delle citazioni, perché il mysql fa un
tipo getto
* usi le tabelle provvisorie tanto come possibile
e cadale...
* L'inserto di select/delete è una doppia
serratura della tabella... è informato...
* Ciao che non fate soffrire la base di dati
del mysql con la frequenza dei vostri aggiornamenti alla base di dati.
Abbiamo avuti un caso che tipico abbiamo usato fare uscire alla
base di dati dopo che ogni 300 annotazioni. Così quando abbiamo
cominciato esaminare a 500/sec abbiamo cominciato vedere che il mysql
stava trascinandoli letteralmente giù. Quello è quando ci
siamo resi conto che il typicall al tasso di 500/sec là è "una
richiesta infile di dati del carico" ogni secondo alla base di dati
del mysql. Così abbiamo dovuto cambiare per fare uscire le
annotazioni dopo 3 minuti piuttosto che 300 annotazioni.
Schema di sintonia della base di dati
Quando vi occupate della quantità enorme di dati,
accertisi sempre che abbiate diviso i vostri dati. Quella è la
vostra strada allo scalability. Una singola tabella con i lakhs
di opinione 10 può non regolare mai. Quando intendete eseguire
le domande per i rapporti. Abbia sempre due livelli delle
tabelle, delle tabelle grezze una per i dati reali e di un altro
insieme per il tables(di rapporto le tabelle che le interfacce di
utente interrogano sopra!) Accertisi sempre che i dati sulle
vostre tabelle di rapporto non si sviluppino mai oltre un limite.
Incassili stanno progettando usare l'oracolo, voi può provare
dividere basato sui test di verifica. Ma purtroppo il mysql non
sostiene quello. Così dovremo fare quello. Effettui una
tabella del meta in cui avete normalmente le informazioni di
intestazione cioè che pospongono per cercare, per un insieme di dato
tempo di test di verifica.
* Abbiamo dovuto camminare attraverso il nostro
schema della base di dati ed abbiamo aggiunto per aggiungere alcuni
indici, cancelliamo alcuno e perfino il column(s) duplicato per
rimuovere il join(s) costoso.
* Andare in avanti abbiamo realizzato quello che li
ha le tabelle grezze poichè InnoDB era realmente lle spese generali
al sistema, in modo da lo abbiamo cambiato a MyISAM
* Inoltre siamo andato nella misura di
riduzione del numero di file in tabelle statiche coinvolgere dentro ci
uniamo
* La POSIZIONE DI SEGNALE MINIMO in tabelle
della base di dati sembra indurre lle certe prestazioni a colpire, in
modo da evitile
* Non abbia indici per le colonne che ha
permesso i valori di 2-3
* Controllo l'esigenza di ogni indice in
vostra tabella, sono costosi. Se le tabelle sono del controllo
del doppio di InnoDB allora il loro bisogno. Poiché le tabelle
di InnoDB sembrano prendere intorno 10-15 cronometra il formato delle
tabelle di MyISAM.
* Usi MyISAM ogni volta che ci è una maggioranza
di, uno una (selezioni o inserto) delle domande. Se l'inserto ed
il prescelti stanno andando essere più allora è migliore averlo come
InnoDB
Mysql li aiuta a procedere a tutta velocità!
Sintonizzi il vostro assistente del mysql solo dopo voi
aria fine il vostro queries/schemas ed il vostro codice.
Soltanto allora potete vedere un miglioramento percettibile
nelle prestazioni. Qui sono alcuni dei parametri che vengano in
pratico:
* Usi il formato dello stagno di amplificatore che
permetterà alle vostre domande di eseguire più velocemente --
innodb_buffer_pool_size=64M per InnoDB ed usare -- key-bufer-size=32M
per MyISAM
* Le persino domande semplici hanno
cominciato occorrere più tempo di quanto previsto. Realmente
siamo stati imbarazzati! Ci siamo resi conto che il mysql sembra
caricare l'indice di tutta la tabella che comincia inserire sopra.
Così che cosa è accaduto tipicamente era, tutta la domanda
semplice ad una tabella con 5-10 file ha occorr intorno 1-2 sec.
Su ulteriore analisi abbiamo trovato che appena prima la domanda
semplice, "infile di dati del carico" accaduto. Ciò è sparito
quando abbiamo cambiato le tabelle grezze al tipo di MyISAM, perché
la dimensione della memoria di transito per innodb e MyISAM sono due
configurazioni differenti.
per i parametri più configurabili veda qui.
Punta: inizi il vostro mysql per iniziare con la
seguente opzione -- l'ceppo-errore questo permetterà annotare di
errore
Più velocemente... più velocemente web client
L'interfaccia di utente è la chiave a tutto il
prodotto, particolarmente la velocità percepita della pagina è più
importante! Qui è una lista delle soluzioni e dei learnings che
potrebbero venire in pratico:
* Se i vostri dati non stanno andando cambiare per
l'opinione 3-5 minuti, è migliore nascondere le vostre pagine del
lato del cliente
* Tenda ad usare i grafici interni ecc. che
di Iframe(s)for danno un fastness percepito alle vostre pagine.
Migliori ancora l'uso il meccanismo soddisfatto di caricamento
basato Javascript. Ciò è qualcosa che potrte desiderare per
fare quando avete grafici di opinione 3+ nella stessa pagina.
* Il Internet Explorer visualizza la pagina intera
soltanto quando tutto il soddisfare è ricevuto dall'assistente.
Così è consigliabile usare i iframes o il Javascript per
caricamento soddisfatto.
* Non usi mai le entrate di multiple/duplicate della
lima di CSS nel HTML page. Il Internet Explorer tende a caricare
ogni lima di CSS come entrata separata e si applica alla pagina
completa!
La linea di fondo le vostri domande e schema rende il
sistema più lento! Riparili in primo luogo ed allora incolpano
della base di dati!
Veda Inoltre
* Rendimento elevato Mysql
* Prestazioni Di Domanda
* Spieghi La Domanda
* Domande D'Ottimizzazione
* Sintonizzazione Di InnoDB
* Mysql Di sintonia
Categorie: Analizzatore Della Parete
refrattaria | Le prestazioni capovolgono questa pagina erano Last
modified 18:00, il 31 agosto 2005.
- Ramesh-
Fonte dell'articolo: Messaggiamo.Com
Related:
» Seo Elite: New Seo Software!
» AntiSpywareBOT
» Reverse Mobile
» Error Nuker
Webmaster prendi il Codice Html
Aggiungi questo articolo al tuo sito ora!
Webmaster invia i tuoi Articoli
Nessuna registrazione richiesta. Compila il form e i tuoi articoli sono nella Directory di Messaggiamo.Com