Ho un server Twisted sotto carico. Quando il server è sotto carico, l'utilizzo della memoria aumenta e non viene mai recuperato (anche quando non ci sono più client). La prossima volta che si passa a un carico elevato, l'utilizzo della memoria aumenta nuovamente. Ecco un'istantanea della situazione a questo punto:Perdita di memoria in Python Twisted: dov'è?
- La memoria RSS è 400 MB (dovrebbe essere 200 MB con il solito numero massimo di client).
- gc.garbage è vuoto, quindi non ci sono oggetti non recuperabili.
- Utilizzo di objgraph.py non mostra candidati evidenti per perdite (nessuna differenza notevole tra un processo normale, sano e un processo di perdita).
- Utilizzo del Il pimplatore mostra alcune decine di MB (solo) utilizzate dagli oggetti Python (principalmente dict, list, str e altri contenitori nativi).
Valgrind con leak-check = pieno abilitato non mostra alcuna perdita importante (solo un paio di MB 'definitivamente persi') - quindi le estensioni C non sono il colpevole. La memoria totale, inoltre, non si sommano con il 400MB + dimostrato dal top:
==23072== HEAP SUMMARY:
==23072== in use at exit: 65,650,760 bytes in 463,153 blocks
==23072== total heap usage: 124,269,475 allocs, 123,806,322 frees, 32,660,215,602 bytes allocated
L'unica spiegazione che posso trovare è che alcuni oggetti non sono tracciati dal garbage collector, in modo che non sono mostrati da objgraph e pympler, ma usano un'enorme quantità di RAM.
Quali altri strumenti o soluzioni ho? La compilazione dell'interprete Python nella guida alla modalità di debug, utilizzando sys.getobjects?
Un altro strumento da osservare è un po 'troppo pieno. La risposta su http://stackoverflow.com/questions/1331561/using-heapys-memory-profile-browser-with-twisted-web fornisce un esempio del modo in cui potresti volerlo utilizzare. –
L'ho provato, sfortunatamente Heapy interrompe il processo quando provo ad usarlo. – Tommy
Questo accade solo quando si usa PyPy o anche con CPython? –