A somewhat common culprit seems to be the following case: 1. In order for the GC to switch from marking to sweeping, it needs all cores to agree. This requires a "barrier" in the system and thus we have to wait on all CPUs. 2. The barrier check happens on a function call. 3. A CPU core is currently executing a long-running operation inside a function, but is never calling another function in doing so. Usually there is a loop involved. 4. The system is now practically stalled.
There may be other reasons, but the above scheme is somewhat common. A workaround is to make sure you break long-running loops every N iterations and coerce the system to consider a garbage collection by returning from a function, say. Work is being done to automate this test so low latency can be achieved automatically without you having to intervene[0] To check for this assumption, set GODEBUG=gctrace=1 and look at the pauses of the different phases. It should tell you if this is the culprit or not. It could easily be something else, for instance pressure on the GC itself due to heavy allocation. [0] This will come at a slight cost to throughput, but it is probably a valid trade-off to make in a modern world of highly parallelized systems. On Thu, Apr 20, 2017 at 3:49 PM Lee Armstrong <lesm...@gmail.com> wrote: > See attached graph which shows the GC pauses of an application we have. > > I am frequently seeing pauses of 1-1.5 seconds. This is using Go 1.8.1 and > have a large map that is frequently accessed and items are removed and > added to it. These can be of some size. > > Is there a way to get these pauses down at all? Would forcing a GC() > after removing a batch of elements help at all? > > Alongside the pauses I see some substantial CPU usage showing up in traces > for the GC scan. > > Thanks in advance! > > -- > 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.