现在我正在使用PHP和Perl编写程序来读取计算机的系统数据,我们一直在使用SNMP来收集数据(或者更确切地说,被迫)。检索数据后,我们应该将数据存储在数据库中,然后使用数据绘制线图。
目前,我正在使用此perl脚本来检索计算机的CPU /处理器使用情况。
$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检索几个单独的处理器,许多人应该知道一台计算机上可能有许多处理器,因此将这些数据存储到一个不太实用的数据库中(例如,如果一台计算机只有一个处理器) ,下一个有4个,整个房间有100个。)
所以我想知道是否有人可以帮助改进这些代码或更改它以便我可以将它们全部加在一起,并找到CPU /处理器使用的平均值并将其存储到数据库中。因为,我不太清楚如何去做,因为循环一次只扫描一个处理器,并且可能不知道有多少处理器。
提前致谢。
答案 0 :(得分:3)
使用主机和cpu编号作为双键,使用a group by来获得平均值。
这是sqlite3的一个例子。
首先创建表格:
CREATE TABLE cpu (host string, cpu integer, load integer, primary key (host, cpu));
然后插入一些testdata(这将由你的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
您可能想要创建一个包含所有计算机的表并将其链接到上面的cpu表,并使用computer_id交换主机字符串。
所有这些假设您使用的是关系数据库(即SQLite,MySQL,Oracle等)。