我试图检查 Go 在 100,000 个 goroutine 上的表现如何。我编写了一个简单的程序来生成许多例程,除了打印一些公告之外什么也不做。我将 MaxStack 大小限制为仅 512 字节。但我注意到程序大小并没有随之减小。它消耗了大约 460 MB 的内存,因此每个 goroutine 大约消耗 4 KB 的内存。我的问题是,我们能否将 goroutine 的最大堆栈大小设置为低于“最小”堆栈大小(可能是 4 KB)。我们如何设置 Goroutine 启动时的最小堆栈大小?
以下是我用于测试的示例代码:
package main
import "fmt"
import "time"
import "runtime/debug"
func main() {
fmt.Printf("%v\n", debug.SetMaxStack(512))
var i int
for i = 0; i < 100000; i++ {
go func(x int) {
for {
time.Sleep(10 * time.Millisecond)
//fmt.Printf("I am %v\n", x)
}
}(i)
}
fmt.Println("Done")
time.Sleep(999999999999)
}
目前无法设置 goroutine 的最小堆栈大小。
Go 1.2 将最小大小从 4KB 增加到 8KB
The docs http://golang.org/doc/go1.2#stack_size say:
“在 Go 1.2 中,创建 Goroutine 时堆栈的最小大小已从 4KB 提升到 8KB。许多程序都遇到旧大小的性能问题,这往往会在性能关键的情况下引入昂贵的堆栈段切换新的数字是通过经验测试确定的。”
但他们接着说:
“更新:增加的最小堆栈大小可能会导致具有许多 goroutine 的程序使用更多内存。没有解决方法,但未来版本的计划包括新的堆栈管理技术,应该可以更好地解决该问题。”
所以你将来可能会有更多的运气。
See http://golang.org/doc/go1.2#stack_size http://golang.org/doc/go1.2#stack_size了解更多信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)