golang 如何限制内存
package main
import (
"fmt"
"syscall"
)
func f(i int) int {
if i < 10000 {
i++
fmt.Println(i)
a := make([]byte, 100)
a = append(a, byte(1))
b := f(i)
return b
} else {
return i
}
}
func main() {
var rlimit syscall.Rlimit
rlimit.Cur = 1
rlimit.Max = 2
//syscall.Setrlimit(syscall.RLIMIT_CPU, &rlimit)
rlimit.Cur = 100 //以字节为单位
rlimit.Max = rlimit.Cur + 1024
err := syscall.Setrlimit(syscall.RLIMIT_STACK, &rlimit)
if err != nil {
panic(err)
}
f(0)
/*
for i := 0; i < 1000000; i++ {
for j := 0; j < 100000; j++ {
for q := 0; q < 1000; q++ {
a = append(a, []byte{1, 2, 3}...)
}
}
}
*/
}
我想要用rlimit系统调用限制进程的资源.
如果去掉注释,可以限制时间,但是不知道为什么限制不了内存.
go的内存似乎是在堆上分配的,怎样统计比较合适呢?
另外:golang下面没有ptrlimit调用,如果要限制子进程的资源的话应该怎么办?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
要统计内存,可以使用 runtime.MemProfile。
go 完全不使用 stack,所有内存都在堆上分配,有可能你
Setrlimit
是因为这个原因不工作,不过我不太确定。prlimit
也许是因为无法跨平台才没有的吧,你如果需要自己用 cgo 写一个,go 和 c 语言集成极度的方便,你可以看看文档自己写一下。如果想限制程序资源用,将程序运行在docker容器中,通过限制容器的资源使用应该更简单些吧.
具体见:
https://docs.docker.com/confi...