gulden has asked for the wisdom of the Perl Monks concerning the following question:

This is my script to collect CPU values:
my $class = "Win32_PerfFormattedData_PerfOS_Processor"; my $key = 'Name'; # CORRECTION: user feedback BrowserUK my @properties = qw(PercentIdleTime PercentProcessorTime PercentPr +ivilegedTime PercentUserTime 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"; foreach $v (in $list) { $hash->{$v->{$key}}->{$_} = $v->{$_} for @properties; } print Dumper $hash;
I'm always getting the same values they don't change...

Here's the output:

$VAR1 = { '0' => { 'PercentPrivilegedTime' => '0', 'PercentIdleTime' => '0', 'PercentInterruptTime' => '0', 'PercentUserTime' => '0', 'PercentProcessorTime' => '100' }, '_Total' => { 'PercentPrivilegedTime' => '0', 'PercentIdleTime' => '0', 'PercentInterruptTime' => '0', 'PercentUserTime' => '0', 'PercentProcessorTime' => '100' } };
What am i doing wrong?

Tks in advance,

gulden

«A contentious debate is always associated with a lack of valid arguments.»

Replies are listed 'Best First'.
Re: How to GET CPU values from WMI
by BrowserUk (Patriarch) on Jan 20, 2011 at 16:00 UTC

    Where does $key get its value from?

    $hash->{$v->{$key}}->{$_} = $v->{$_} for @properties; ##............^^^^

    If you used strict & warnings, you'd probably have solved this yourself.


    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.
      Here is the key value:
      my $key = 'Name';
      As far as I know i need to instantiate the Performance Counter before I use it, like:
      # pseudo algorithm my $inst = new PerformanceCounter('CPU'); while(true){ $sample = $inst->get_next_sample(); print $sample->{'total'}; print $sample->{'idle'}; print $sample->{'system'}; print $sample->{'user'}; }

      But i don't know how to do it using WMI. I think I'm forced to use other method, that doesn't use WMI. Any tips?

      Tks

      MG

        It's still not clear to me from this thread nor your previous what you are actually trying to achieve, but you might take a look at DBD::WMI.

Re: How to GET CPU values from WMI
by gulden (Monk) on Jan 20, 2011 at 17:01 UTC
    This is the full script using also other WMI Class.
    #!/usr/bin/env perl use strict; use warnings; use Win32::OLE; use Data::Dumper; my $class = "Win32_PerfFormattedData_PerfOS_Processor"; my $key = 'Name'; my @properties = qw(PercentIdleTime PercentProcessorTime PercentPr +ivilegedTime PercentUserTime 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' } };
    With the WMI class "Win32_PerfRawData_PerfOS_Processor", the value of "PercentProcessorTime" is equal to "PercentProcessorTime", i'm doing something wrong...
Re: How to GET CPU values from WMI
by gulden (Monk) on Mar 10, 2011 at 14:07 UTC
    This is the script that i've done to collect CPU info:
    use strict; use warnings; use Win32::OLE; my $interval = 1; # seconds my $key = 'Name'; my @properties = qw(PercentIdleTime PercentProcessorTime PercentPrivil +egedTime 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 $interval){ $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_Sy +s100NS'}-$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 %
    «A contentious debate is always associated with a lack of valid arguments.»