我正在使用
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测试.