From a42e3da6eba89784ef4098481470a95f05efb32e Mon Sep 17 00:00:00 2001 From: Mike Rostermund Date: Tue, 5 Jan 2016 12:33:10 -0800 Subject: [PATCH 1/2] Fixed discovery performance of VMware virtual machines. --- includes/discovery/vmware-vminfo.inc.php | 107 ++++++++--------------- 1 file changed, 36 insertions(+), 71 deletions(-) diff --git a/includes/discovery/vmware-vminfo.inc.php b/includes/discovery/vmware-vminfo.inc.php index 2890d650cd..5bf6b02b43 100644 --- a/includes/discovery/vmware-vminfo.inc.php +++ b/includes/discovery/vmware-vminfo.inc.php @@ -19,81 +19,46 @@ if (($device['os'] == 'vmware') || ($device['os'] == 'linux')) { echo 'VMware VM: '; /* - * Fetch the list is Virtual Machines. - * - * vmwVmVMID.224 = INTEGER: 224 - * vmwVmVMID.416 = INTEGER: 416 - * ... + * Fetch information about Virtual Machines. */ - $oids = snmp_walk($device, 'VMWARE-VMINFO-MIB::vmwVmVMID', '-Osqnv', '+VMWARE-ROOT-MIB:VMWARE-VMINFO-MIB', '+'.$config['install_dir'].'/mibs/vmware:'.$config['install_dir'].'/mibs'); - if (empty($oids)) { - $oids = trim(snmp_walk($device, 'vmwVmUUID', '-Osq', '+VMWARE-ROOT-MIB:VMWARE-VMINFO-MIB', '+'.$config['install_dir'].'/mibs/vmware:'.$config['install_dir'].'/mibs')); - $oids = str_replace('vmwVmUUID.', '', $oids); + $oids = snmpwalk_cache_multi_oid($device, 'vmwVmTable', $oids, '+VMWARE-ROOT-MIB:VMWARE-VMINFO-MIB', '+'.$config['mib_dir'].'/vmware:'.$config['mib_dir']); + + foreach ($oids as $index => $entry) { + $vmwVmDisplayName = $entry['vmwVmDisplayName']; + $vmwVmGuestOS = $entry['vmwVmGuestOS']; + $vmwVmMemSize = $entry['vmwVmMemSize']; + $vmwVmState = $entry['vmwVmState']; + $vmwVmCpus = $entry['vmwVmCpus']; + + /* + * VMware does not return an INTEGER but a STRING of the vmwVmMemSize. This bug + * might be resolved by VMware in the future making this code obsolete. + */ + if (preg_match('/^([0-9]+) .*$/', $vmwVmMemSize, $matches)) { + $vmwVmMemSize = $matches[1]; + } + + /* + * Check whether the Virtual Machine is already known for this host. + */ + if (dbFetchCell("SELECT COUNT(id) FROM `vminfo` WHERE `device_id` = ? AND `vmwVmVMID` = ? AND vm_type='vmware'", array($device['device_id'], $index)) == 0) { + $vmid = dbInsert(array('device_id' => $device['device_id'], 'vm_type' => 'vmware', 'vmwVmVMID' => $index, 'vmwVmDisplayName' => mres($vmwVmDisplayName), 'vmwVmGuestOS' => mres($vmwVmGuestOS), 'vmwVmMemSize' => mres($vmwVmMemSize), 'vmwVmCpus' => mres($vmwVmCpus), 'vmwVmState' => mres($vmwVmState)), 'vminfo'); + log_event(mres($vmwVmDisplayName)." ($vmwVmMemSize GB / $vmwVmCpus vCPU) Discovered", $device, 'system', $vmid); + echo '+'; + // FIXME eventlog + } + else { + echo '.'; + } + + /* + * Save the discovered Virtual Machine. + */ + + $vmw_vmlist[] = $index; } - if ($oids != '') { - $oids = explode("\n", $oids); - - foreach ($oids as $data) { - $data = trim($data); - list($oid,) = explode(' ', $data); - /* - * Fetch the Virtual Machine information. - * - * vmwVmDisplayName.224 = STRING: My First VM - * vmwVmDisplayName.416 = STRING: My Second VM - * vmwVmGuestOS.224 = STRING: windows7Server64Guest - * vmwVmGuestOS.416 = STRING: winLonghornGuest - * vmwVmMemSize.224 = INTEGER: 8192 megabytes - * vmwVmMemSize.416 = INTEGER: 8192 megabytes - * vmwVmState.224 = STRING: poweredOn - * vmwVmState.416 = STRING: poweredOn - * vmwVmVMID.224 = INTEGER: 224 - * vmwVmVMID.416 = INTEGER: 416 - * vmwVmCpus.224 = INTEGER: 2 - * vmwVmCpus.416 = INTEGER: 2 - */ - - - $vmwVmDisplayName = snmp_get($device, 'vmwVmDisplayName.'.$oid, '-Osqnv', '+VMWARE-ROOT-MIB:VMWARE-VMINFO-MIB', '+'.$config['install_dir'].'/mibs/vmware:'.$config['install_dir'].'/mibs'); - $vmwVmGuestOS = snmp_get($device, 'vmwVmGuestOS.'.$oid, '-Osqnv', '+VMWARE-ROOT-MIB:VMWARE-VMINFO-MIB', '+'.$config['install_dir'].'/mibs/vmware:'.$config['install_dir'].'/mibs'); - $vmwVmMemSize = snmp_get($device, 'vmwVmMemSize.'.$oid, '-Osqnv', '+VMWARE-ROOT-MIB:VMWARE-VMINFO-MIB', '+'.$config['install_dir'].'/mibs/vmware:'.$config['install_dir'].'/mibs'); - $vmwVmState = snmp_get($device, 'vmwVmState.'.$oid, '-Osqnv', '+VMWARE-ROOT-MIB:VMWARE-VMINFO-MIB', '+'.$config['install_dir'].'/mibs/vmware:'.$config['install_dir'].'/mibs'); - $vmwVmCpus = snmp_get($device, 'vmwVmCpus.'.$oid, '-Osqnv', '+VMWARE-ROOT-MIB:VMWARE-VMINFO-MIB', '+'.$config['install_dir'].'/mibs/vmware:'.$config['install_dir'].'/mibs'); - - /* - * VMware does not return an INTEGER but a STRING of the vmwVmMemSize. This bug - * might be resolved by VMware in the future making this code obsolete. - */ - - if (preg_match('/^([0-9]+) .*$/', $vmwVmMemSize, $matches)) { - $vmwVmMemSize = $matches[1]; - } - - /* - * Check whether the Virtual Machine is already known for this host. - */ - - if (dbFetchCell("SELECT COUNT(id) FROM `vminfo` WHERE `device_id` = ? AND `vmwVmVMID` = ? AND vm_type='vmware'", array($device['device_id'], $oid)) == 0) { - $vmid = dbInsert(array('device_id' => $device['device_id'], 'vm_type' => 'vmware', 'vmwVmVMID' => $oid, 'vmwVmDisplayName' => mres($vmwVmDisplayName), 'vmwVmGuestOS' => mres($vmwVmGuestOS), 'vmwVmMemSize' => mres($vmwVmMemSize), 'vmwVmCpus' => mres($vmwVmCpus), 'vmwVmState' => mres($vmwVmState)), 'vminfo'); - log_event(mres($vmwVmDisplayName)." ($vmwVmMemSize GB / $vmwVmCpus vCPU) Discovered", $device, 'system', $vmid); - echo '+'; - // FIXME eventlog - } - else { - echo '.'; - } - - // FIXME update code! - /* - * Save the discovered Virtual Machine. - */ - - $vmw_vmlist[] = $oid; - }//end foreach - }//end if - /* * Get a list of all the known Virtual Machines for this host. */ From 91121536eee48dc8e285ae30f5f74bab8591da79 Mon Sep 17 00:00:00 2001 From: Mike Rostermund Date: Tue, 5 Jan 2016 13:58:23 -0800 Subject: [PATCH 2/2] Fixed polling performance of VMware virtual machines. --- includes/polling/os/vmware.inc.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/includes/polling/os/vmware.inc.php b/includes/polling/os/vmware.inc.php index 3c8ec772e9..25809cc324 100644 --- a/includes/polling/os/vmware.inc.php +++ b/includes/polling/os/vmware.inc.php @@ -28,6 +28,7 @@ echo 'VMware VM: '; */ $db_info_list = dbFetchRows('SELECT id, vmwVmVMID, vmwVmDisplayName, vmwVmGuestOS, vmwVmMemSize, vmwVmCpus, vmwVmState FROM vminfo WHERE device_id = ?', array($device['device_id'])); +$current_vminfo = snmpwalk_cache_multi_oid($device, 'vmwVmTable', array(), '+VMWARE-ROOT-MIB:VMWARE-VMINFO-MIB', '+'.$config['mib_dir'].'/vmware:'.$config['mib_dir']); foreach ($db_info_list as $db_info) { /* @@ -43,11 +44,11 @@ foreach ($db_info_list as $db_info) { $vm_info = array(); - $vm_info['vmwVmDisplayName'] = snmp_get($device, 'VMWARE-VMINFO-MIB::vmwVmDisplayName.'.$db_info['vmwVmVMID'], '-Osqnv', '+VMWARE-ROOT-MIB:VMWARE-VMINFO-MIB', '+'.$config['install_dir'].'/mibs/vmware:'.$config['mibdir']); - $vm_info['vmwVmGuestOS'] = snmp_get($device, 'VMWARE-VMINFO-MIB::vmwVmGuestOS.'.$db_info['vmwVmVMID'], '-Osqnv', '+VMWARE-ROOT-MIB:VMWARE-VMINFO-MIB', '+'.$config['install_dir'].'/mibs/vmware:'.$config['mibdir']); - $vm_info['vmwVmMemSize'] = snmp_get($device, 'VMWARE-VMINFO-MIB::vmwVmMemSize.'.$db_info['vmwVmVMID'], '-Osqnv', '+VMWARE-ROOT-MIB:VMWARE-VMINFO-MIB', '+'.$config['install_dir'].'/mibs/vmware:'.$config['mibdir']); - $vm_info['vmwVmState'] = snmp_get($device, 'VMWARE-VMINFO-MIB::vmwVmState.'.$db_info['vmwVmVMID'], '-Osqnv', '+VMWARE-ROOT-MIB:VMWARE-VMINFO-MIB', '+'.$config['install_dir'].'/mibs/vmware:'.$config['mibdir']); - $vm_info['vmwVmCpus'] = snmp_get($device, 'VMWARE-VMINFO-MIB::vmwVmCpus.'.$db_info['vmwVmVMID'], '-Osqnv', '+VMWARE-ROOT-MIB:VMWARE-VMINFO-MIB', '+'.$config['install_dir'].'/mibs/vmware:'.$config['mibdir']); + $vm_info['vmwVmDisplayName'] = $current_vminfo[$db_info['vmwVmVMID']]['vmwVmDisplayName']; + $vm_info['vmwVmGuestOS'] = $current_vminfo[$db_info['vmwVmVMID']]['vmwVmGuestOS']; + $vm_info['vmwVmMemSize'] = $current_vminfo[$db_info['vmwVmVMID']]['vmwVmMemSize']; + $vm_info['vmwVmState'] = $current_vminfo[$db_info['vmwVmVMID']]['vmwVmState']; + $vm_info['vmwVmCpus'] = $current_vminfo[$db_info['vmwVmVMID']]['vmwVmCpus']; /* * VMware does not return an INTEGER but a STRING of the vmwVmMemSize. This bug