1

I'm Trying go GET CPU values using WMI classes but with no lucky.

  1. With the class Win32_PerfFormattedData_PerfOS_Processor, I'm always getting the same values they don't change...
  2. With the WMI class Win32_PerfRawData_PerfOS_Processor, the value of PercentProcessorTime is equal to PercentProcessorTime, something is wrong.

#!/usr/bin/perl -w
use strict;
use warnings;

use Win32::OLE;
use Data::Dumper;

my $class = "Win32_PerfFormattedData_PerfOS_Processor";
my $key = 'Name';

my @properties = qw(PercentIdleTime PercentProcessorTime PercentPrivilegedTimePercentUserTime PercentInterruptTime);
my $wmi = Win32::OLE->GetObject("winmgmts://./root/cimv2")
    or die "Failed getobject\n";

my $list, my $v;

$list = $wmi->InstancesOf("$class")
    or die "Failed getobject\n";
my $hash;
foreach $v (in $list) {        
    $hash->{$v->{$key}}->{$_}  = $v->{$_} for @properties;
}

print Dumper $hash;

#-------------------
# Using Otehr class    
$class = 'Win32_PerfRawData_PerfOS_Processor';

$wmi = Win32::OLE->GetObject("winmgmts://./root/cimv2")
    or die "Failed getobject\n";

$list = $wmi->InstancesOf("$class")
    or die "Failed getobject\n";
foreach $v (in $list) {        
    $hash->{$v->{$key}}->{$_}  = $v->{$_} for @properties;
}

print Dumper $hash;

OUTPUT:

$VAR1 = {
          '0' => {
                   'PercentPrivilegedTime' => '0',
                   'PercentIdleTime' => '0',
                   'PercentInterruptTime' => '0',
                   'PercentUserTime' => '0',
                   'PercentProcessorTime' => '100'
                 },
          '_Total' => {
                        'PercentPrivilegedTime' => '0',
                        'PercentIdleTime' => '0',
                        'PercentInterruptTime' => '0',
                        'PercentUserTime' => '0',
                        'PercentProcessorTime' => '100'
                      }
        };
$VAR1 = {
          '0' => {
                   'PercentPrivilegedTime' => '15442905808',
                   'PercentIdleTime' => '2505024948976',
                   'PercentInterruptTime' => '1866684160',
                   'PercentUserTime' => '682681648',
                   'PercentProcessorTime' => '2505024948976'
                 },
          '_Total' => {
                        'PercentPrivilegedTime' => '15442905808',
                        'PercentIdleTime' => '2505024948976',
                        'PercentInterruptTime' => '1866684160',
                        'PercentUserTime' => '682681648',
                        'PercentProcessorTime' => '2505024948976'
                      }
        };
1
  • 2
    -w and use warnings are redundant in this case. -w is global whereas use warnings pragma can be enabled and disabled within blocks, or by no warnings. Commented Jan 20, 2011 at 17:48

2 Answers 2

1

This is the script that i've done to collect CPU info:

use strict;
use warnings;

use Win32::OLE;


my $interval = 1;
my $key = 'Name';
my @properties = qw(PercentIdleTime PercentProcessorTime PercentPrivilegedTime PercentUserTime PercentInterruptTime TimeStamp_Sys100NS);

my $hash1 = {};

my $wmi = Win32::OLE->GetObject("winmgmts://./root/cimv2")
    or die "Failed to get object\n";


my $list = $wmi->InstancesOf('Win32_PerfRawData_PerfOS_Processor')
    or die "Failed to get instance object\n";

my $v;  
foreach $v (in $list) {         
        map{$hash1->{$v->{$key}}->{$_}  = $v->{$_} }@properties;
}

while(sleep 1){

    $list = $wmi->InstancesOf('Win32_PerfRawData_PerfOS_Processor')
        or die "Failed to get instance object\n";

    my $hash = {};
    foreach $v (in $list) {         
        map{$hash->{$v->{$key}}->{$_}  = $v->{$_} }@properties;
    }

    my $cpu_time = sprintf("%.2f", (1 - get_value($hash1->{'_Total'}, $hash->{'_Total'}, 'PercentProcessorTime' )) * 100);
    my $cpu_idle = sprintf("%.2f", 100-$cpu_time);
    my $cpu_user = sprintf("%.2f", get_value($hash1->{'_Total'}, $hash->{'_Total'}, 'PercentUserTime' )* 100);
    my $cpu_priv = sprintf("%.2f", get_value($hash1->{'_Total'}, $hash->{'_Total'}, 'PercentPrivilegedTime' )* 100);
    my $cpu_int = sprintf("%.2f", get_value($hash1->{'_Total'}, $hash->{'_Total'}, 'PercentInterruptTime' )* 100);      
    printf "CPU Time %s %% , privileged %s %% , user %s %%, interrupt %s %%\n", $cpu_time,$cpu_priv,$cpu_user,$cpu_int;

    $hash1 = $hash;
}


exit;

sub get_value {
    my $h1 = shift;
    my $h2 = shift;
    my $property = shift;
    return (($h2->{$property} - $h1->{$property})/($h2->{'TimeStamp_Sys100NS'}-$h1->{'TimeStamp_Sys100NS'}));
}

Output sample:

CPU Time 2.03 % , privileged 1.96 % , user 0.00 %, interrupt 0.00 %
CPU Time 1.87 % , privileged 1.96 % , user 0.00 %, interrupt 0.00 %
CPU Time 2.16 % , privileged 1.96 % , user 0.00 %, interrupt 0.00 %
CPU Time 1.76 % , privileged 1.96 % , user 0.00 %, interrupt 0.00 %
CPU Time 2.19 % , privileged 1.96 % , user 0.00 %, interrupt 0.00 %
CPU Time 1.77 % , privileged 1.96 % , user 0.00 %, interrupt 0.00 %
CPU Time 1.98 % , privileged 1.96 % , user 0.00 %, interrupt 0.00 %
CPU Time 1.93 % , privileged 1.96 % , user 0.00 %, interrupt 0.00 %
CPU Time 2.08 % , privileged 1.96 % , user 0.00 %, interrupt 0.00 %
CPU Time 2.84 % , privileged 2.94 % , user 0.00 %, interrupt 0.00 %
Sign up to request clarification or add additional context in comments.

Comments

0

Edit to make the answer more precise:

Retrieving instances of these classes Win32::OLE->GetObject(...) gets you a snapshot of the current state of the processors. To see how processor states change over time, you will need to get separate instances at make separate calls to Win32::OLE->GetObject at separate times.

4 Comments

I've done a loop, getting always new instances, and the results are similar.... That won't solvit. Did you test the script?
@golden PT: Answer edited. Make sure the call to GetObject(...) is inside the loop, too.
For the first Dump i'm getting always the same values.\
Do you mean you're always getting PercentProcessorTime => 100? What if you run the script while your machine isn't so busy?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.