Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

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

Posted on 2004-04-25
8
Medium Priority
?
598 Views
Last Modified: 2012-08-13
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.
0
Comment
Question by:vancetech
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
8 Comments
 
LVL 48

Expert Comment

by:Tintin
ID: 10914597
You could try

time perlscript
0
 
LVL 20

Expert Comment

by:jmcg
ID: 10915004
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
 
LVL 3

Expert Comment

by:PerlKing
ID: 10915675
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
Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

 
LVL 12

Accepted Solution

by:
stefan73 earned 252 total points
ID: 10916716
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
 
LVL 3

Expert Comment

by:PerlKing
ID: 10916736
Sorry I was not clear with my wordings, but that is exactly what I meant too!
Thanks for clarifying it stefan.
0
 
LVL 18

Assisted Solution

by:kandura
kandura earned 248 total points
ID: 10917100
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

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

On Microsoft Windows, if  when you click or type the name of a .pl file, you get an error "is not recognized as an internal or external command, operable program or batch file", then this means you do not have the .pl file extension associated with …
A year or so back I was asked to have a play with MongoDB; within half an hour I had downloaded (http://www.mongodb.org/downloads),  installed and started the daemon, and had a console window open. After an hour or two of playing at the command …
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…
Six Sigma Control Plans

705 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question