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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With