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

操作系统 go 系统调用 linux-kernel unix

青春散落一地 9 years, 10 months ago

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

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

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

寒冰射手琪露诺 answered 9 years, 10 months ago

Your Answer