2012-12-04 22 views
7

Wie pprof in Go-Programm zu verwenden?So verwenden Sie pprof in Go-Programm

Es gibt ein Go-Paket mit dem Namen net/http/pprof, aber ich kann es nicht verwenden. Das Dokument sagt go tool pprof http://localhost:6060/debug/pprof/heap, das nicht funktioniert.

Und was bedeutet das unten _?

import _ "net/http/pprof"

Antwort

8

Basierend auf your comment könnte das Problem sein, dass Sie nicht die richtige Portnummer verwenden.

Wenn Sie einen HTTP-Server an http://localhost:9997 laufen, dann denke ich, Sie den Befehl mit http://localhost:9997 ausführen möchten:

$ go tool pprof http://localhost:9997/debug/pprof/heap 

Nach dem net/http/pprof pkg doc page, wenn die Anwendung bereits ausgeführt wird ein HTTP-Server Sie dies nicht tun müssen Sie einen starten und müssen nur die import _ "net/http/pprof" irgendwo in Ihrem Programm enthalten. http://localhost:6060 ist der Server als Beispiel gestartet und der Host und Port sind beliebig.

import _ "net/http/pprof" bedeutet, dass das Paket importiert wird, Sie jedoch keine exportierten Bezeichner verwenden. Nach der go language spec importiert dies das Paket nur für seine Nebenwirkungen. Diese Nebenwirkungen beinhalten, glaube ich, die Ausführung der init() functions, definiert in der package's source files und anscheinend registered variables.

Auch könnte Sie diese Blog-Post hilfreich:

http://blog.golang.org/2011/06/profiling-go-programs.html

1

Was "funktioniert nicht" bedeutet? Was wird erwartet und was wird stattdessen beobachtet?

Run

$ go tool pprof -h 

Hilfe für Ihre Version dieses Tools zu sehen. Meine lokale Version ist weder an der Spitze noch bei der Veröffentlichung (dh dazwischen). Es zeigt:

(10:16) [email protected]:~$ go tool pprof -h 
Option h is ambiguous (heapcheck, help) 
Invalid option(s) 

Usage: 
pprof [options] <program> <profiles> 
    <profiles> is a space separated list of profile names. 
pprof [options] <symbolized-profiles> 
    <symbolized-profiles> is a list of profile files where each file contains 
    the necessary symbol mappings as well as profile data (likely generated 
    with --raw). 
pprof [options] <profile> 
    <profile> is a remote form. Symbols are obtained from host:port/pprof/symbol 

    Each name can be: 
    /path/to/profile  - a path to a profile file 
    host:port[/<service>] - a location of a service to get profile from 

    The /<service> can be /pprof/heap, /pprof/profile, /pprof/pmuprofile, 
         /pprof/growth, /pprof/contention, /pprof/wall, 
         /pprof/thread, or /pprof/filteredprofile. 
    For instance: 
    pprof http://myserver.com:80/pprof/heap 
    If /<service> is omitted, the service defaults to /pprof/profile (cpu profiling). 
pprof --symbols <program> 
    Maps addresses to symbol names. In this mode, stdin should be a 
    list of library mappings, in the same format as is found in the heap- 
    and cpu-profile files (this loosely matches that of /proc/self/maps 
    on linux), followed by a list of hex addresses to map, one per line. 

    For more help with querying remote servers, including how to add the 
    necessary server-side support code, see this filename (or one like it): 

    /usr/doc/google-perftools-1.5/pprof_remote_servers.html 

Options: 
    --cum    Sort by cumulative data 
    --base=<base>  Subtract <base> from <profile> before display 
    --interactive  Run in interactive mode (interactive "help" gives help) [default] 
    --seconds=<n>  Length of time for dynamic profiles [default=30 secs] 
    --add_lib=<file> Read additional symbols and line info from the given library 
    --lib_prefix=<dir> Comma separated list of library path prefixes 

Reporting Granularity: 
    --addresses   Report at address level 
    --lines    Report at source line level 
    --functions   Report at function level [default] 
    --files    Report at source file level 

Output type: 
    --text    Generate text report 
    --callgrind   Generate callgrind format to stdout 
    --gv    Generate Postscript and display 
    --web    Generate SVG and display 
    --list=<regexp>  Generate source listing of matching routines 
    --disasm=<regexp> Generate disassembly of matching routines 
    --symbols   Print demangled symbol names found at given addresses 
    --dot    Generate DOT file to stdout 
    --ps    Generate Postcript to stdout 
    --pdf    Generate PDF to stdout 
    --svg    Generate SVG to stdout 
    --gif    Generate GIF to stdout 
    --raw    Generate symbolized pprof data (useful with remote fetch) 

Heap-Profile Options: 
    --inuse_space  Display in-use (mega)bytes [default] 
    --inuse_objects  Display in-use objects 
    --alloc_space  Display allocated (mega)bytes 
    --alloc_objects  Display allocated objects 
    --show_bytes  Display space in bytes 
    --drop_negative  Ignore negative differences 

Contention-profile options: 
    --total_delay  Display total delay at each region [default] 
    --contentions  Display number of delays at each region 
    --mean_delay  Display mean delay at each region 

Call-graph Options: 
    --nodecount=<n>  Show at most so many nodes [default=80] 
    --nodefraction=<f> Hide nodes below <f>*total [default=.005] 
    --edgefraction=<f> Hide edges below <f>*total [default=.001] 
    --focus=<regexp> Focus on nodes matching <regexp> 
    --ignore=<regexp> Ignore nodes matching <regexp> 
    --scale=<n>   Set GV scaling [default=0] 
    --heapcheck   Make nodes with non-0 object counts 
         (i.e. direct leak generators) more visible 

Miscellaneous: 
    --tools=<prefix> Prefix for object tool pathnames 
    --test    Run unit tests 
    --help    This message 
    --version   Version information 

Environment Variables: 
    PPROF_TMPDIR  Profiles directory. Defaults to $HOME/pprof 
    PPROF_TOOLS   Prefix for object tools pathnames 

Examples: 

pprof /bin/ls ls.prof 
         Enters "interactive" mode 
pprof --text /bin/ls ls.prof 
         Outputs one line per procedure 
pprof --web /bin/ls ls.prof 
         Displays annotated call-graph in web browser 
pprof --gv /bin/ls ls.prof 
         Displays annotated call-graph via 'gv' 
pprof --gv --focus=Mutex /bin/ls ls.prof 
         Restricts to code paths including a .*Mutex.* entry 
pprof --gv --focus=Mutex --ignore=string /bin/ls ls.prof 
         Code paths including Mutex but not string 
pprof --list=getdir /bin/ls ls.prof 
         (Per-line) annotated source listing for getdir() 
pprof --disasm=getdir /bin/ls ls.prof 
         (Per-PC) annotated disassembly for getdir() 

pprof http://localhost:1234/ 
         Enters "interactive" mode 
pprof --text localhost:1234 
         Outputs one line per procedure for localhost:1234 
pprof --raw localhost:1234 > ./local.raw 
pprof --text ./local.raw 
         Fetches a remote profile for later analysis and then 
         analyzes it in text mode. 

FATAL ERROR: Invalid option(s) 
go tool pprof: exit status 1 
(10:16) [email protected]:~$ 

Zur zweiten Frage: Die `Import _„foo“‘ Idiom Paket foo nur für die Nebenwirkungen von foo der Initialisierung importiert. Das kann zum Beispiel das Registrieren der Funktionalität beinhalten, die von foo bereitgestellt wird, um innerhalb anderer Pakete verwendbar zu sein. Ein konkretes Beispiel hierfür ist das spezifische Bildformat handling packages (siehe unten unter "Unterverzeichnisse") und das abstrakte image Paket.

+3

Ich habe einen Server-API von Go geschrieben, und ich möchte es optimieren. Wenn ich den Server starte, der 'localhost: 9997' abhört, wie kann ich pprof benutzen? Ich benutze den Befehl 'go tool pprof http: // localhost: 6060/debug/pprof/heap', aber habe' go tool pprof http: // localhost: 6060/debug/pprof/haufen Read http: // localhost: 6060/debug/pprof/symbol Verwendung des nicht initialisierten Werts in Substitution (s ///) unter/usr/local/go/pkg/tool/linux_amd64/pprof Zeile 2957. http: // localhost: 6060/debug/pprof/Symbol existiert nicht gehen Werkzeug pprof: beenden Status 1' – Codefor