为了账号安全,请及时绑定邮箱和手机立即绑定

Golang os/exec,实时内存使用

Golang os/exec,实时内存使用

Go
www说 2021-11-01 10:27:31
我正在使用 Linux、go 和 os/exec 来运行一些命令。我想知道一个进程的实时内存使用情况。这意味着我可以在启动进程后随时询问内存使用情况,而不仅仅是在运行后。(这就是为什么在回答测量使用golang可执行文件运行的内存使用量是不是一种选择对我来说)例如:cmd := exec.Command(...)cmd.Start()//...if cmd.Memory()>50 {     fmt.Println("Oh my god, this process is hungry for memory!")}我不需要非常精确的值,但如果它的错误范围低于 10 兆字节,那就太好了。有没有办法做到这一点,或者我需要某种命令行技巧?
查看完整描述

1 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

这是我在 Linux 上使用的:


func calculateMemory(pid int) (uint64, error) {


    f, err := os.Open(fmt.Sprintf("/proc/%d/smaps", pid))

    if err != nil {

        return 0, err

    }

    defer f.Close()


    res := uint64(0)

    pfx := []byte("Pss:")

    r := bufio.NewScanner(f)

    for r.Scan() {

        line := r.Bytes()

        if bytes.HasPrefix(line, pfx) {

            var size uint64

            _, err := fmt.Sscanf(string(line[4:]), "%d", &size)

            if err != nil {

                return 0, err

            }

            res += size

        }

    }

    if err := r.Err(); err != nil {

        return 0, err

    }


    return res, nil

}

此函数返回给定 PID的PSS(比例集大小),以 KB 表示。如果您刚刚启动该进程,您应该有权访问相应的 /proc 文件。


使用内核 3.0.13 测试。


查看完整回答
反对 回复 2021-11-01
  • 1 回答
  • 0 关注
  • 150 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信