Many fixes. Compute real cpu usage of vms.

This commit is contained in:
wescoeur 2016-02-26 15:28:00 +01:00
parent dee7767427
commit 7abba0a69b

View File

@ -21,7 +21,7 @@ const MINUTES_OF_HISTORICAL_DATA = 30
// Threshold cpu in percent. // Threshold cpu in percent.
// const CRITICAL_THRESHOLD_CPU = 90 // const CRITICAL_THRESHOLD_CPU = 90
const HIGH_THRESHOLD_CPU = 76.5 const HIGH_THRESHOLD_CPU = 0 // 76.5
// const LOW_THRESHOLD_CPU = 22.5 // const LOW_THRESHOLD_CPU = 22.5
// const CRITICAL_THRESHOLD_FREE_MEMORY = 51 // const CRITICAL_THRESHOLD_FREE_MEMORY = 51
@ -141,49 +141,55 @@ function computeAverage (values, nPoints = values.length) {
return sum / tot return sum / tot
} }
function computeRessourcesAverage (hosts, hostsStats, nPoints) { function computeRessourcesAverage (objects, objectsStats, nPoints) {
const averages = {} const averages = {}
for (const host of hosts) { for (const object of objects) {
const hostId = host.id const { id } = object
const hostAverages = averages[hostId] = {} const { stats } = objectsStats[id]
const { stats } = hostsStats[hostId] const objectAverages = averages[id] = {}
hostAverages.cpus = computeAverage( objectAverages.cpus = computeAverage(
mapToArray(stats.cpus, cpu => computeAverage(cpu, nPoints)) mapToArray(stats.cpus, cpu => computeAverage(cpu, nPoints))
) )
hostAverages.memoryFree = computeAverage(stats.memoryFree, nPoints) objectAverages.memoryFree = computeAverage(stats.memoryFree, nPoints)
objectAverages.memoryUsed = computeAverage(stats.memoryUsed, nPoints)
} }
return averages return averages
} }
function checkRessourcesThresholds (hosts, averages) { function checkRessourcesThresholds (objects, averages) {
return filter(hosts, host => { return filter(objects, object => {
const hostAverages = averages[host.id] const objectAverages = averages[object.id]
return ( return (
hostAverages.cpus >= HIGH_THRESHOLD_CPU || objectAverages.cpus >= HIGH_THRESHOLD_CPU ||
hostAverages.memoryFree >= HIGH_THRESHOLD_FREE_MEMORY objectAverages.memoryFree >= HIGH_THRESHOLD_FREE_MEMORY
) )
}) })
} }
function computeRessourcesAverageWithRatio (hosts, averages1, averages2, ratio) { function computeRessourcesAverageWithWeight (averages1, averages2, ratio) {
const averages = {} const averages = {}
for (const host of hosts) { for (const id in averages1) {
const hostId = host.id const objectAverages = averages[id] = {}
const hostAverages = averages[hostId] = {}
for (const averageName in hostAverages) { for (const averageName in averages1[id]) {
hostAverages[averageName] = averages1[averageName] * ratio + averages2[averageName] * (1 - ratio) objectAverages[averageName] = averages1[id][averageName] * ratio + averages2[id][averageName] * (1 - ratio)
} }
} }
return averages return averages
} }
function setRealCpuAverageOfVms (vms, vmsAverages) {
for (const vm of vms) {
vmsAverages[vm.id].cpus /= vm.CPUs.number
}
}
// =================================================================== // ===================================================================
class Plan { class Plan {
@ -218,7 +224,7 @@ class Plan {
// 2. Check in the last 30 min interval with ratio. // 2. Check in the last 30 min interval with ratio.
const avgBefore = computeRessourcesAverage(hosts, hostsStats, MINUTES_OF_HISTORICAL_DATA) const avgBefore = computeRessourcesAverage(hosts, hostsStats, MINUTES_OF_HISTORICAL_DATA)
const avgWithRatio = computeRessourcesAverageWithRatio(exceededHosts, avgNow, avgBefore, 0.75) const avgWithRatio = computeRessourcesAverageWithWeight(avgNow, avgBefore, 0.75)
exceededHosts = checkRessourcesThresholds(exceededHosts, avgWithRatio) exceededHosts = checkRessourcesThresholds(exceededHosts, avgWithRatio)
// No ressource's utilization problem. // No ressource's utilization problem.
@ -251,15 +257,22 @@ class Plan {
} }
async _computeOptimizations (exceededHost, hostsAverages) { async _computeOptimizations (exceededHost, hostsAverages) {
// Get the vms and stats from exceeded hosts.
const vms = await this._getVms(exceededHost.id) const vms = await this._getVms(exceededHost.id)
const vmsStats = await this._getVmsStats(vms, 'minutes') const vmsStats = await this._getVmsStats(vms, 'minutes')
const vmsAverages = computeRessourcesAverageWithWeight(
computeRessourcesAverage(vms, vmsStats, EXECUTION_DELAY),
computeRessourcesAverage(vms, vmsStats, MINUTES_OF_HISTORICAL_DATA),
0.75
)
// Compute real CPU usage. Virtuals cpus to real cpu.
setRealCpuAverageOfVms(vms, vmsAverages)
// TODO
} }
async _applyOptimizations (optimizations) { async _applyOptimizations (optimizations) {
throw new Error('not yet implemented') // throw new Error('not yet implemented')
} }
// Compute hosts for each pool. They can change over time. // Compute hosts for each pool. They can change over time.