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

前端之家收集整理的这篇文章主要介绍了linux – Golang os / exec,实时内存使用情况前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用 Linux,go和os / exec来运行一些命令.
我想知道一个进程’实时内存使用情况.这意味着我可以在启动进程后随时询问内存使用情况,而不仅仅是在运行之后.

(这就是为什么Measuring memory usage of executable run using golang的答案不适合我的原因)

例如:

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

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

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

解决方法

这是我在Linux上使用的内容
  1. func calculateMemory(pid int) (uint64,error) {
  2.  
  3. f,err := os.Open(fmt.Sprintf("/proc/%d/smaps",pid))
  4. if err != nil {
  5. return 0,err
  6. }
  7. defer f.Close()
  8.  
  9. res := uint64(0)
  10. pfx := []byte("Pss:")
  11. r := bufio.NewScanner(f)
  12. for r.Scan() {
  13. line := r.Bytes()
  14. if bytes.HasPrefix(line,pfx) {
  15. var size uint64
  16. _,err := fmt.Sscanf(string(line[4:]),"%d",&size)
  17. if err != nil {
  18. return 0,err
  19. }
  20. res += size
  21. }
  22. }
  23. if err := r.Err(); err != nil {
  24. return 0,err
  25. }
  26.  
  27. return res,nil
  28. }

函数返回给定PID的PSS (Proportional Set Size),以KB表示.如果刚刚启动该过程,则应该有权访问相应的/ proc文件.

用内核3.0.13测试.

猜你在找的Linux相关文章