Low threshold are automatically computed.
This commit is contained in:
parent
e5146f7def
commit
7f06d6e68c
@ -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 = {}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user