I went ahead and optimistically filed https://github.com/golang/go/issues/24142.
On Mon, Feb 26, 2018 at 2:35 PM, Caleb Spare <cesp...@gmail.com> wrote: > I think that CL that would have helped me realize it was (probably) > time.Now sooner. It certainly seems like a Pareto improvement. > > However: > > (1) I don't think that most Go developers know what _VDSO is any more than > they know what _ExternalCode is, so it probably won't substantially help > most pprof users. (Perhaps some Googling will lead to this conversation, > though.) > (2) The thing that makes this unhelpful is that fact that _ExternalCode or > _VDSO is disconnected from the Go stack that called it. If I have a program > that, say, has a bunch of CPU overhead from calling os.Stat a bunch, then > it should be clear from the profile where the call is coming from even if > the big red box is just labeled syscall.Syscall. > > I was about to file a bug asking for pprof to somehow understand that a > particular VDSO call is connected to a particular time.Now call. Is that > even possible/feasible? > > On Mon, Feb 26, 2018 at 2:05 PM, Ian Lance Taylor <i...@golang.org> wrote: > >> On Mon, Feb 26, 2018 at 12:55 PM, Ian Lance Taylor <i...@golang.org> >> wrote: >> >>> On Sun, Feb 25, 2018 at 8:04 PM, Dave Cheney <d...@cheney.net> wrote: >>> >>>> I don't understand how that could happen. time.Now calls time.now >>>> (which is in assembly) so the former shouldn't be inlined, or omitted from >>>> profiling. >>>> >>> >>> >>> But on amd64 GNU/Linux time.Now is implemented by calling into the >>> VDSO. And it's true that if the profiling signal occurs while executing in >>> the VDSO then the profiler will not be able to map the PC to any Go >>> function, so the traceback will fail, and the profiler will indeed report >>> _System calling _ExternalCode. Well spotted. >>> >> >> >> Caleb: what do you think of https://golang.org/cl/97315? Would that >> have helped with your original problem? >> >> Ian >> >> >> >> >>> >>> >>> >>>> >>>> On Monday, 26 February 2018 14:02:13 UTC+11, Caleb Spare wrote: >>>>> >>>>> On a hunch, I profiled a benchmark which just calls time.Now in a >>>>> loop. Indeed: 95% of the time is attributed to runtime._System -> >>>>> runtime._ExternalCode. >>>>> >>>>> My program does collect a lot of timing information as it runs and >>>>> ends up calling time.Now quite a lot. I don't yet know for sure that >>>>> most/all of the runtime._ExternalCode that shows up in my program's >>>>> profile >>>>> is time.Now, but that wouldn't surprise me. >>>>> >>>>> This makes me curious: would it be feasible to make the profiler >>>>> recognize a vDSO call and synthesize a more helpful stack? >>>>> >>>>> On Sun, Feb 25, 2018 at 3:39 PM, Ian Lance Taylor <ia...@golang.org> >>>>> wrote: >>>>> >>>>>> On Sun, Feb 25, 2018 at 3:30 PM, Caleb Spare <ces...@gmail.com> >>>>>> wrote: >>>>>> >>>>>>> There's no cgo in this program or any of its non-stdlib dependencies. >>>>>>> >>>>>>> The server is a static binary built with CGO_ENABLED=0. Can there >>>>>>> still be cgo code running somehow? >>>>>>> >>>>>> >>>>>> No, if it's CGO_ENABLED=0, then I think cgo code can not be the >>>>>> problem. >>>>>> >>>>>> But I also can't think of any other plausible reason to have so many >>>>>> hits for this case. It can happen if the profiling signal is received >>>>>> while executing in `gogo`, `systemstack`, `mcall`, or `morestack`. But >>>>>> none of those occur all that often and they run for a short time. It's >>>>>> hard to believe that they would show up when profiling a real program. I >>>>>> don't know what is happening here. >>>>>> >>>>>> The code path you are seeing is the `n == 0` case in `sigprof` in >>>>>> runtime/proc.go. >>>>>> >>>>>> Ian >>>>>> >>>>>> >>>>>> >>>>>> >>>>>>> On Sun, Feb 25, 2018 at 3:05 PM, Ian Lance Taylor <ia...@golang.org> >>>>>>> wrote: >>>>>>> >>>>>>>> On Sun, Feb 25, 2018 at 2:01 PM, Caleb Spare <ces...@gmail.com> >>>>>>>> wrote: >>>>>>>> >>>>>>>>> How should I interpret runtime._System calling into >>>>>>>>> runtime._ExternalCode in a pprof profile? >>>>>>>>> >>>>>>>>> I saw this taking >10% of CPU time, so I recompiled with >>>>>>>>> CGO_ENABLED=0 and even so I see 6.62% of time in >>>>>>>>> runtime._ExternalCode. >>>>>>>>> >>>>>>>>> runtime._System is a root in the graph so I can't even figure out >>>>>>>>> what part of my code this might be related to. >>>>>>>>> >>>>>>>>> [image: Inline image 1] >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> This is what you see when a profililng signal occurs while >>>>>>>> executing code for which the Go runtime could not generate a >>>>>>>> traceback, and >>>>>>>> the thread was not running the garbage collector. The most common >>>>>>>> reason >>>>>>>> for being unable to get a traceback is running in cgo code. >>>>>>>> >>>>>>>> If you are running on an ELF based system like GNU/Linux then >>>>>>>> consider, for testing purposes only, importing >>>>>>>> github.com/ianlancetaylor/cgosymbolizer. No need to actually use >>>>>>>> the package for anything, just do a blank import somewhere. If you're >>>>>>>> lucky that will give you a more detailed profile. >>>>>>>> >>>>>>>> Ian >>>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>> -- >>>> 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. >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> >> -- >> 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. >> For more options, visit https://groups.google.com/d/optout. >> > > -- 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. For more options, visit https://groups.google.com/d/optout.