mirror of
https://github.com/golang/go
synced 2024-11-26 05:37:57 -07:00
cmd/trace: add basic documentation to main page
This change adds rudimentary explanation of the various visualizations to main page of the trace server. There is clearly a vast amount one could write here, especially in the form of tutorials, but I've tried to restrict it to just basic conceptual overview. Change-Id: Id4dfe9d47f9b31ed5f8fe39f8b3a7c60c0ae8d5a Reviewed-on: https://go-review.googlesource.com/c/go/+/412876 Reviewed-by: Michael Pratt <mpratt@google.com> Run-TryBot: Alan Donovan <adonovan@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
parent
b004c739b5
commit
be0b2a393a
@ -185,23 +185,195 @@ func httpMain(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
var templMain = template.Must(template.New("").Parse(`
|
var templMain = template.Must(template.New("").Parse(`
|
||||||
<html>
|
<html>
|
||||||
|
<style>
|
||||||
|
/* See https://github.com/golang/pkgsite/blob/master/static/shared/typography/typography.css */
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji';
|
||||||
|
font-size: 1rem;
|
||||||
|
line-height: normal;
|
||||||
|
max-width: 9in;
|
||||||
|
margin: 1em;
|
||||||
|
}
|
||||||
|
h1 { font-size: 1.5rem; }
|
||||||
|
h2 { font-size: 1.375rem; }
|
||||||
|
h1,h2 {
|
||||||
|
font-weight: 600;
|
||||||
|
line-height: 1.25em;
|
||||||
|
word-break: break-word;
|
||||||
|
}
|
||||||
|
p { color: grey85; font-size:85%; }
|
||||||
|
</style>
|
||||||
<body>
|
<body>
|
||||||
|
<h1>cmd/trace: the Go trace event viewer</h1>
|
||||||
|
<p>
|
||||||
|
This web server provides various visualizations of an event log gathered during
|
||||||
|
the execution of a Go program that uses the <a href='https://pkg.go.dev/runtime/trace'>runtime/trace</a> package.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Event timelines for running goroutines</h2>
|
||||||
{{if $}}
|
{{if $}}
|
||||||
|
<p>
|
||||||
|
Large traces are split into multiple sections of equal data size
|
||||||
|
(not duration) to avoid overwhelming the visualizer.
|
||||||
|
</p>
|
||||||
|
<ul>
|
||||||
{{range $e := $}}
|
{{range $e := $}}
|
||||||
<a href="{{$e.URL}}">View trace ({{$e.Name}})</a><br>
|
<li><a href="{{$e.URL}}">View trace ({{$e.Name}})</a></li>
|
||||||
{{end}}
|
{{end}}
|
||||||
<br>
|
</ul>
|
||||||
{{else}}
|
{{else}}
|
||||||
<a href="/trace">View trace</a><br>
|
<ul>
|
||||||
|
<li><a href="/trace">View trace</a></li>
|
||||||
|
</ul>
|
||||||
{{end}}
|
{{end}}
|
||||||
<a href="/goroutines">Goroutine analysis</a><br>
|
<p>
|
||||||
<a href="/io">Network blocking profile</a> (<a href="/io?raw=1" download="io.profile">⬇</a>)<br>
|
This view displays a timeline for each of the GOMAXPROCS logical
|
||||||
<a href="/block">Synchronization blocking profile</a> (<a href="/block?raw=1" download="block.profile">⬇</a>)<br>
|
processors, showing which goroutine (if any) was running on that
|
||||||
<a href="/syscall">Syscall blocking profile</a> (<a href="/syscall?raw=1" download="syscall.profile">⬇</a>)<br>
|
logical processor at each moment.
|
||||||
<a href="/sched">Scheduler latency profile</a> (<a href="/sche?raw=1" download="sched.profile">⬇</a>)<br>
|
|
||||||
<a href="/usertasks">User-defined tasks</a><br>
|
Each goroutine has an identifying number (e.g. G123), main function,
|
||||||
<a href="/userregions">User-defined regions</a><br>
|
and color.
|
||||||
<a href="/mmu">Minimum mutator utilization</a><br>
|
|
||||||
|
A colored bar represents an uninterrupted span of execution.
|
||||||
|
|
||||||
|
Execution of a goroutine may migrate from one logical processor to another,
|
||||||
|
causing a single colored bar to be horizontally continuous but
|
||||||
|
vertically displaced.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Clicking on a span reveals information about it, such as its
|
||||||
|
duration, its causal predecessors and successors, and the stack trace
|
||||||
|
at the final moment when it yielded the logical processor, for example
|
||||||
|
because it made a system call or tried to acquire a mutex.
|
||||||
|
|
||||||
|
Directly underneath each bar, a smaller bar or more commonly a fine
|
||||||
|
vertical line indicates an event occuring during its execution.
|
||||||
|
Some of these are related to garbage collection; most indicate that
|
||||||
|
a goroutine yielded its logical processor but then immediately resumed execution
|
||||||
|
on the same logical processor. Clicking on the event displays the stack trace
|
||||||
|
at the moment it occurred.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The causal relationships between spans of goroutine execution
|
||||||
|
can be displayed by clicking the Flow Events button at the top.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
At the top ("STATS"), there are three additional timelines that
|
||||||
|
display statistical information.
|
||||||
|
|
||||||
|
"Goroutines" is a time series of the count of existing goroutines;
|
||||||
|
clicking on it displays their breakdown by state at that moment:
|
||||||
|
running, runnable, or waiting.
|
||||||
|
|
||||||
|
"Heap" is a time series of the amount of heap memory allocated (in orange)
|
||||||
|
and (in green) the allocation limit at which the next GC cycle will begin.
|
||||||
|
|
||||||
|
"Threads" shows the number of kernel threads in existence: there is
|
||||||
|
always one kernel thread per logical processor, and additional threads
|
||||||
|
are created for calls to non-Go code such as a system call or a
|
||||||
|
function written in C.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Above the event trace for the first logical processor are
|
||||||
|
traces for various runtime-internal events.
|
||||||
|
|
||||||
|
The "GC" bar shows when the garbage collector is running, and in which stage.
|
||||||
|
Garbage collection may temporarily affect all the logical processors
|
||||||
|
and the other metrics.
|
||||||
|
|
||||||
|
The "Network", "Timers", and "Syscalls" traces indicate events in
|
||||||
|
the runtime that cause goroutines to wake up.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The visualization allows you to navigate events at scales ranging from several
|
||||||
|
seconds to a handful of nanoseconds.
|
||||||
|
|
||||||
|
Consult the documentation for the Chromium <a href='https://www.chromium.org/developers/how-tos/trace-event-profiling-tool/'>Trace Event Profiling Tool<a/>
|
||||||
|
for help navigating the view.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li><a href="/goroutines">Goroutine analysis</a></li>
|
||||||
|
</ul>
|
||||||
|
<p>
|
||||||
|
This view displays information about each set of goroutines that
|
||||||
|
shares the same main function.
|
||||||
|
|
||||||
|
Clicking on a main function shows links to the four types of
|
||||||
|
blocking profile (see below) applied to that subset of goroutines.
|
||||||
|
|
||||||
|
It also shows a table of specific goroutine instances, with various
|
||||||
|
execution statistics and a link to the event timeline for each one.
|
||||||
|
|
||||||
|
The timeline displays only the selected goroutine and any others it
|
||||||
|
interacts with via block/unblock events. (The timeline is
|
||||||
|
goroutine-oriented rather than logical processor-oriented.)
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Profiles</h2>
|
||||||
|
<p>
|
||||||
|
Each link below displays a global profile in zoomable graph form as
|
||||||
|
produced by <a href='https://go.dev/blog/pprof'>pprof</a>'s "web" command.
|
||||||
|
|
||||||
|
In addition there is a link to download the profile for offline
|
||||||
|
analysis with pprof.
|
||||||
|
|
||||||
|
All four profiles represent causes of delay that prevent a goroutine
|
||||||
|
from running on a logical processor: because it was waiting for the network,
|
||||||
|
for a synchronization operation on a mutex or channel, for a system call,
|
||||||
|
or for a logical processor to become available.
|
||||||
|
</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/io">Network blocking profile</a> (<a href="/io?raw=1" download="io.profile">⬇</a>)</li>
|
||||||
|
<li><a href="/block">Synchronization blocking profile</a> (<a href="/block?raw=1" download="block.profile">⬇</a>)</li>
|
||||||
|
<li><a href="/syscall">Syscall blocking profile</a> (<a href="/syscall?raw=1" download="syscall.profile">⬇</a>)</li>
|
||||||
|
<li><a href="/sched">Scheduler latency profile</a> (<a href="/sche?raw=1" download="sched.profile">⬇</a>)</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>User-defined tasks and regions</h2>
|
||||||
|
<p>
|
||||||
|
The trace API allows a target program to annotate a <a
|
||||||
|
href='https://pkg.go.dev/runtime/trace#Region'>region</a> of code
|
||||||
|
within a goroutine, such as a key function, so that its performance
|
||||||
|
can be analyzed.
|
||||||
|
|
||||||
|
<a href='https://pkg.go.dev/runtime/trace#Log'>Log events</a> may be
|
||||||
|
associated with a region to record progress and relevant values.
|
||||||
|
|
||||||
|
The API also allows annotation of higher-level
|
||||||
|
<a href='https://pkg.go.dev/runtime/trace#Task'>tasks</a>,
|
||||||
|
which may involve work across many goroutines.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The links below display, for each region and task, a histogram of its execution times.
|
||||||
|
|
||||||
|
Each histogram bucket contains a sample trace that records the
|
||||||
|
sequence of events such as goroutine creations, log events, and
|
||||||
|
subregion start/end times.
|
||||||
|
|
||||||
|
For each task, you can click through to a logical-processor or
|
||||||
|
goroutine-oriented view showing the tasks and regions on the
|
||||||
|
timeline.
|
||||||
|
|
||||||
|
Such information may help uncover which steps in a region are
|
||||||
|
unexpectedly slow, or reveal relationships between the data values
|
||||||
|
logged in a request and its running time.
|
||||||
|
</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/usertasks">User-defined tasks</a></li>
|
||||||
|
<li><a href="/userregions">User-defined regions</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Garbage collection metrics</h2>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/mmu">Minimum mutator utilization</a></li>
|
||||||
|
</ul>
|
||||||
|
<p>
|
||||||
|
This chart indicates the maximum GC pause time (the largest x value
|
||||||
|
for which y is zero), and more generally, the fraction of time that
|
||||||
|
the processors are available to application goroutines ("mutators"),
|
||||||
|
for any time window of a specified size, in the worst case.
|
||||||
|
</p>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
`))
|
`))
|
||||||
|
Loading…
Reference in New Issue
Block a user