Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

I want to run a memory-consuming program and track its memory usage over time. The program ends in a few seconds after invoked.

This previous question suggested sysstat package . While its pidstat utility partly does what I want, it fails to meet my 2 needs:

  • It accepts a minimal interval of 1s, but I want to measure at shorter granularity. (0.1s should be fine)
  • It only tracks an existing process, while I cannot always be present to copy&paste the pid.

Are there some alternative scripts / utilities to do the invoke-and-measure job better?

Thanks!

share|improve this question
1  
Sounds like you should write yourself up a simple little Python or Bash script to dump the process' memory usage (you can just view the first integer in /proc/$PID/statm), and then sleep for 100ms and repeat. Why can't you just keep throwing the PID's associated statm through cat, maybe use some regex to filter off the extra/unneeded values, and just do a sleep 0.01? Some operating systems won't allow sub-second sleep values, so in that case, you'd have to take the Python route (and use Python's built-in time library to sleep instead). –  Breakthrough Jul 15 '13 at 14:55
add comment

1 Answer

up vote 4 down vote accepted

This should do what you need. It gets the information from /proc/$PID/stam and prints (from man stat):

              size       total program size
                         (same as VmSize in /proc/[pid]/status)
              resident   resident set size
                         (same as VmRSS in /proc/[pid]/status)
              share      shared pages (from shared mappings)
              data       data + stack

The script:

#!/usr/bin/env bash 

## Print header
 echo -e "Size\tResid.\tShared\tData\t%"
 while [ 1 ]; do
    ## Get the PID of the process name given as argument 1
     pidno=`pgrep $1`
    ## If the process is running, print the memory usage
     if [ -e /proc/$pidno/statm ]; then
     ## Get the memory info
      m=`awk '{OFS="\t";print $1,$2,$3,$6}' /proc/$pidno/statm`
     ## Get the memory percentage
      perc=`top -bd .10 -p $pidno -n 1  | grep $pidno | gawk '{print \$10}'`
     ## print the results
      echo -e "$m\t$perc";
    ## If the process is not running
     else
      echo "$1 is not running";
     fi
 done

You can then call the script, giving it a process name as input. For example:

$ memusage.sh firefox
Size    Resid.  Shared  Data    %
517193  261902  9546    400715  12.8
517193  261902  9546    400715  12.8
517193  261902  9546    400715  12.8
517193  262100  9546    400715  12.8
517193  262100  9546    400715  12.8
517193  262100  9546    400715  12.8
517209  261899  9546    400731  12.8
517209  261899  9546    400731  12.8

NOTES:

  • This assumes that there is only a single running process with the name specified.
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.