2014-06-26 11 views
26

Utilizziamo phantomjs per eseguire la nostra pagina di test di qunit sul nostro server di creazione TFS. La nostra versione di prova corridore è costruito dal basso esempioMatrici Phantomjs a causa dell'elevato consumo di memoria

https://github.com/ariya/phantomjs/blob/master/examples/run-qunit.js

Per un periodo di tempo il numero dei test è aumentato da centinaia a qualche migliaia di persone e in una bella giornata è iniziata phantomjs schiantarsi. Muore letteralmente dicendo di caricare la discarica e quando vedi la discarica è 0kb !!

Quando l'abbiamo esaminato più da vicino su Process Explorer, abbiamo rilevato che il consumo di memoria da parte di phantomjs continua a salire mentre phantomjs sta eseguendo dei test e alla fine si arresta in modo anomalo da qualche 833 MB.

Sì, la stessa quantità di memoria veniva utilizzata da chrome e IE! E sì-sì i nostri test stavano perdendo memoria :(. L'abbiamo risolto, l'utilizzo della memoria è stato abbassato del 50% su chrome e IE e ci aspettavamo che phantomjs lo gestisse ora, ma no, phantomjs continua a bloccarsi, process explorer mostra la stessa memoria il consumo.

http://phantomjs.org/api/webpage/method/close.html

Secondo la documentazione sopra phantomjs stampa mucchio di assegnazione solo su una stretta? questo potrebbe essere il motivo per cui la nostra prova fisso consumato meno memoria su Chrome, ma non phantomjs? E per ultimo come risolvere questo problema? Come rendere phantomjs mantenere la garbage collection degli oggetti javascript per ridurre l'allocazione dell'heap?

Aggiornamento 1 - 07/28

Abbiamo fatto un giro. Ho modificato il mio script per eseguire il modulo di test per modulo. In loop dopo aver eseguito tutti i test per un modulo, chiamo page.close in modo che rilasci la memoria per ogni modulo e non continui mai a costruire il mucchio morto di oggetti. Non chiudendo questa domanda dal momento che è una soluzione alternativa e non una soluzione. Spero che i creatori risolveranno questo a volte.

+0

Quali tipi di strutture di dati non si hanno caricato su la tua pagina web consuma 833 MB? Questo è pazzesco! Non ho mai sentito di un'applicazione web che occupi così tanta memoria. –

+0

@CameronTinker Quando l'applicazione viene eseguita autonomamente, non è più 90 MB e rimane lì per tutta la sua durata. Si tratta di un'applicazione a pagina singola creata con EmberJS. Il consumo 833 MB è della pagina runner di test di qunit .. –

risposta

10

C'è un metodo statico, QWebPageSettings::clearMemoryCache, che richiama la garbage collection di WebKit. Tuttavia, cancella tutta la cache di memoria QWebPage per ogni oggetto QWebPage istanziato ed è quindi, attualmente, non adatto per includere come opzione in PhantomJS.

La richiesta di pull Github è disponibile qui:
https://github.com/ariya/phantomjs/pull/11511
Ecco la discussione di Google Gruppi:
https://groups.google.com/forum/#!msg/phantomjs/wIDp9J7B-bE/v5U31_mTbswJ

Fino a quando una soluzione è disponibile, si potrebbe rompere il test di unità in blocchi su pagine separate. Verrà apportata una modifica all'implementazione di QtWebkit e al modo in cui la memoria/cache viene gestita attraverso gli oggetti QWebPage.

aggiornamento di settembre 2014: https://github.com/ariya/phantomjs/commit/5768b705a0
Sembra che il supporto per la compensazione è stato aggiunto cache di memoria, ma c'è una nota circa il mio commento originale nel commettere.

+2

Grazie per aver condiviso queste informazioni @Cameron Tinker –

+1

@lame_coder hai scoperto come accedere all'oggetto 'page' dalla tua suite di test per chiamare questo metodo? Sto incontrando lo stesso problema con Phantom2 e Ember JS. – blimmer

+0

In PhantomJS 2.0 tramite Selenium webdriver 1.2.0 è 'webdriver.executePhantomJS (" phantom.page.clearMemoryCache() ", [])'. Tuttavia, questo non funzionerà su GCing the dom (come gli iframe in un'app di una sola pagina), ma cancella solo immagini memorizzate nella cache e così via. – NielsK

0

sono riuscito a lavorare intorno ad esso impostando il flag/LARGEADDRESSAWARE

Se è stato Visual Studio installato, eseguito da un prompt dei comandi di Visual Studio

editbin /LARGEADDRESSAWARE <pathto>/PhantomJS.exe 
Problemi correlati