我正在使用
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兆字节则会很好.
有没有办法做到这一点,或者我需要某种命令行技巧?
解决方法
这是我在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测试.
原文地址:https://www.jb51.cc/linux/393246.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。