2010-08-20 3 views
3

En ce moment je travaille sur un programme avec PHP et Perl pour lire les données système de l'ordinateur et nous avons utilisé SNMP pour collecter des données (ou plutôt, forcé à). Après avoir récupéré les données, nous devions stocker les données dans une base de données, puis utiliser les données pour tracer un graphique linéaire. À l'heure actuelle, j'utilise ce script perl pour récupérer l'utilisation CPU/processeur d'un ordinateur.Comment obtenir l'utilisation moyenne du processeur/processeur d'un ordinateur?

$MIB1 = ".1.3.6.1.2.1.25.3.3.1.2"; #Cpu Processors 
    $HOST = shift; #or localhost for testing 

    $count = 0; 
     #print out all the processors of the computer and their values 
     #SNMP is used with perl because of the libraries 
     #snmpwalk retrieves information from the computers by the computer name and MIB 
     #as there are many values, they are stored in an array to be used 
     (@values) = &snmpwalk("$HOST","$MIB1"); 
     foreach $value (@values) 
     { 
      $count++; 
      if ($value) { 
       #fixes the value for presentation 
       $goodvalue = &strip_comment($value); 
       #prints out the result. $count will count out the processor number 
       print "CPU Usage of Processor $count: $goodvalue%\n"; } 
       if ($value > 90){ 
        #warns user if the processor usage is over 90% 
        print "Warning: CPU Usage over 90%! \n" 
       } 
      else { warn "No response from host :$HOST:\n"; } #provides error 
     } 

Le code, ou plutôt, SNMP récupère plusieurs processeurs individuels et beaucoup doivent savoir qu'il peut y avoir plusieurs processeurs sur un ordinateur, rendant ainsi le stockage de ces données dans un (par exemple la base de données pas très pratique, si un ordinateur J'ai seulement 2 processeurs, le suivant en a 4 et celui en face en a 100.)

Je me demandais si quelqu'un pouvait aider à améliorer ce code ou le changer pour que je puisse les valeur des utilisations CPU/processeur et le stocker dans une base de données. Parce que, je ne suis pas trop sûr de la façon de procéder, car la boucle ne scanne qu'un seul processeur à la fois, et il peut être inconnu combien il y en a.

Merci d'avance.

+1

Au lieu d'écrire le vôtre, vous pouvez utiliser par ex. OpenNMS: http://www.opennms.org/ - il devrait pouvoir détecter automatiquement vos machines, rassembler des résultats et montrer vos graphiques de la charge. – slu

Répondre

3

Utilisez le numéro d'hôte et de processeur en tant que clé double et le groupe par pour obtenir la moyenne.

Voici un exemple avec sqlite3.

d'abord créer la table:

CREATE TABLE cpu (host string, cpu integer, load integer, primary key (host, cpu)); 

Insérez ensuite une testdata (ce sera fait par votre script perl):

INSERT INTO cpu (host, cpu, load) VALUES ("appserv", 1, 25); 
INSERT INTO cpu (host, cpu, load) VALUES ("appserv", 2, 15); 
INSERT INTO cpu (host, cpu, load) VALUES ("dbserv", 1, 10); 
INSERT INTO cpu (host, cpu, load) VALUES ("dbserv", 2, 30); 
INSERT INTO cpu (host, cpu, load) VALUES ("dbserv", 3, 5); 
INSERT INTO cpu (host, cpu, load) VALUES ("dbserv", 4, 5); 

Maintenant vous pouvez obtenir la charge moyenne pour chaque hôte, pourrait être récupéré et transcrites en utilisant PHP:

SELECT host, avg(load) FROM cpu GROUP BY host; 

appserv|20.0 
dbserv|12.5 

La moyenne totale sur tous les hôtes:

SELECT avg(load) FROM cpu; 

15.0 

Ou trouver des hôtes avec une charge élevée:

SELECT host FROM cpu WHERE load > 25; 

dbserv 

Vous voudrez probablement faire faire une table de tous vos ordinateurs et de le relier à la table cpu ci-dessus, l'échange de l'hôte chaîne avec un ID_ordinateur. Tout ceci suppose que vous utilisez une base de données relationnelle (par exemple SQLite, MySQL, Oracle, etc.).