Sto creando un pacchetto di analisi e i requisiti del progetto indicano che devo supportare 1 miliardo di hit al giorno. Sì, "miliardi". In altre parole, non meno di 12.000 colpi al secondo subirono, e preferibilmente un certo spazio per scoppiare. So che avrò bisogno di più server per questo, ma sto cercando di ottenere le massime prestazioni da ciascun nodo prima di "lanciarci più hardware".
In questo momento, ho la parte di tracciamento dei risultati completata e ottimizzata. Praticamente ho semplicemente salvato le richieste direttamente in Redis (per successive elaborazioni con Hadoop). L'applicazione è Python / Django con un gunicorn per il gateway.
Il mio server Ubuntu 10.04 Rackspace da 2 GB (non una macchina di produzione) può servire circa 1200 file statici al secondo (confrontati con Apache AB su un singolo asset statico). Per fare un confronto, se cambio il link del file statico con il mio link di monitoraggio, ricevo ancora circa 600 richieste al secondo - penso che questo significhi che il mio tracker è ben ottimizzato, perché è solo un fattore 2 più lento rispetto a servire lo stesso asset statico ripetutamente.
Tuttavia, quando faccio un benchmark con milioni di hit, noto alcune cose:
- Nessun utilizzo del disco - questo è previsto, perché ho disattivato tutti i log di Nginx e il mio codice personalizzato non fa altro che salvare i dettagli della richiesta in Redis.
- Utilizzo della memoria non costante - Presumibilmente a causa della gestione della memoria di Redis, il mio utilizzo della memoria aumenterà gradualmente e poi diminuirà, ma non è mai stato il mio collo di bottiglia.
- Il carico del sistema si aggira intorno ai 2-4, il sistema è ancora reattivo anche durante i miei benchmark più pesanti e posso ancora visualizzare manualmente http://mysite.com/tracking/pixel con un ritardo visibile ridotto mentre il mio (altro) server esegue 600 richieste per secondo.
- Se eseguo un breve test, diciamo 50.000 hit (impiega circa 2m), ottengo 600 richieste al secondo costanti e affidabili. Se eseguo un test più lungo (provato fino a 3,5 m finora), il mio rapporto r / s scende a circa 250.
Le mie domande --
un. Sembra che stia ancora esaurendo questo server? Le prestazioni nginx dei file statici 1.200 / s sono paragonabili a quelle degli altri?
b. Esistono sintonizzazioni nginx comuni per tali applicazioni ad alto volume? Ho thread di lavoro impostati su 64 e thread di lavoro gunicorn impostati su 8, ma modificare questi valori non sembra aiutarmi o danneggiarmi molto.
c. Ci sono delle impostazioni a livello di Linux che potrebbero limitare le mie connessioni in entrata?
d. Cosa potrebbe causare il degrado delle mie prestazioni a 250 r / s nei test di lunga durata? Ancora una volta, la memoria non si sta esaurendo durante questi test e l'uso dell'HDD è nullo.
Grazie in anticipo, tutto :)
EDIT Ecco la mia configurazione di nginx - http://pastie.org/1450749 - è per lo più vaniglia, con grasso evidente tagliato.