Suggerimenti per massimizzare le richieste di Nginx / sec?


15

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:

  1. 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.
  2. 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.
  3. 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.
  4. 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.


Stai ponendo più domande in un solo post, considera la revisione. Sto solo facendo un commento e non una risposta, in quanto non posso rispondere a tutte le parti. Suppongo che tu abbia considerato le prestazioni di Python / Django - non è l'ideale per la velocità estrema. Per quanto riguarda 1200 req / s, sembra molto basso per quello che presumo sia una risposta gif 1px o HTTP 204. Vedi fx simonhf.wordpress.com/2010/10/02/nginx-versus-sxe-hello-world (24k req / s, in esecuzione su localhost, ma utilizzando solo 1 lavoratore nginx.)
Jesper M

Commento di Goldmine, grazie mille. Leggerò il post e tornerò con le mie scoperte; grazie per il puntatore "domande multiple"!
collegato il

Risposte:


8

Stai abusando dei worker_threads di Nginx. Non è assolutamente necessario gestire così tanti lavoratori. Dovresti eseguire tutti i lavoratori che hai CPU e chiamarlo un giorno. Se stai eseguendo gunicorn sullo stesso server, probabilmente dovresti limitare i lavoratori nginx a due. Altrimenti, hai intenzione di mandare in crash le CPU con tutti i cambi di contesto necessari per gestire tutti quei processi.


1
Ah grazie. Le prestazioni sembravano le stesse con 64 come con 2, ma non sapevo che WTF stesse facendo. Grazie per il chiarimento.
Link collegato il

Puoi condividere la tua configurazione Nginx? È difficile fornire suggerimenti di ottimizzazione quando non sappiamo cosa stiamo sintonizzando.
blueben

2

Ho usato nginx per servire una richiesta 5K un secondo per il contenuto statico. È possibile aumentare il numero di worker_connections che sono attualmente impostati su 1024.

Il calcolo di max_client sarebbe il seguente.

Worker_connections e worker_proceses dalla sezione principale consente di calcolare il valore maxclients:

max_clients = worker_processes * worker_connections

In una situazione di proxy inverso, max_clients diventa

max_clients = worker_processes * worker_connections / 4

http://wiki.nginx.org/EventsModule#worker_connections

Calcolare il numero massimo di connessioni di lavoro è facile una volta che conosci la capacità della tua configurazione. La capacità totale / il numero di core è il numero massimo di connessioni di lavoro. Per calcolare la capacità totale ci sono diversi modi.

  1. Ti suggerirei di provare e confrontare la tua configurazione che ti darà i numeri più realistici. Puoi usare strumenti come assedio, pummel, panca apache ecc., Ricorda di misurare l'utilizzo delle risorse di sistema durante il test.

Se il metodo sopra descritto non funziona per te, prova i metodi seguenti. Sto facendo grandi assunzioni ignorando la RAM e l'IO, anche queste verranno prese in considerazione, ma queste ti daranno punti di partenza e da quel momento in poi potrai apportare modifiche.

  1. Supponi che la larghezza di banda sia il collo di bottiglia, prendi la dimensione media dell'oggetto che serve nginx e dividi la larghezza di banda con quella e otterrai il massimo qps supportato.

  2. Nel secondo presupposto, la CPU è il collo di bottiglia. In questo caso, misurare il tempo richiesto e dividere 1 per questo e moltiplicare per il numero di core nel sistema. Ciò fornirà il numero di richieste al secondo che nginx può gestire.


Come si può determinare se è possibile aumentare worker_connections e qual è l'impostazione ideale per un determinato server?
Kato,

Ci sono un paio di modi per farlo.
Sameer
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.