How can I accurately graph the average CPU usage... not just load average?

I am writing a perl script that does some forking work, and I would like to monitor the loads of the computer running it.  The load averages are typically around 3 - 6 over 1, 5, 15 minutes, but I seek more information than that.

I already watch the CPU usage on a 10 second interval, as presented by "ps -axo %cpu", but I don't think I am getting the whole picture.

When I use "top" it shows % User, % System, % Nice, % Interrupt, % Idle, but I don't think that "ps -axo %cpu" shows anything but the % User.  How can I get a more accurate picture of how much load the system is under?

I haven't been able to find a perl module that does this.

Thank you.
vancetechAsked:
Who is Participating?
 
stefan73Connect With a Mentor Commented:
Hi PerlKing,
> call "top" periodically

You can simply open the output of top, like:

open(TOP,"top -b -s10 -d15 -u 0|") or die "No top";

And then just parse the output. An empty line ends a single output.

(check top man pages for the options used)


Cheers,
Stefan
0
 
TintinCommented:
You could try

time perlscript
0
 
jmcgOwnerCommented:
There are multiple meanings for the phrase "how much load the system is under". Since it sounds like you're trying to get a more comprehensive picture rather than a single "number", you might like a utility like 'vmstat' or combine it with 'iostat'.

Within your application, you can use the 'times' operator to get information similar to what is reported by the command-line utility 'time'.
0
Cloud Class® Course: CompTIA Healthcare IT Tech

This course will help prep you to earn the CompTIA Healthcare IT Technician certification showing that you have the knowledge and skills needed to succeed in installing, managing, and troubleshooting IT systems in medical and clinical settings.

 
PerlKingCommented:
I have a suggestion for you.

Once you have chosen your metric, you could very easily write a perl script that call "top" periodically, pick up the relevant information and print it in a file. Say you chose, the "memory usage". You call top every second and pick up the "memory usage" of your script. Now print all this in a file.

After you are done with the script, you could use "gnuplot" to plot a graph of this data which gives you a broader picture or the trend of memory usage by your script.

Of course, once you have such a monitoring script in place, you could make it look for multiple parameters at a time.
0
 
PerlKingCommented:
Sorry I was not clear with my wordings, but that is exactly what I meant too!
Thanks for clarifying it stefan.
0
 
kanduraConnect With a Mentor Commented:
try parsing the contents of /proc/stat yourself instead of using top.
the first line will give you counters for overall cpu usage.
A sample:

cpu  3028583 89870834 2870091 9335

Then use something like:
         ($cpu[$r], $usr[$r], $nice[$r], $sys[$r], $idle[$r])= split / +/,$line;

when you take a new measurement. flip $r
         $r = 1 - $r
and convert the last two measurements to a percentage:

      $usr_100  =rate_prcnt($usr [$r],$usr [1-$r],$total[$r],$total[1-$r]);
      $nice_100 =rate_prcnt($nice[$r],$nice[1-$r],$total[$r],$total[1-$r]);
      $sys_100  =rate_prcnt($sys [$r],$sys [1-$r],$total[$r],$total[1-$r]);
      $idle_100  =rate_prcnt($idle[$r],$idle[1-$r],$total[$r],$total[1-$r]);

These four numbers give you the average cpu usage during the time between the two measurements.

sub rate_prcnt {
   my ($a1,$a2,$b1,$b2) = @_;
   if (!($a1&&$b1&&$a2&&$b2)) {
      return 0;
   }

   return (abs($b1-$b2)==0)?0:sprintf ("%.2f",100*abs($a1-$a2)/abs($b1-$b2));
}


Note that I grabbed the code for this from procallator.pl, which is a contribution to Orca, which is a systems monitoring and graphing package using RRD.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.