Low threshold are automatically computed.

This commit is contained in:
wescoeur 2016-03-02 16:56:59 +01:00
parent e5146f7def
commit 7f06d6e68c

View File

@ -34,14 +34,14 @@ const AGGRESSIVE_BEHAVIOR = 2
const EXECUTION_DELAY = 1 const EXECUTION_DELAY = 1
const MINUTES_OF_HISTORICAL_DATA = 30 const MINUTES_OF_HISTORICAL_DATA = 30
// Threshold cpu in percent. // CPU threshold in percent.
// const CRITICAL_THRESHOLD_CPU = 90 const DEFAULT_HIGH_THRESHOLD_CPU = 75
const HIGH_THRESHOLD_CPU = 75
// const LOW_THRESHOLD_CPU = 22.5
// const CRITICAL_THRESHOLD_FREE_MEMORY = 50 // Memory threshold in MB.
const HIGH_THRESHOLD_FREE_MEMORY = 65 const DEFAULT_HIGH_THRESHOLD_MEMORY_FREE = 64
// const LOW_THRESHOLD_FREE_MEMORY = 1020
const THRESHOLD_FACTOR = 0.3
const THRESHOLD_FACTOR_MEMORY_FREE = 16
// =================================================================== // ===================================================================
@ -181,17 +181,6 @@ function computeRessourcesAverage (objects, objectsStats, nPoints) {
return averages return averages
} }
function checkRessourcesThresholds (objects, averages) {
return filter(objects, object => {
const objectAverages = averages[object.id]
return (
objectAverages.cpus >= HIGH_THRESHOLD_CPU ||
objectAverages.memoryFree >= HIGH_THRESHOLD_FREE_MEMORY
)
})
}
function computeRessourcesAverageWithWeight (averages1, averages2, ratio) { function computeRessourcesAverageWithWeight (averages1, averages2, ratio) {
const averages = {} const averages = {}
@ -227,12 +216,29 @@ function searchObject (objects, fun) {
// =================================================================== // ===================================================================
class Plan { class Plan {
constructor (xo, { name, mode, behavior, poolIds }) { constructor (xo, { name, mode, behavior, poolIds, thresholds = {} }) {
this.xo = xo this.xo = xo
this._name = name // Useful ? this._name = name // Useful ?
this._mode = mode this._mode = mode
this._behavior = behavior this._behavior = behavior
this._poolIds = poolIds this._poolIds = poolIds
this._thresholds = {
cpu: {
high: thresholds.cpu || DEFAULT_HIGH_THRESHOLD_CPU
},
memoryFree: {
high: thresholds.memoryFree || DEFAULT_HIGH_THRESHOLD_MEMORY_FREE * 1024 * 1024
}
}
for (const key in this._thresholds) {
const attr = this._thresholds[key]
attr.low = (key !== 'memoryFree')
? attr.high * THRESHOLD_FACTOR
: attr.high * THRESHOLD_FACTOR_MEMORY_FREE
}
} }
async execute () { async execute () {
@ -249,7 +255,7 @@ class Plan {
// 1. Check if a ressource's utilization exceeds threshold. // 1. Check if a ressource's utilization exceeds threshold.
const avgNow = computeRessourcesAverage(hosts, hostsStats, EXECUTION_DELAY) const avgNow = computeRessourcesAverage(hosts, hostsStats, EXECUTION_DELAY)
let exceededHosts = checkRessourcesThresholds(hosts, avgNow) let exceededHosts = this._checkRessourcesThresholds(hosts, avgNow)
// No ressource's utilization problem. // No ressource's utilization problem.
if (exceededHosts.length === 0) { if (exceededHosts.length === 0) {
@ -261,7 +267,7 @@ class Plan {
const avgBefore = computeRessourcesAverage(hosts, hostsStats, MINUTES_OF_HISTORICAL_DATA) const avgBefore = computeRessourcesAverage(hosts, hostsStats, MINUTES_OF_HISTORICAL_DATA)
const avgWithRatio = computeRessourcesAverageWithWeight(avgNow, avgBefore, 0.75) const avgWithRatio = computeRessourcesAverageWithWeight(avgNow, avgBefore, 0.75)
exceededHosts = checkRessourcesThresholds(exceededHosts, avgWithRatio) exceededHosts = this._checkRessourcesThresholds(exceededHosts, avgWithRatio)
// No ressource's utilization problem. // No ressource's utilization problem.
if (exceededHosts.length === 0) { if (exceededHosts.length === 0) {
@ -343,6 +349,21 @@ class Plan {
return return
} }
_checkRessourcesThresholds (objects, averages) {
return filter(objects, object => {
const objectAverages = averages[object.id]
return (
objectAverages.cpus >= this._thresholds.cpu.high ||
objectAverages.memoryFree >= this._thresholds.memoryFree.high
)
})
}
// ===================================================================
// Get objects.
// ===================================================================
// Compute hosts for each pool. They can change over time. // Compute hosts for each pool. They can change over time.
_getHosts () { _getHosts () {
return filter(this.xo.getObjects(), object => return filter(this.xo.getObjects(), object =>
@ -350,6 +371,18 @@ class Plan {
) )
} }
async _getVms (hostId) {
return filter(this.xo.getObjects(), object =>
object.type === 'VM' &&
object.power_state === 'Running' &&
object.$container === hostId
)
}
// ===================================================================
// Get stats.
// ===================================================================
async _getHostsStats (hosts, granularity) { async _getHostsStats (hosts, granularity) {
const hostsStats = {} const hostsStats = {}
@ -366,14 +399,6 @@ class Plan {
return hostsStats return hostsStats
} }
async _getVms (hostId) {
return filter(this.xo.getObjects(), object =>
object.type === 'VM' &&
object.power_state === 'Running' &&
object.$container === hostId
)
}
async _getVmsStats (vms, granularity) { async _getVmsStats (vms, granularity) {
const vmsStats = {} const vmsStats = {}