c74750b4210927174cf2e620bcddd1c76f73e1e0
[mono.git] / man / mprof-report.1
1 .de Sp
2 .if t .sp .5v
3 .if n .sp
4 ..
5 .TH mprof-report 1 ""
6 .SH The Mono log profiler
7 .PP
8 The Mono \f[I]log\f[] profiler can be used to collect a lot of
9 information about a program running in the Mono runtime.
10 This data can be used (both while the process is running and later)
11 to do analyses of the program behaviour, determine resource usage,
12 performance issues or even look for particular execution patterns.
13 .PP
14 This is accomplished by logging the events provided by the Mono
15 runtime through the profiling interface and periodically writing
16 them to a file which can be later inspected with the command line
17 \f[I]mprof-report\f[] program or with a GUI (not developed yet).
18 .PP
19 The events collected include (among others):
20 .IP \[bu] 2
21 method enter and leave
22 .IP \[bu] 2
23 object allocation
24 .IP \[bu] 2
25 garbage collection
26 .IP \[bu] 2
27 JIT compilation
28 .IP \[bu] 2
29 metadata loading
30 .IP \[bu] 2
31 lock contention
32 .IP \[bu] 2
33 exceptions
34 .PP
35 In addition, the profiler can periodically collect info about all
36 the objects present in the heap at the end of a garbage collection
37 (this is called heap shot and currently implemented only for the
38 sgen garbage collector).
39 Another available profiler mode is the \f[I]sampling\f[] or
40 \f[I]statistical\f[] mode: periodically the program is sampled and
41 the information about what the program was busy with is saved.
42 This allows to get information about the program behaviour without
43 degrading its performance too much (usually less than 10%).
44 .SS Basic profiler usage
45 .PP
46 The simpler way to use the profiler is the following:
47 .PP
48 \f[B]mono\ --profile=log\ program.exe\f[]
49 .PP
50 At the end of the execution the file \f[I]output.mlpd\f[] will be
51 found in the current directory.
52 A summary report of the data can be printed by running:
53 .PP
54 \f[B]mprof-report\ output.mlpd\f[]
55 .PP
56 With this invocation a huge amount of data is collected about the
57 program execution and collecting and saving this data can
58 significantly slow down program execution.
59 If saving the profiling data is not needed, a report can be
60 generated directly with:
61 .PP
62 \f[B]mono\ --profile=log:report\ program.exe\f[]
63 .PP
64 If the information about allocations is not of interest, it can be
65 excluded:
66 .PP
67 \f[B]mono\ --profile=log:noalloc\ program.exe\f[]
68 .PP
69 On the other hand, if method call timing is not important, while
70 allocations are, the needed info can be gathered with:
71 .PP
72 \f[B]mono\ --profile=log:nocalls\ program.exe\f[]
73 .PP
74 You will still be able to inspect information about the sequence of
75 calls that lead to each allocation because at each object
76 allocation a stack trace is collected if full enter/leave
77 information is not available.
78 .PP
79 To periodically collect heap shots (and exclude method and
80 allocation events) use the following options (making sure you run
81 with the sgen garbage collector):
82 .PP
83 \f[B]mono\ --gc=sgen\ --profile=log:heapshot\ program.exe\f[]
84 .PP
85 To perform a sampling profiler run, use the \f[I]sample\f[] option:
86 .PP
87 \f[B]mono\ --profile=log:sample\ program.exe\f[]
88 .SS Profiler option documentation
89 .PP
90 By default the \f[I]log\f[] profiler will gather all the events
91 provided by the Mono runtime and write them to a file named
92 \f[I]output.mlpd\f[].
93 When no option is specified, it is equivalent to using:
94 .PP
95 \f[B]--profile=log:calls,alloc,output=output.mlpd,maxframes=32,calldepth=100\f[]
96 .PP
97 The following options can be used to modify this default behaviour.
98 Each option is separated from the next by a \f[B],\f[] character,
99 with no spaces and all the options are included after the
100 \f[I]log:\f[] profile module specifier.
101 .IP \[bu] 2
102 \f[I]help\f[]: display concise help info about each available
103 option
104 .IP \[bu] 2
105 \f[I][no]alloc\f[]: \f[I]noalloc\f[] disables collecting object
106 allocation info, \f[I]alloc\f[] enables it if it was disabled by
107 another option like \f[I]heapshot\f[].
108 .IP \[bu] 2
109 \f[I][no]calls\f[]: \f[I]nocalls\f[] disables collecting method
110 enter and leave events.
111 When this option is used at each object allocation and at some
112 other events (like lock contentions and exception throws) a stack
113 trace is collected by default.
114 See the \f[I]maxframes\f[] option to control this behaviour.
115 \f[I]calls\f[] enables method enter/leave events if they were
116 disabled by another option like \f[I]heapshot\f[].
117 .IP \[bu] 2
118 \f[I]heapshot[=MODE]\f[]: collect heap shot data at each major
119 collection.
120 The frequency of the heap shots can be changed with the
121 \f[I]MODE\f[] parameter.
122 When this option is used allocation events and method enter/leave
123 events are not recorded by default: if they are needed, they need
124 to be enabled explicitly.
125 The optional parameter \f[I]MODE\f[] can modify the default heap
126 shot frequency.
127 heapshot can be used multiple times with different modes: in that
128 case a heap shot is taken if either of the conditions are met.
129 MODE can be one of:
130 .RS 2
131 .IP \[bu] 2
132 \f[I]NUM\f[]ms: perform a heap shot if at least \f[I]NUM\f[]
133 milliseconds passed since the last one.
134 .IP \[bu] 2
135 \f[I]NUM\f[]gc: perform a heap shot every \f[I]NUM\f[] major
136 garbage collections
137 .IP \[bu] 2
138 \f[I]ondemand\f[]: perform a heap shot when such a command is sent
139 to the control port
140 .RE
141 .IP \[bu] 2
142 \f[I]sample[=FREQ]\f[]: collect statistical samples of the
143 program behaviour.
144 The default is to collect a 100 times per second (100 Hz) the
145 instruction pointer.
146 This is equivalent to the value \[lq]100\[rq].
147 A value of zero for \f[I]FREQ\f[] effectively disables sampling.
148 .IP \[bu] 2
149 \f[I]heapshot-on-shutdown\f[]: collect heap shot data when the runtime
150 shuts down.
151 .IP \[bu] 2
152 \f[I]maxframes=NUM\f[]: when a stack trace needs to be performed,
153 collect \f[I]NUM\f[] frames at the most.
154 The default is 32.
155 .IP \[bu] 2
156 \f[I]maxsamples=NUM\f[]: stop allocating reusable sample events
157 once \f[I]NUM\f[] events have been allocated (a value of zero for
158 all intents and purposes means unlimited). By default, the value
159 of this setting is the number of CPU cores multiplied by 1000. This
160 is usually a good enough value for typical desktop and mobile apps.
161 If you're losing too many samples due to this default (which is
162 possible in apps with an unusually high amount of threads), you
163 may want to tinker with this value to find a good balance between
164 sample hit rate and performance impact on the app. The way it works
165 is that sample events are enqueued for reuse after they're flushed
166 to the output file; if a thread gets a sampling signal but there are
167 no sample events in the reuse queue and the profiler has reached the
168 maximum number of sample allocations, the sample gets dropped. So a
169 higher number for this setting will increase the chance that a
170 thread is able to collect a sample, but also necessarily means that
171 there will be more work done by the profiler. You can run Mono with
172 the \f[I]--stats\f[] option to see statistics about sample events.
173 .IP \[bu] 2
174 \f[I]calldepth=NUM\f[]: ignore method enter/leave events when the
175 call chain depth is bigger than NUM.
176 .IP \[bu] 2
177 \f[I]zip\f[]: automatically compress the output data in gzip
178 format.
179 .IP \[bu] 2
180 \f[I]output=OUTSPEC\f[]: instead of writing the profiling data to
181 the output.mlpd file, substitute \f[I]%p\f[] in \f[I]OUTSPEC\f[]
182 with the current process id and \f[I]%t\f[] with the current date
183 and time, then do according to \f[I]OUTSPEC\f[]:
184 .RS 2
185 .IP \[bu] 2
186 If \f[I]OUTSPEC\f[] begins with a \f[I]|\f[] character, execute the
187 rest as a program and feed the data to its standard input.
188 .IP \[bu] 2
189 If \f[I]OUTSPEC\f[] begins with a \f[I]#\f[] character, parse the
190 rest as a file descriptor number, and feed the data to this file
191 descriptor.
192 .IP \[bu] 2
193 otherwise write the data the the named file: note that is a file by
194 that name already exists, it is truncated.
195 .RE
196 .IP \[bu] 2
197 \f[I]report\f[]: the profiling data is sent to mprof-report, which
198 will print a summary report.
199 This is equivalent to the option: \f[B]output=mprof-report\ -\f[].
200 If the \f[I]output\f[] option is specified as well, the report will
201 be written to the output file instead of the console.
202 .IP \[bu] 2
203 \f[I]port=PORT\f[]: specify the tcp/ip port to use for the
204 listening command server.
205 Currently not available for windows.
206 This server is started for example when heapshot=ondemand is used:
207 it will read commands line by line.
208 The following commands are available:
209 .RS 2
210 .IP \[bu] 2
211 \f[I]heapshot\f[]: perform a heapshot as soon as possible
212 .RE
213 .IP \[bu] 2
214 \f[I]nocounters\f[]: disables sampling of runtime and performance
215 counters, which is normally done every 1 second.
216 .IP \[bu] 2
217 \f[I]coverage\f[]: collect code coverage data. This implies enabling
218 the \f[I]calls\f[] option.
219 .IP \[bu] 2
220 \f[I]onlycoverage\f[]: can only be used with \f[I]coverage\f[]. This
221 disables most other events so that the profiler mostly only collects
222 coverage data.
223 .RE
224 .SS Analyzing the profile data
225 .PP
226 Currently there is a command line program (\f[I]mprof-report\f[])
227 to analyze the data produced by the profiler.
228 This is ran automatically when the \f[I]report\f[] profiler option
229 is used.
230 Simply run:
231 .PP
232 \f[B]mprof-report\ output.mlpd\f[]
233 .PP
234 to see a summary report of the data included in the file.
235 .SS Trace information for events
236 .PP
237 Often it is important for some events, like allocations, lock
238 contention and exception throws to know where they happened.
239 Or we may want to see what sequence of calls leads to a particular
240 method invocation.
241 To see this info invoke mprof-report as follows:
242 .PP
243 \f[B]mprof-report\ --traces\ output.mlpd\f[]
244 .PP
245 The maximum number of methods in each stack trace can be specified
246 with the \f[I]--maxframes=NUM\f[] option:
247 .PP
248 \f[B]mprof-report\ --traces\ --maxframes=4\ output.mlpd\f[]
249 .PP
250 The stack trace info will be available if method enter/leave events
251 have been recorded or if stack trace collection wasn't explicitly
252 disabled with the \f[I]maxframes=0\f[] profiler option.
253 .PP
254 The \f[I]--traces\f[] option also controls the reverse reference
255 feature in the heapshot report: for each class it reports how many
256 references to objects of that class come from other classes.
257 .SS Sort order for methods and allocations
258 .PP
259 When a list of methods is printed the default sort order is based
260 on the total time spent in the method.
261 This time is wall clock time (that is, it includes the time spent,
262 for example, in a sleep call, even if actual cpu time would be
263 basically 0).
264 Also, if the method has been ran on different threads, the time
265 will be a sum of the time used in each thread.
266 .PP
267 To change the sort order, use the option:
268 .PP
269 \f[B]--method-sort=MODE\f[]
270 .PP
271 where \f[I]MODE\f[] can be:
272 .IP \[bu] 2
273 \f[I]self\f[]: amount of time spent in the method itself and not in
274 its callees
275 .IP \[bu] 2
276 \f[I]calls\f[]: the number of method invocations
277 .IP \[bu] 2
278 \f[I]total\f[]: the total time spent in the method.
279 .PP
280 Object allocation lists are sorted by default depending on the
281 total amount of bytes used by each type.
282 .PP
283 To change the sort order of object allocations, use the option:
284 .PP
285 \f[B]--alloc-sort=MODE\f[]
286 .PP
287 where \f[I]MODE\f[] can be:
288 .IP \[bu] 2
289 \f[I]count\f[]: the number of allocated objects of the given type
290 .IP \[bu] 2
291 \f[I]bytes\f[]: the total number of bytes used by objects of the
292 given type
293 .PP
294 To change the sort order of counters, use the option:
295 .PP
296 \f[B]--counters-sort=MODE\f[]
297 .PP
298 where \f[I]MODE\f[] can be:
299 .IP \[bu] 2
300 \f[I]time\f[]: sort values by time then category
301 .IP \[bu] 2
302 \f[I]category\f[]: sort values by category then time
303 .SS Selecting what data to report
304 .PP
305 The profiler by default collects data about many runtime subsystems
306 and mprof-report prints a summary of all the subsystems that are
307 found in the data file.
308 It is possible to tell mprof-report to only show information about
309 some of them with the following option:
310 .PP
311 \f[B]--reports=R1[,R2...]\f[]
312 .PP
313 where the report names R1, R2 etc.
314 can be:
315 .IP \[bu] 2
316 \f[I]header\f[]: information about program startup and profiler
317 version
318 .IP \[bu] 2
319 \f[I]jit\f[]: JIT compiler information
320 .IP \[bu] 2
321 \f[I]sample\f[]: statistical sampling information
322 .IP \[bu] 2
323 \f[I]gc\f[]: garbage collection information
324 .IP \[bu] 2
325 \f[I]alloc\f[]: object allocation information
326 .IP \[bu] 2
327 \f[I]call\f[]: method profiling information
328 .IP \[bu] 2
329 \f[I]metadata\f[]: metadata events like image loads
330 .IP \[bu] 2
331 \f[I]exception\f[]: exception throw and handling information
332 .IP \[bu] 2
333 \f[I]monitor\f[]: lock contention information
334 .IP \[bu] 2
335 \f[I]thread\f[]: thread information
336 .IP \[bu] 2
337 \f[I]domain\f[]: app domain information
338 .IP \[bu] 2
339 \f[I]context\f[]: remoting context information
340 .IP \[bu] 2
341 \f[I]heapshot\f[]: live heap usage at heap shots
342 .IP \[bu] 2
343 \f[I]counters\f[]: counters samples
344 .IP \[bu] 2
345 \f[I]coverage\f[]: code coverage data
346 .IP \[bu] 2
347 \f[I]stats\f[]: event statistics
348 .PP
349 It is possible to limit some of the data displayed to a timeframe
350 of the program execution with the option:
351 .PP
352 \f[B]--time=FROM-TO\f[]
353 .PP
354 where \f[I]FROM\f[] and \f[I]TO\f[] are seconds since application
355 startup (they can be floating point numbers).
356 .PP
357 Another interesting option is to consider only events happening on
358 a particular thread with the following option:
359 .PP
360 \f[B]--thread=THREADID\f[]
361 .PP
362 where \f[I]THREADID\f[] is one of the numbers listed in the thread
363 summary report (or a thread name when present).
364 .PP
365 By default long lists of methods or other information like object
366 allocations are limited to the most important data.
367 To increase the amount of information printed you can use the
368 option:
369 .PP
370 \f[B]--verbose\f[]
371 .SS Track individual objects
372 .PP
373 Instead of printing the usual reports from the profiler data, it is
374 possible to track some interesting information about some specific
375 object addresses.
376 The objects are selected based on their address with the
377 \f[I]--track\f[] option as follows:
378 .PP
379 \f[B]--track=0xaddr1[,0xaddr2,...]\f[]
380 .PP
381 The reported info (if available in the data file), will be class
382 name, size, creation time, stack trace of creation (with the
383 \f[I]--traces\f[] option), etc.
384 If heapshot data is available it will be possible to also track
385 what other objects reference one of the listed addresses.
386 .PP
387 The object addresses can be gathered either from the profiler
388 report in some cases (like in the monitor lock report), from the
389 live application or they can be selected with the
390 \f[I]--find=FINDSPEC\f[] option.
391 FINDSPEC can be one of the following:
392 .IP \[bu] 2
393 \f[I]S:SIZE\f[]: where the object is selected if its size is at
394 least \f[I]SIZE\f[]
395 .IP \[bu] 2
396 \f[I]T:NAME\f[]: where the object is selected if \f[I]NAME\f[]
397 partially matches its class name
398 .PP
399 This option can be specified multiple times with one of the
400 different kinds of FINDSPEC.
401 For example, the following:
402 .PP
403 \f[B]--find=S:10000\ --find=T:Byte[]\f[]
404 .PP
405 will find all the byte arrays that are at least 10000 bytes in
406 size.
407 .PP
408 Note that with a moving garbage collector the object address can
409 change, so you may need to track the changed address manually.
410 It can also happen that multiple objects are allocated at the same
411 address, so the output from this option can become large.
412 .SS Saving a profiler report
413 .PP
414 By default mprof-report will print the summary data to the console.
415 To print it to a file, instead, use the option:
416 .PP
417 \f[B]--out=FILENAME\f[]
418 .SS Processing code coverage data
419 .PP
420 If you ran the profiler with the \f[I]coverage\f[] option, you can
421 process the collected coverage data into an XML file by running
422 mprof-report like this:
423 .PP
424 \f[B]mprof-report --coverage-out=coverage.xml output.mlpd\f[]
425 .SS Dealing with profiler slowness
426 .PP
427 If the profiler needs to collect lots of data, the execution of the
428 program will slow down significantly, usually 10 to 20 times
429 slower.
430 There are several ways to reduce the impact of the profiler on the
431 program execution.
432 .IP "\f[I]Use the statistical sampling mode\f[]" 4
433 .Sp
434 Statistical sampling allows executing a program under the profiler
435 with minimal performance overhead (usually less than 10%).
436 This mode allows checking where the program is spending most of
437 its execution time without significantly perturbing its behaviour.
438 .IP "\f[I]Collect less data\f[]" 4
439 .Sp
440 Collecting method enter/leave events can be very expensive,
441 especially in programs that perform many millions of tiny calls.
442 The profiler option \f[I]nocalls\f[] can be used to avoid
443 collecting this data or it can be limited to only a few call levels
444 with the \f[I]calldepth\f[] option.
445 .Sp
446 Object allocation information is expensive as well, though much
447 less than method enter/leave events.
448 If it's not needed, it can be skipped with the \f[I]noalloc\f[]
449 profiler option.
450 Note that when method enter/leave events are discarded, by default
451 stack traces are collected at each allocation and this can be
452 expensive as well.
453 The impact of stack trace information can be reduced by setting a
454 low value with the \f[I]maxframes\f[] option or by eliminating them
455 completely, by setting it to 0.
456 .Sp
457 The other major source of data is the \f[I]heapshot\f[] profiler
458 option: especially if the managed heap is big, since every object
459 needs to be inspected.
460 The \f[I]MODE\f[] parameter of the \f[I]heapshot\f[] option can be
461 used to reduce the frequency of the heap shots.
462 .SS Dealing with the size of the data files
463 .PP
464 When collecting a lot of information about a profiled program, huge
465 data files can be generated.
466 There are a few ways to minimize the amount of data, for example by
467 not collecting some of the more space-consuming information or by
468 compressing the information on the fly or by just generating a
469 summary report.
470 .IP "\f[I]Reducing the amount of data\f[]" 4
471 .Sp
472 Method enter/leave events can be excluded completely with the
473 \f[I]nocalls\f[] option or they can be limited to just a few levels
474 of calls with the \f[I]calldepth\f[] option.
475 For example, the option:
476 .Sp
477 \f[B]calldepth=10\f[]
478 .Sp
479 will ignore the method events when there are more than 10 managed
480 stack frames.
481 This is very useful for programs that have deep recursion or for
482 programs that perform many millions of tiny calls deep enough in
483 the call stack.
484 The optimal number for the calldepth option depends on the program
485 and it needs to be balanced between providing enough profiling
486 information and allowing fast execution speed.
487 .Sp
488 Note that by default, if method events are not recorded at all, the
489 profiler will collect stack trace information at events like
490 allocations.
491 To avoid gathering this data, use the \f[I]maxframes=0\f[] profiler
492 option.
493 .Sp
494 Allocation events can be eliminated with the \f[I]noalloc\f[]
495 option.
496 .Sp
497 Heap shot data can also be huge: by default it is collected at each
498 major collection.
499 To reduce the frequency, you can specify a heapshot mode: for
500 example to collect every 5 collections (including major and minor):
501 .Sp
502 \f[B]heapshot=5gc\f[]
503 .Sp
504 or when at least 5 seconds passed since the last heap shot:
505 .Sp
506 \f[B]heapshot=5000ms\f[]
507 .IP "\f[I]Compressing the data\f[]" 4
508 .Sp
509 To reduce the amout of disk space used by the data, the data can be
510 compressed either after it has been generated with the gzip
511 command:
512 .Sp
513 \f[B]gzip\ -9\ output.mlpd\f[]
514 .Sp
515 or it can be compressed automatically by using the \f[I]zip\f[]
516 profiler option.
517 Note that in this case there could be a significant slowdown of the
518 profiled program.
519 .Sp
520 The mprof-report program will tranparently deal with either
521 compressed or uncompressed data files.
522 .IP "\f[I]Generating only a summary report\f[]" 4
523 .Sp
524 Often it's enough to look at the profiler summary report to
525 diagnose an issue and in this case it's possible to avoid saving
526 the profiler data file to disk.
527 This can be accomplished with the \f[I]report\f[] profiler option,
528 which will basically send the data to the mprof-report program for
529 display.
530 .Sp
531 To have more control of what summary information is reported (or to
532 use a completely different program to decode the profiler data),
533 the \f[I]output\f[] profiler option can be used, with \f[B]|\f[] as
534 the first character: the rest of the output name will be executed
535 as a program with the data fed in on the standard input.
536 .Sp
537 For example, to print only the Monitor summary with stack trace
538 information, you could use it like this:
539 .Sp
540 \f[B]output=|mprof-report\ --reports=monitor\ --traces\ -\f[]
541 .SH WEB SITE
542 http://www.mono-project.com/docs/debug+profile/profile/profiler/
543 .SH SEE ALSO
544 .PP
545 mono(1)
546 .SH AUTHORS
547 Paolo Molaro, Alex Rønne Petersen