dsqpx86002 2015-08-07 14:12
浏览 146
已采纳

Golang OS / EXEC,实时内存使用情况

I'm using Linux, go, and os/exec to run some commands. I want to know a process' realtime memory usage. That means that I can ask for memory usage anytime after I start the process, not just after it ran.

(That's why the answer in Measuring memory usage of executable run using golang is not an option for me)

For example:

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

I don't need very precise value, but it would be great if it's error range is lower than, say, 10 megabytes.

Is there a go way to do that or I need some kind of command line trick?

  • 写回答

1条回答 默认 最新

  • dsdsds12222 2015-08-07 15:55
    关注

    Here is what I use on 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
    }
    

    This function returns the PSS (Proportional Set Size) for a given PID, expressed in KB. If you have just started the process, you should have the rights to access the corresponding /proc file.

    Tested with kernel 3.0.13.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛