mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: don't always adjust timers
Some programs have a lot of timers that they adjust both forward and backward in time. This can cause a large number of timerModifiedEarlier timers. In practice these timers are used for I/O deadlines and are rarely reached. The effect is that the runtime spends a lot of time in adjusttimers making sure that there are no timerModifiedEarlier timers, but the effort is wasted because none of the adjusted timers are near the top of the timer heap anyhow. Avoid much of this extra work by keeping track of the earliest known timerModifiedEarlier timer. This lets us skip adjusttimers if we know that none of the timers will be ready to run anyhow. We will still eventually run it, when we reach the deadline of the earliest known timerModifiedEarlier, although in practice that timer has likely been removed. When we do run adjusttimers, we will reset all of the timerModifiedEarlier timers, and clear our notion of when we need to run adjusttimers again. This effect should be to significantly reduce the number of times we walk through the timer list in adjusttimers. Fixes #41699 Change-Id: I38eb2be611fb34e3017bb33d0a9ed40d75fb414f Reviewed-on: https://go-review.googlesource.com/c/go/+/258303 Trust: Ian Lance Taylor <iant@golang.org> Trust: Emmanuel Odeke <emmanuel@orijtech.com> Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Michael Knyszek <mknyszek@google.com>
This commit is contained in:
parent
091257def9
commit
b4b0144652
3 changed files with 88 additions and 70 deletions
|
|
@ -646,6 +646,13 @@ type p struct {
|
|||
// This is 0 if the timer heap is empty.
|
||||
timer0When uint64
|
||||
|
||||
// The earliest known nextwhen field of a timer with
|
||||
// timerModifiedEarlier status. Because the timer may have been
|
||||
// modified again, there need not be any timer with this value.
|
||||
// This is updated using atomic functions.
|
||||
// This is 0 if the value is unknown.
|
||||
timerModifiedEarliest uint64
|
||||
|
||||
// Per-P GC state
|
||||
gcAssistTime int64 // Nanoseconds in assistAlloc
|
||||
gcFractionalMarkTime int64 // Nanoseconds in fractional mark worker (atomic)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue