golang 如何限制内存

发布于 2022-08-29 17:16:18 字数 1227 浏览 14 评论 0


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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

够钟 2022-09-05 17:16:18

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

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

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

场罚期间 2022-09-05 17:16:18

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文