Golang os / exec,实时内存使用情况 [英] Golang os/exec, realtime memory usage

查看:501
本文介绍了Golang os / exec,实时内存使用情况的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



(这就是为什么 不是 对于我)



例如:

  cmd:= exec。 Command(...)
cmd.Start()
// ...
if cmd.Memory()> 50 {
fmt.Println(Oh my god ,这个过程渴望记忆!)
}

我不需要精确的价值,但是如果误差范围低于10兆字节会很好。



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

解决方案

以下是我在Linux上使用的内容:

< pre $ func calculateMemory(pid int)(uint64,error){
$ bf,err:= os.Open(fmt.Spri ntf(/ proc /%d / smaps,pid))
if err!= nil {
return 0,err
}
推迟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(如果错误!=零{
return 0,err
}
res + = size
}
}
if err:= r.Err(); err!= nil {
return 0,err
}

return res,nil
}

该函数返回 PSS(比例集合大小),用KB表示。如果您刚开始这个过程,您应该有权访问相应的/ proc文件。



使用内核3.0.13测试。


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?

解决方案

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.

这篇关于Golang os / exec,实时内存使用情况的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆