Golang os / exec,实时内存使用情况

时间:2015-08-07 14:12:24

标签: linux memory go

我正在使用Linux,go和os / exec来运行一些命令。 我想知道一个进程'实时内存使用情况。这意味着我可以在启动流程后随时询问内存使用情况,而不仅仅是在运行之后。

(这就是为什么Measuring memory usage of executable run using golang中的答案是而不是对我而言的选项

例如:

cmd := exec.Command(...)
cmd.Start()
//...
if cmd.Memory()>50 { 
    fmt.Println("Oh my god, this process is hungry for memory!")
}

我不需要非常精确的值,但如果它的误差范围低于10兆字节则会很棒。

有没有办法做到这一点,或者我需要某种命令行技巧?

1 个答案:

答案 0 :(得分:6)

这是我在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 (Proportional Set Size),以KB表示。如果您刚刚开始此过程,则您应该有权访问相应的/ proc文件。

使用内核3.0.13进行测试。