目前,我正在使用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
    (或rusage.ru_maxrss语言中的C)以千字节为单位,因此在macOS上,我的代码使用了约2GB的内存
    在Linux上何时仅使用约20MB?

    这是通过rusage.Maxrss测量用户程序使用的内存的好决定吗
    还是有更好的方法?

    最佳答案

    在我的Mac电脑上,getrusage()手册页显示:“ru_maxrss使用的最大居民集大小(以字节为单位)”(添加了重点)。这似乎对您的结果有意义。

    您所引用的iOS man page in Apple's legacy documentation archive确实表示单位为千字节。目前尚不清楚这是由于iOS和macOS之间的行为不同还是手册页中的错误(已更正)引起的。可惜的是,苹果没有在线维护被维护的手册页。

    关于linux - 在MacOS和Linux上获取rusage.maxrss的奇怪值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59913657/

    10-12 05:42