Or… Call runtime.Gosched(). I seem to recall benchmarking it a while back and found that it was very efficient.
John John Souvestre - New Orleans LA From: golang-nuts@googlegroups.com [mailto:golang-nuts@googlegroups.com] On Behalf Of Jesper Louis Andersen Sent: 2017 February 23, Thu 16:18 To: Austin Clements; Oliver Beattie Cc: golang-nuts Subject: Re: [go-nuts] Debugging long GC pauses What would happen if you inserted a dummy function call inside the non-preemptible loop and made an appropriate sacrifice on the altar of the SSA dead-code-eliminator so it doesn't trigger? On Thu, Feb 23, 2017 at 8:46 PM 'Austin Clements' via golang-nuts <golang-nuts@googlegroups.com> wrote: AFAIK, the only thing that can cause this in Go 1.8 is a non-preemptible loop. It's not related to the heap size at all. To test this theory, you can set GOEXPERIMENT=preemptibleloops and rebuild your Go tree (the compiler has to be built with this, so you can't just turn it on to build your project). I wouldn't recommend running in production with this, but if it eliminates the long pauses, we'll at least know that's the culprit. Since these are quite long, the other thing you can do is run with the execution tracer (https://godoc.org/runtime/trace). You'll be able to see exactly what's happening at the beginning of each GC cycle. If you do have non-preemptible loops, you should also see goroutines executing for much longer than 10ms at a time, which is the default preemption bound. On Thu, Feb 23, 2017 at 1:46 PM, Oliver Beattie <oli...@obeattie.com> wrote: I am looking for some advice about how I can debug some long GC pauses I am observing in our production workloads under go 1.8 (the problem is not specific to 1.8, though). This is a very simple network server – basically a HTTP ping endpoint – but I regularly see tail request latencies of >100ms. I have enabled GODEBUG=gctrace=1, and I can see some quite long STW pauses amid lots of much less worrying pauses: gc 54 @348.007s 0%: 0.061+81+0.040 ms clock, 0.12+0.39/81/81+0.081 ms cpu, 4->4->1 MB, 5 MB goal, 2 P gc 55 @358.007s 0%: 0.21+83+0.019 ms clock, 0.43+80/2.7/81+0.039 ms cpu, 4->4->1 MB, 5 MB goal, 2 P gc 56 @367.507s 0%: 80+1.3+0.065 ms clock, 161+0.080/1.2/82+0.13 ms cpu, 4->4->1 MB, 5 MB goal, 2 P gc 57 @377.726s 0%: 0.054+63+0.023 ms clock, 0.10+0.68/61/0.44+0.046 ms cpu, 4->4->1 MB, 5 MB goal, 2 P gc 58 @388.007s 0%: 0.033+81+0.036 ms clock, 0.067+0.32/80/81+0.072 ms cpu, 4->4->1 MB, 5 MB goal, 2 P gc 59 @398.007s 0%: 0.021+82+0.019 ms clock, 0.043+0.17/80/82+0.038 ms cpu, 4->4->1 MB, 5 MB goal, 2 P gc 60 @407.630s 0%: 0.012+57+0.031 ms clock, 0.025+0.25/0.64/57+0.063 ms cpu, 4->4->1 MB, 5 MB goal, 2 P gc 61 @418.007s 0%: 0.19+1.0+79 ms clock, 0.38+0.28/0.69/0.98+159 ms cpu, 4->4->1 MB, 5 MB goal, 2 P gc 62 @427.507s 0%: 0.21+81+0.29 ms clock, 0.42+81/0.96/81+0.58 ms cpu, 4->4->1 MB, 5 MB goal, 2 P gc 63 @437.507s 0%: 0.015+81+0.053 ms clock, 0.031+0.29/0.98/80+0.10 ms cpu, 4->4->1 MB, 5 MB goal, 2 P gc 64 @443.507s 0%: 81+1.2+0.032 ms clock, 162+0.040/1.2/0.44+0.065 ms cpu, 4->4->1 MB, 5 MB goal, 2 P scvg2: inuse: 4, idle: 2, sys: 7, released: 0, consumed: 7 (MB) gc 65 @453.507s 0%: 0.13+81+0.051 ms clock, 0.26+0.20/81/82+0.10 ms cpu, 4->4->1 MB, 5 MB goal, 2 P If I am reading this correctly, some of these STW pauses are 80+ milliseconds, in order to scan a minuscule heap. I am not experienced with debugging the GC in Go, so I'd appreciate any pointers as to why this could happening and what I can do to get to the bottom of the behaviour. Many thanks :) -- 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. -- 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.