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
青春散落一地
10 years, 4 months ago
Answers
要统计内存,可以使用 runtime.MemProfile 。
go 完全不使用 stack,所有内存都在堆上分配,有可能你
Setrlimit
是因为这个原因不工作,不过我不太确定。
prlimit
也许是因为无法跨平台才没有的吧,你如果需要自己用 cgo 写一个,go 和 c 语言集成极度的方便,你可以看看文档自己写一下。
寒冰射手琪露诺
answered 10 years, 4 months ago