13

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?

+0

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. –

+0

L'ho provato, sfortunatamente Heapy interrompe il processo quando provo ad usarlo. – Tommy

+0

Questo accade solo quando si usa PyPy o anche con CPython? –

risposta

2

Se il codice sta perdendo sotto carico (lo hai verificato?), Darei un'occhiata a tutti i punti in cui i messaggi sono memorizzati nel buffer. L'utilizzo della memoria del processo stesso aumenta? O l'utilizzo della memoria del sistema aumenta? Se si tratta del secondo caso, il server potrebbe essere troppo lento per tenere il passo con i messaggi in arrivo e il buffer del sistema operativo riempire ..

+0

no, il problema è con l'utilizzo della memoria del processo stesso. E sì, sembra essere correlato a problemi di caricamento, poiché un processo può andare avanti per giorni senza aumento di memoria. – Tommy