Cosa posso fare per scoprire che cosa sta causando il mio programma di utilizzare grandi quantità di memoria nel tempo?
Domanda
Ho un'applicazione che utilizza il POE che ha circa 10 sedute che fanno vari compiti. Nel corso del tempo, l'applicazione inizia a consumare sempre di più RAM e questo utilizzo non va giù, anche se l'applicazione è inattivo l'80% del tempo. La mia unica soluzione al momento è quella di riavviare il processo spesso.
Non mi è permesso di inviare il mio codice qui così mi rendo conto che è difficile ottenere aiuto, ma forse qualcuno può dirmi cosa posso fare scoprire me stesso?
Soluzione
Non aspettatevi la dimensione processo per diminuire. La memoria non viene rilasciato torna al sistema operativo fino a quando il processo termina.
Detto questo, potreste avere cicli di riferimento a strutture di dati da qualche parte? AFAIK, il Perl garbage collector non può risolvere loop di riferimento.
Stai usando i moduli XS da qualche parte? Ci potrebbero essere perdite nascoste dentro quelli.
Altri suggerimenti
A indovinare: il programma esegue un ciclo per tutto il tempo in quanto è in esecuzione; in questo ciclo può essere che si alloca memoria per un buffer (o più) ogni volta che si verifica una certa condizione; dal momento che il campo di applicazione non è mai uscito, la memoria resta e non sarà mai ripulita. Vi suggerisco di controllare per qualcosa di simile. Se è il caso, inserire il codice allocare in un sub che si chiama dal loop e dove andrà fuori portata, e ottenere ripulito, al ritorno nel circuito.
appare come Test :: Valgrind è uno strumento per la ricerca di perdite di memoria. Non ho mai usato io stesso però (ma ho usato valgrind pianura con C source).
Una tecnica è quella di scaricare periodicamente il contenuto di $ POE :: :: Kernel poe_kernel in un file di tempo o sequenza di nome. $ Poe_kernel è la radice di un albero di copertura tutte le sessioni noti e il contenuto dei loro cumuli. Le istantanee dovrebbero monotona crescere se la memoria persa viene fatto riferimento. Sarete in grado di scoprire che cosa è fuoriuscita dal diff'ing uno snapshot iniziale con una successiva.
È possibile esportare POE_ASSERT_DATA = 1 per consentire controlli di coerenza dei dati interni di Poe. Non mi aspetto che i problemi di superficie, ma se lo fa sarei molto felice di ricevere una segnalazione di bug.
Perl non può risolvere gli anelli di riferimento. O si hanno gli zombie (che si può rilevare tramite ps Axl) o si dispone di una perdita di memoria (anelli di riferimento / cerchio)
Ci sono un sacco di programmi per rilevare perdite di memoria. strace, mtrace, Devel :: :: LeakTrace veloce, Devel :: ciclo