2015-07-14 9 views
5

Używam gocraft/web w projekcie i próbuję debugować niektóre użycie wysokiej pamięci. gocraft/web używa refleksji do obsługi połączeń. Ustawiłem profiler net/http/pprof, który działa bardzo dobrze, ale największy blok pamięci i ten, który mnie interesuje, pokazuje tylko reflect.Value.call jako funkcję. To niezbyt pomocne.GoLang - Czy istnieje sposób na profilowanie użycia pamięci kodu używającego reflect?

Jak mogę obejść fakt, że gocraft/web używa odbicia i zagłębia się głębiej w profil pamięci?

Oto przykład wyjścia profilu widzę:

Example Profile

+0

Czy możesz wypróbować profilowanie tego przy pomocy go1.5? Efektem ubocznym nowego środowiska wykonawczego jest to, że udostępnia on więcej profili wewnętrznych profilerowi. – JimB

+0

@ JimB, który byłby niesamowity, gdyby zadziałał, ale niestety tak nie jest. – cellofellow

Odpowiedz

3

Dzięki @thwd za wypełnienie formularza http://golang.org/issue/11786. To jest problem z wyświetlaniem w pprof. Wszystkie dane są tam, po prostu ukryte. Możesz uzyskać potrzebne dane, wywołując pprof z flagą -runtime. Wyświetli również dane, których nie potrzebujesz, ale powinno to służyć jako przyzwoite obejście, dopóki nie wyjdzie wersja 1.6.

0

Krótka odpowiedź brzmi, że bezpośrednio nie da. reflect.Value.call dzwoni reflect.call, która przekazuje do runtime.reflectcall, która jest procedurą złożenia zaimplementowaną w środowisku wykonawczym, na przykład dla amd64, here. To omija to, co widzi profiler.

Najlepszym wyjściem jest przywołanie swoich opiekunów bez zastanowienia i przetestowanie ich w ten sposób indywidualnie.

Ponadto włączenie profilowania w celu odbicia wywołania odblaskowego byłoby prawdopodobnie akceptowalną zmianą, pozwalającą zaproponować następną iterację Go. Powinieneś postępować zgodnie z change proposal process.

Edytuj: Utworzono: issue.

+0

@cellofellow: jeśli nie zamierzasz proponować zmiany, powiedz, że mogę to zrobić. – thwd

+0

śmiało i zrób propozycję :) – cellofellow

Powiązane problemy