2010-09-09 16 views
5

Sto eseguendo un'applicazione Django su Apache con mod_wsgi. Ci saranno tempi di inattività durante un aggiornamento?Tempo di inattività durante il ricaricamento del daemon mod_wsgi?

Mod_wsgi è in esecuzione in modalità daemon, quindi posso ricaricare il mio codice toccando il file di script .wsgi, come descritto nel documento "ReloadingSourceCode": http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode. Presumibilmente, la ricarica richiede una quantità di tempo non nulla. Cosa succede se una richiesta arriva durante la ricarica? Apache accoderà la richiesta e la completerà dopo che il daemon wsgi è pronto?

La documentazione include la seguente dichiarazione:

Quindi, se si utilizza Django in modalità demone e aveva bisogno di modificare il file 'settings.py', una volta effettuata la modifica richiesta, anche toccare il file di script contenente il punto di ingresso dell'applicazione WSGI. Fatto ciò, alla richiesta successiva il processo verrà riavviato e la tua applicazione Django ricaricata.

Per me, questo suggerisce che Apache gestirà con garbo ogni richiesta, ma ho pensato di chiedere di essere sicuro. La mia app non è critica (un po 'di tempo libero non sarebbe disastroso) quindi la domanda è per lo più accademica.

Grazie.

risposta

18

Nella modalità daemon non è previsto il riavvio graduale quando viene toccato il file di script WSGI per forzare un download. Cioè, a differenza di Apache stesso, che avvierà nuovi processi figlio del server Apache mentre attende che i vecchi processi finiscano con le richieste correnti, per i processi dememon di mod_wsgi, il processo esistente deve uscire prima dell'avvio di uno nuovo.

Le conseguenze di ciò sono che mod_wsgi non può attendere indefinitamente per il completamento delle richieste correnti. Se così fosse, c'è il rischio che, se tutti i processi daemon siano bloccati in attesa che le richieste correnti finiscano, i client vedrebbero un notevole ritardo nella gestione.

All'altra estremità della scala, tuttavia, il processo daemon non può essere immediatamente eliminato poiché ciò causerebbe l'interruzione delle richieste correnti.

Quindi esiste una via di mezzo. Il processo daemon attenderà il completamento delle richieste prima di uscire, ma se non sono state completate entro il periodo di spegnimento, il processo demone verrà chiuso forzatamente e le richieste attive verranno interrotte.

Il periodo di questo timeout di spegnimento è impostato su 5 secondi. Può essere sovrascritto usando l'opzione shutdown-timeout per la direttiva WSGIDaemonProcess, ma si dovrebbe tenere in debita considerazione gli effetti della sua modifica.

Pertanto, in relazione a questo problema specifico, se le richieste a esecuzione prolungata sono ancora attive quando arriva la prima richiesta dopo aver toccato il file di script WSGI, c'è il rischio che le richieste lunghe attive vengano interrotte.

La prossima cosa notevole che si può vedere è che, anche se non ci sono richieste e processi di arresto prolungati, è necessario caricare nuovamente l'applicazione WSGI all'interno del nuovo processo. Il tempo impiegato da questa operazione verrà considerato come un ritardo nella gestione della richiesta. Quanto grande sarà questo ritardo dipenderà dal framework e dalla tua applicazione. Il peggior offensore per quanto riguarda il tempo necessario per l'avvio che conosco è TurboGears. Django in qualche modo migliore e il migliore per quanto riguarda i tempi di avvio rapidi essendo micro framework leggeri come Flask.

Si noti che eventuali nuove richieste che arrivano mentre si verificano questi arresti e ritardi di avvio non vanno persi. Questo perché il socket del listener HTTP ha una certa profondità e le connessioni si accodano in attesa di essere accettate. Se il numero di richieste in arrivo è enorme e la coda si riempie, inizierai a vedere errori di connessione rifiutati nel browser.

+0

Queste informazioni di sottofondo extra sono ottime. Avevo solo pensato a nuove richieste, non a richieste precedenti a lungo termine, ma quello che descrivi ha perfettamente senso. Grazie. – AndrewF

+1

FWIW, mod_wsgi 4.0 inizierà a introdurre alcune opzioni di ricarica un po 'più eleganti quando è disponibile. –

1

No, non ci saranno tempi di inattività. Le richieste che utilizzano il vecchio codice verranno completate e le nuove richieste utilizzeranno il nuovo codice.

Ci sarà un po 'più di carico sul server man mano che il nuovo codice viene caricato, ma a meno che l'applicazione non sia colossale e i server siano già quasi sovraccaricati questo sarà impercettibile.

Questo è come il comando apachectl graceful per Apache nel suo complesso, che indica di avviare una nuova configurazione senza tempi di inattività.

+0

Meraviglioso, grazie. – AndrewF

+0

Non copre l'intera immagine. Ci possono essere ritardi e richieste interrotte. Vedi la mia risposta. –

Problemi correlati