【问题标题】:strange values of get rusage.maxrss on macOS and LinuxmacOS 和 Linux 上 get rusage.maxrss 的奇怪值
【发布时间】: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 之间的区别,或者它是否会随着时间的推移而发生变化,并且该链接位于未维护的文档存档中,显示了较早的手册页。 (而且,如果它确实随着时间的推移发生了变化,可能只是手册页不正确并已更正;或者,可能是操作系统的行为发生了变化,手册页准确地反映了该行为。)

标签: linux macos go rusage


【解决方案1】:

在我的 Mac 上,getrusage() 手册页说:“ru_maxrss 使用的最大驻留集大小(以字节为单位)”(强调)。这似乎对您的结果有意义。

您所指的iOS man page in Apple's legacy documentation archive 确实说单位是千字节。目前尚不清楚这是由于 iOS 和 macOS 之间的行为不同,还是由于手册页中的错误已得到纠正。遗憾的是,Apple 没有在线维护维护手册页。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    相关资源
    最近更新 更多