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调用,如果要限制子进程的资源的话应该怎么办?

阅读 15.7k
2 个回答

要统计内存,可以使用 runtime.MemProfile

go 完全不使用 stack,所有内存都在堆上分配,有可能你 Setrlimit 是因为这个原因不工作,不过我不太确定。

prlimit 也许是因为无法跨平台才没有的吧,你如果需要自己用 cgo 写一个,go 和 c 语言集成极度的方便,你可以看看文档自己写一下。

如果想限制程序资源用,将程序运行在docker容器中,通过限制容器的资源使用应该更简单些吧.
具体见:
https://docs.docker.com/confi...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题