I'm a bit wondering about how the following case will be affected by the change:1. Initially, there is one goroutine, which stack size is large at the time of a GC process.2. After the GC process, a large quantity of goroutines start. They all need small stacks.But now the runtime will allocate a very large stack for each of them.Then is much memory wasted? Will the stacks of the new goroutines shrink at the next GC process?
I can't help but wonder why, if you care so much about this type of issue, you did not make any attempt to answer your own question? Why not assume the Go team is competent (thus handling your scenario in a reasonable, if not optimal, fashion) unless you have evidence to the contrary? Why didn't you take a few minutes to write a Go program to test your own hypothesis? Questions are great unless you make no attempt to answer your own question.
On Saturday, August 13, 2022 at 10:00:58 PM UTC+8 lia...@garena.com wrote:Hi masters,As far as I know, go 1.19 supports self-adaptive stack size when spawning a goroutine, which intends to decrease the calling times of morestack that aims to claim more frames from heap.After each GC happens, Go runtime will calculate the average stack usage and the next time, goroutine would created with such a stack size.My question is, how do we validate the whole process or check it if works well or not.Is there any metric or stack size checking function, or should I use pprof to peek the alloc part ?Kindly thanks for all```func main() {
go func() {
// spawn a goroutine started from a fixed stack size
}()
runtime.GC()
go func() {
// spawn a goroutine started from an avg stack size.
}()
}```
--
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...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/e922b755-8205-462b-91ed-b9391b6fa2b2n%40googlegroups.com.
--Kurtis RaderCaretaker of the exceptional canines Junior and Hank
I'm a bit wondering about how the following case will be affected by the change:1. Initially, there is one goroutine, which stack size is large at the time of a GC process.2. After the GC process, a large quantity of goroutines start. They all need small stacks.But now the runtime will allocate a very large stack for each of them.Then is much memory wasted?
Will the stacks of the new goroutines shrink at the next GC process?
On Wednesday, August 17, 2022 at 8:18:35 PM UTC-7 tapi...@gmail.com wrote:I'm a bit wondering about how the following case will be affected by the change:1. Initially, there is one goroutine, which stack size is large at the time of a GC process.2. After the GC process, a large quantity of goroutines start. They all need small stacks.But now the runtime will allocate a very large stack for each of them.Then is much memory wasted?Kind of. Your description is correct, the runtime will allocate larger stacks for each of the new goroutines. But it doesn't really waste memory, it just causes the program to reach the next GC earlier. At that GC, stacks will shrink, as will the start size for subsequent goroutines. So it won't really waste memory, but waste some CPU for a possibly extra GC.It isn't perfect; for instance we only shrink stacks 2x at each GC, so if the starting size is way too large it might take a couple GCs to shrink sufficiently.
On Friday, August 19, 2022 at 12:14:55 AM UTC+8 k...@google.com wrote:On Wednesday, August 17, 2022 at 8:18:35 PM UTC-7 tapi...@gmail.com wrote:I'm a bit wondering about how the following case will be affected by the change:1. Initially, there is one goroutine, which stack size is large at the time of a GC process.2. After the GC process, a large quantity of goroutines start. They all need small stacks.But now the runtime will allocate a very large stack for each of them.Then is much memory wasted?Kind of. Your description is correct, the runtime will allocate larger stacks for each of the new goroutines. But it doesn't really waste memory, it just causes the program to reach the next GC earlier. At that GC, stacks will shrink, as will the start size for subsequent goroutines. So it won't really waste memory, but waste some CPU for a possibly extra GC.It isn't perfect; for instance we only shrink stacks 2x at each GC, so if the starting size is way too large it might take a couple GCs to shrink sufficiently.I wrote a program to make some tests: https://go.dev/play/p/oDYrAsZz_3iIt looks the new GC pacer doesn't count new stack memory as new allocated heap memory.So large new stacks will not make the program to reach the next GC earlier.Since Go 1.18, the stack sizes (the real sizes, not the 2^n sizes) and global pointers contribute in calculating target heap memory:https://go.dev/doc/gc-guide#GOGC, so that large stack sizes will cause large GC intervals.