Как получить среднее использование процессора / процессора компьютера?
Сейчас я работаю над программой на 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 ответ
Используйте номер хоста и процессора в качестве двойного ключа, а группу для получения среднего.
Вот пример с 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 и т. Д.).