create a runtime CPU profile but to restrict the profile to a specific part
of the program.  runtime/pprof - pausing CPU profiling

To create a runtime CPU profile for a specific part of a Go program, you
can use the `runtime/pprof` package. Here's how you can do it:

1. **Import the Package**: Add `import "runtime/pprof"` to your Go file.

2. **Start Profiling**: Use `pprof.StartCPUProfile(file)` to start
profiling, where `file` is an `os.File` object to write the profile data.

3. **Restrict Profiling**: Place `pprof.StartCPUProfile()` before the code
section you want to profile and `pprof.StopCPUProfile()` immediately after
that section.

4. **Stop Profiling**: Ensure you call `defer pprof.StopCPUProfile()` to
stop profiling and flush data when the function exits[2][3][4].

Citations:
[1] Gperftools CPU Profiler
https://gperftools.github.io/gperftools/cpuprofile.html
[2] Unlocking Performance Insights: CPU Profiling in Go
https://www.codingexplorations.com/blog/unlocking-performance-insights-cpu-profiling-in-go
[3] Profiling Go Programs https://go.dev/blog/pprof
[4] runtime/pprof - Go Packages https://pkg.go.dev/runtime/pprof
[5] Runtime profiling - HPC Wiki https://hpc-wiki.info/hpc/Runtime_profiling
[6] CPU Profiler — go-profiler-notes documentation - Datadog has moved
https://datadoghq.dev/go-profiler-notes/profiling/cpu-profiler.html
[7] Profiling Go programs with pprof - Julia Evans
https://jvns.ca/blog/2017/09/24/profiling-go-with-pprof/
[8] CPU profiling in the Performance Profiler - Visual Studio (Windows)
https://learn.microsoft.com/en-us/visualstudio/profiling/cpu-usage?WT.mc_id=studentamb_228125&view=vs-2022

On Tue, Nov 12, 2024, 6:07 PM Jason E. Aten <j.e.a...@gmail.com> wrote:

> Idea 0: Can you just click on the graphviz boxes in the pprof http page
> for your section and then just show the source for only those?
> Might give you a quick idea of which are the hottest spots only
> among those func of interest.
>
> Idea 1: Can you write a test or benchmark that just exercises the
> important section?
>
> I suspect you could then run the profiler on your benchmark/test.
> If not, it might be worth refactoring your code to allow this.
> Otherwise you could write an alternative "main" as a harness that just
> calls
> the important section.
>
> Idea 2: referring to the StartCPUProfile docs:
> > On Unix-like systems, StartCPUProfile does not work by default for Go
> code built
> > with -buildmode=c-archive or -buildmode=c-shared. StartCPUProfile relies
> on the
> > SIGPROF signal, but that signal will be delivered to the main program's
> SIGPROF
> > signal handler (if any) not to the one used by Go. To make it work, call
> os/signal.Notify
> > for syscall.SIGPROF, but note that doing so may break any profiling
> being done by the main program.
>
> This makes it sounds like the SIGPROF signal is used to do the sampling. So
> you might be able to manipulate it (e.g. ignore it when not in your code).
> Seems like
> a hack, but might be worth experimenting with.
>
> Idea 3: post processing. You could probably take apart the profile log
> after it is
> recorded and discard the samples that are irrelevant.
>
> Idea 4: simple manual timing. Insert time.Now() and time.Since() calls at
> strategic points, and measure the improvement as you tweak your code.
>
> On Tuesday, November 12, 2024 at 11:16:56 AM UTC Stephen Illingworth wrote:
>
>> Hello,
>>
>> I want to create a runtime CPU profile but to restrict the profile to a
>> specific part of the program. I currently have a way of taking a CPU
>> profile for the entire program so have experience with the runtime/pprof
>> package but this is a new requirement for me.
>>
>> The 'section' to be profiled represents a significant amount of code and
>> I'm looking to see if any particular part of that section can be improved.
>> The problem I have is that the program outside of that section is
>> significantly larger (ie. larger CPU load) and dominates the profile data.
>>
>> The section to be profiled is entered and exited 60 times per second (at
>> a minimum).
>>
>> In effect, I want to pause the CPU profile when execution exits the
>> section and to resume when the profile enters it again. Stopping and
>> restarting the profile is too slow.
>>
>> But maybe there's a completely different way to do this. Does anyone have
>> experience with this type of thing?
>>
>> Regards
>> Stephen
>>
> --
> You received this message because you are subscribed to the Google Groups
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to golang-nuts+unsubscr...@googlegroups.com.
> To view this discussion visit
> https://groups.google.com/d/msgid/golang-nuts/c6c0833e-a1d0-4132-87cf-c03b7f6a0ab6n%40googlegroups.com
> <https://groups.google.com/d/msgid/golang-nuts/c6c0833e-a1d0-4132-87cf-c03b7f6a0ab6n%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/golang-nuts/CAKhpSosxOKFB9aNyAdUdv5_y0w5upsn9QmmGuGFffoqGcT_8nQ%40mail.gmail.com.

Reply via email to