Ho Apache
+ mod_wsgi
+ Django
app. mod_wsgi
viene eseguito in modalità daemon.Perché Python non rilascia memoria (in mod_wsgi + Django)
Ho una vista che preleva il queryset significativo dal DB e alloca inoltre l'array calcolando i risultati del queryset e quindi restituisce questo array. Non sto usando la memoria locale dei thread, le variabili globali o qualcosa di simile.
Il problema è che il mio app mangia memoria relativamente al numero di thread di ho impostato per mod_wsgi.
Ho fatto un piccolo esperimento impostando il numero di thread in mod_wsgi e poi colpendo la mia vista curl controllando fino a che punto il processo di wsgi può scalare la memoria.
va in questo modo:
1 thread - 256Mb 2 threads - 400Mb 3 threads - 535Mb 4 threads - 650Mb
Così ogni thread aggiungere circa 120-140Mb per l'utilizzo della memoria superiore.
Mi sembra che la memoria iniziale allocata per la prima richiesta non venga mai liberata. Nello scenario a thread singolo, viene riutilizzato quando viene inoltrata la seconda richiesta (alla stessa vista). Con quello posso andare.
Ma quando uso più thread, quando la richiesta viene elaborata da un thread che non ha mai eseguito questa richiesta, questo thread "salva" un altro 140mb da qualche parte localmente.
- Come risolvere questo problema?
- Probabilmente Django salva alcuni dati in TSL. Se questo è il caso , come posso disabilitarlo?
- In alternativa, come soluzione alternativa, è possibile associare l'esecuzione della richiesta a un determinato thread in
mod_wsgi
?
Grazie.
PS. DEBUG
è impostato su False in settings.py
A) a) crea solo l'array quando arriva un set di dati eb) lo elimina quando hai finito con esso in modo che il garbage collector possa raggiungerlo? –
a) - sì; b) - Non lo eletto esplicitamente. Lo converto in JSON e restituisco la stringa JSON. –
Se non lo si elimina, è ancora in uso! –