【发布时间】:2020-01-25 21:44:15
【问题描述】:
目前我正在用golang编写在线判断系统。
为了检测用户程序内存使用情况,我决定分析cmd.ProcessState.SysUsage() 并检查Rusage.Maxrss。
现在我很困惑,因为当我尝试在我的 mac 上运行它时,Rusage.Maxrss 调用的结果很奇怪
这是我在 macOS 和 Linux 上运行的代码(已简化,此代码调用当前进程的 Getrusage())
我得到了一些结果:
package main
import (
"fmt"
"syscall"
)
func main() {
rusage := syscall.Rusage{}
pageSize := syscall.Getpagesize()
if err := syscall.Getrusage(syscall.RUSAGE_SELF, &rusage); err != nil {
fmt.Println(err)
panic(err)
}
fmt.Printf("page size: %d\nrusage.Maxrss: %d\n", pageSize, rusage.Maxrss)
}
我得到了以下结果
- MacOS:
go run test.go page size: 4096 rusage.Maxrss: 2007040 - Linux/Ubuntu-18.04:
go run test.go page size: 4096 rusage.Maxrss: 17580
你能解释一下为什么它会返回这么大的价值吗?正如我所看到的 macOS 手册和 linux 手册页:rusage.Maxrss
(或来自C 语言的rusage.ru_maxrss)以千字节为单位,所以在macOS上我的代码使用了~2GB的内存
在 Linux 上它只使用了 ~20MB?
用rusage.Maxrss 测量用户程序使用的内存是一个好的决定吗?
还是有更好的方法?
【问题讨论】:
-
在我的 Mac 上,
getrusage()手册页说:“ru_maxrss 使用的最大驻留集大小(以字节为单位)”(强调添加)。 -
非常感谢@ken-thomases,我见过this 并没有见过当地人。这是我的错。
-
不客气。我不知道这是否是 macOS 和 iOS 之间的区别,或者它是否会随着时间的推移而发生变化,并且该链接位于未维护的文档存档中,显示了较早的手册页。 (而且,如果它确实随着时间的推移发生了变化,可能只是手册页不正确并已更正;或者,可能是操作系统的行为发生了变化,手册页准确地反映了该行为。)