2015-07-14 14 views
5

Sto utilizzando gocraft/web in un progetto e sto cercando di eseguire il debug dell'utilizzo di memoria elevata. gocraft/web utilizza la riflessione per chiamare i gestori. Ho impostato il profiler net/http/pprof che funziona molto bene, ma il più grande blocco di memoria, e quello in cui sono iterested, mostra solo la funzione reflect.Value.call. Non è molto utile.GoLang - Esiste un modo per profilare l'utilizzo della memoria del codice che utilizza reflect?

Come posso aggirare il fatto che gocraft/web utilizza il riflesso e scavare più in profondità nel profilo di memoria?

Ecco un esempio di output profilo che sto vedendo:

Example Profile

+0

Puoi provare a profilare questo con go1.5? Un effetto collaterale del nuovo runtime è che espone più interni al profiler. – JimB

+0

@JimB che sarebbe stato fantastico se avesse funzionato, ma sfortunatamente no. – cellofellow

risposta

3

Grazie a @thwd per il deposito di http://golang.org/issue/11786. Questo è un problema di visualizzazione in pprof. Tutti i dati sono lì, solo per essere nascosti. È possibile ottenere i dati necessari richiamando pprof con il flag -runtime. Mostrerà anche i dati che non ti servono, ma dovrebbe servire come soluzione decente finché Go.6 non sarà disponibile.

0

La risposta breve è che non si può direttamente. reflect.Value.call chiama reflect.call che inoltra a runtime.reflectcall che è una routine di assembly implementata nel runtime, ad esempio per amd64, here. Ciò elude ciò che il profiler può vedere.

La soluzione migliore è invocare i gestori senza alcuna riflessione e verificarli singolarmente.

Inoltre, consentire al profiler di seguire le chiamate riflesse sarebbe probabilmente un cambiamento accettabile da proporre per la prossima iterazione. Dovresti seguire lo change proposal process per questo.

Modifica: issue creato.

+0

@cellofellow: se non hai intenzione di proporre la modifica per favore dimmi che posso farlo. – thwd

+0

vai avanti e fai la proposta :) – cellofellow

Problemi correlati