linux - macOS 和 Linux 上 get rusage.maxrss 的奇怪值

标签 linux macos go rusage

目前我正在用golang编写在线判断系统。
为了检测用户程序内存使用情况,我决定分析 cmd.ProcessState.SysUsage()并检查 Rusage.Maxrss .
现在我很困惑,因为当我尝试在我的Rusage.Maxrss 的mac 结果上运行它时电话很奇怪

这是我在 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)
}

以下是我得到的结果
  • 苹果系统:
    go run test.go 
    page size: 4096
    rusage.Maxrss: 2007040
    
  • Linux/Ubuntu-18.04:
    go run test.go                     
    page size: 4096
    rusage.Maxrss: 17580
    

  • 你能解释一下为什么它会返回这么大的值(value)吗?正如我所看到的 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 之间的不同行为还是手册页中的错误已得到纠正。遗憾的是,Apple 没有在线维护维护手册页。

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

    相关文章:

    swift - 使用适用于 MacOS 的 Swift 播放音频文件

    linux - 如何在 Go 中将消息打印到 stderr?

    ide - 在 Windows 机器上使用 IDE,但在 Linux 机器上测试/运行应用程序?

    ruby - RVM 安装系统范围的 Git 依赖项

    python - 使用 Python/iptables 拦截通过 Linux Bridge 的 UDP 数据包

    ios - 导入开发人员配置文件 .developerprofile 不起作用。仍然需要密码

    go - Go 更喜欢从远程存储库获取还是更喜欢使用本地文件?

    linux - 从一个巨大的(有数百万条记录和列)OFS 文件(没有固定标题行)unix 中查找所有唯一列

    c - 在 Linux 中从 C 杀死所有进程

    swift - 菜单栏应用程序中的 OS X 键事件 (Swift)