Как получить среднюю загрузку ЦП/процессора компьютера?

Прямо сейчас я работаю над программой на PHP и Perl для чтения системных данных компьютера, и мы использовали SNMP для сбора данных (точнее, вынуждены). После извлечения данных мы должны были сохранить данные в базе данных, а затем использовать данные для построения линейного графика.

На данный момент я использую этот perl-скрипт для получения информации об использовании ЦП/процессора компьютера.

  $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
      }

Код, вернее, SNMP извлекает несколько отдельных процессоров, и многие должны знать, что на одном компьютере может быть много процессоров, поэтому хранение этих данных в базе данных не очень практично (например, если на одном компьютере всего 2 процессора, на следующем имеет 4, а тот, что в другом конце комнаты, имеет 100.)

Поэтому мне было интересно, может ли кто-нибудь помочь улучшить этот код или изменить его, чтобы я мог сложить их все вместе, найти среднее значение использования ЦП/процессора и сохранить его в базе данных. Потому что я не слишком уверен, как это сделать, поскольку цикл сканирует только 1 процессор за раз, и может быть неизвестно, сколько их.

Заранее спасибо.


person vrerer    schedule 20.08.2010    source источник
comment
Вместо того, чтобы писать свои собственные, вы можете использовать, например. OpenNMS: opennms.org — он должен автоматически определять ваши машины, собирать результаты и отображать графики Загрузка.   -  person slu    schedule 20.08.2010


Ответы (1)


Используйте номер хоста и процессора в качестве двойного ключа и группу a, чтобы получить среднее значение.

Вот пример с sqlite3.

Сначала создайте таблицу:

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

Затем вставьте некоторые тестовые данные (это будет сделано вашим 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);

Теперь вы можете получить среднюю нагрузку для каждого хоста, которую можно получить и построить с помощью PHP:

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

appserv|20.0
dbserv|12.5

Общее среднее по всем хостам:

SELECT avg(load) FROM cpu;

15.0

Или найти какие-либо хосты с высокой нагрузкой:

SELECT host FROM cpu WHERE load > 25;

dbserv

Вы, вероятно, захотите создать таблицу всех ваших компьютеров и связать ее с таблицей процессоров выше, заменив строку хоста на computer_id.

Все это предполагает, что вы используете реляционную базу данных (например, SQLite, MySQL, Oracle и т. д.).

person slu    schedule 20.08.2010