2011-01-20 4 views
1

Я пытаюсь перейти GET значения ЦП, используя классы WMI, но не повезло.Получить значения CPU WMI с помощью Perl

  1. С классом Win32_PerfFormattedData_PerfOS_Processor, я всегда получаю то же значение, что они не меняются ...
  2. С классом WMI Win32_PerfRawData_PerfOS_Processor, значение PercentProcessorTime равно PercentProcessorTime, что-то не так.

#!/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; 

ВЫВОД:

$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' 
         } 
     }; 
+2

'' -w' и использование warnings' избыточны в этом случае. '-w' является глобальным, тогда как прагма' use warnings' может быть включена и отключена в блоках или 'no warnings'. –

ответ

1

Это скрипт, который я сделал, чтобы собрать данные CPU:

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'})); 
} 

Выход образца:

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 % 
0

Редактировать, чтобы сделать ответ более точным:

Получение экземпляры этих классов Win32::OLE->GetObject(...) получает вас снимок текущего состояния процессоров. Чтобы увидеть, как изменяются состояния процессора с течением времени, вам нужно будет получить отдельные экземпляры в сделать раздельные звонки Win32::OLE->GetObject в разное время.

+1

Я сделал цикл, получая всегда новые экземпляры, и результаты схожи ... Это не сольвит. Вы тестировали скрипт? –

+0

@golden PT: отредактирован ответ. Убедитесь, что вызов 'GetObject (...)' is * внутри * цикла тоже. – mob

+0

Для первого дампа я получаю всегда одинаковые значения. \ –

Смежные вопросы