2016-04-26 17 views
6

Ho diverse app in esecuzione su uWSGI. Molti di loro crescono nell'uso della memoria nel tempo. Ho sempre attribuito questo a una perdita di memoria che non avevo rintracciato. Ma ultimamente ho notato che la crescita è piuttosto grossa. Mi chiedo se ogni blocco sia correlato con l'avvio di un processo.uWSGI avvia tutti i processi al momento dell'avvio?

uWSGI avvia tutti i processi all'avvio oppure ne avvia solo uno nuovo quando sono presenti richieste sufficienti per renderlo necessario?

Ecco un esempio di configurazione:

[uwsgi] 
strict = true 

wsgi-file = foo.py 
callable = app 

die-on-term = true 

http-socket = :2345 

master = true 
enable-threads = true 
thunder-lock = true 
processes = 6 
threads = 1 

memory-report = true 

aggiornamento: questo sembra rilevante: http://uwsgi-docs.readthedocs.org/en/latest/Cheaper.html

Vuol "lavoratore" significano la stessa cosa di "processo" (risposta sembra essere yes)? Se è così allora sembra che se voglio il numero di rimanere costante sempre, devo fare:

cheaper = 6 
cheaper-initial = 6 
processes = 6 

risposta

6

Sì, uWSGI inizierà tutti i processi (o lavoratori - lavoratore è un alias per il processo in uWSGI config) in fase di avvio tempo ma dipenderà dalla tua applicazione cosa andrà da allora. Se l'applicazione importa tutti i moduli al momento dell'avvio, dovrebbe essere completamente caricata prima della prima richiesta, ma se alcuni moduli vengono caricati al momento della richiesta, ciascun lavoratore verrà caricato completamente solo dopo le prime richieste (supponendo che qualsiasi richiesta caricherà tutti i moduli. , sarà completamente caricato solo dopo aver combinato una combinazione di richieste che lo caricheranno tutte).

Ma anche dopo aver caricato tutti i moduli, l'utilizzo della memoria dell'applicazione non sarà costante. Potrebbero esserci alcune registrazioni, variabili globali, informazioni di debug ecc. Che si accumulano ad ogni richiesta. Se stai usando qualsiasi framework è possibile che salverà alcuni dati per il debug, le statistiche, ecc.

Per impostazione predefinita, la soluzione più economica non è abilitata - questo significa che uWSGI genererà tutti i lavoratori all'avvio. Se si desidera utilizzare la modalità più economica, è necessario definire almeno il parametro cheaper. Ulteriori informazioni sull'utilizzo del sistema più economico si possono trovare in documentation

Ci sono molti altri sistemi costruiti in uWSGI per controllare il carico in base all'ammontare delle richieste. Ad esempio

Se siete preoccupati che uWSGI occuperà risorse troppo, ci sono soluzioni anche per questo:

+0

Grazie!Sì, sapevo del caricamento dei moduli e di altre cose che influivano sulla crescita della memoria, mi stavo solo chiedendo il processo di avvio. Sai a cosa servono le impostazioni più economiche? –

+0

Le impostazioni più economiche impediscono ai dipendenti di spawnare all'avvio, ma lo fanno alla prima richiesta. Ti permette di specificare quanti lavoratori saranno generati all'avvio, quanti lavoratori possono essere generati sulle richieste (se necessario) e se i lavoratori generati sulle richieste dovrebbero essere automaticamente uccisi se non più necessari. – GwynBleidD

+0

È più economico il sistema predefinito utilizzato da uwsgi e queste impostazioni ne configurano il comportamento oppure è una modalità speciale che viene attivata quando si utilizzano le impostazioni? –