overload
An Overload Regulation Process
Warning!
All functions in this module are deprecated and will be removed in a future release.
overload
is a process that indirectly regulates the CPU
usage in the system. The idea is that a main application calls
function
request/0
before starting a major job and
proceeds with the job if the return value is positive; otherwise
the job must not be started.
overload
is part of the SASL
application and all
configuration parameters are defined there.
A set of two intensities are maintained, the total intensity
and the accept intensity
. For that purpose,
there are two configuration parameters, MaxIntensity
and Weight
; both are measured in 1/second.
Then total and accept intensities are calculated as
follows. Assume that the time of the current call to
request/0
is T(n)
and that the time of the
previous call was T(n-1)
.
-
The current
total intensity
, denotedTI(n)
, is calculated according to the formulaTI(n) = exp(-Weight*(T(n) - T(n-1)) * TI(n-1) + Weight
,where
TI(n-1)
is the previoustotal intensity
. -
The current
accept intensity
, denotedAI(n)
, is determined by the formulaAI(n) = exp(-Weight*(T(n) - T(n-1)) * AI(n-1) + Weight
,where
AI(n-1)
is the previousaccept intensity
, if the value ofexp(-Weight*(T(n) - T(n-1)) * AI(n-1)
is less thanMaxIntensity
. Otherwise the value isAI(n) = exp(-Weight*(T(n) - T(n-1)) * AI(n-1)
The value of configuration parameter Weight
controls the
speed with which the calculations of intensities react to
changes in the underlying input intensity. The inverted value of
Weight
, T = 1/Weight
, can be thought of as the
"time constant" of the intensity calculation formulas. For example,
if Weight = 0.1
, a change in the underlying input intensity is
reflected in total intensity
and accept intensity
within
about 10 seconds.
The overload process defines one alarm, which it sets using
alarm_handler:set_alarm(Alarm)
. Alarm
is defined
as follows:
{overload, []}
This alarm is set when the current accept intensity
exceeds
MaxIntensity
.
A new request is not accepted until the current accept
intensity
has fallen below MaxIntensity
. To prevent the
overload process from generating many set/reset alarms, the
alarm is not reset until the current accept intensity
has fallen
below 75% of MaxIntensity
; it is not until then that
the alarm can be set again.
Functions
request() -> accept | reject
Returns accept
or reject
depending on the
current value of the accept intensity
.
The application
calling this function is to proceed with the job in
question if the return value is accept
; otherwise it
is not to continue with that job.
get_overload_info() -> OverloadInfo
OverloadInfo = [{total_intensity, TotalIntensity}, {accept_intensity, AcceptIntensity}, {max_intensity, MaxIntensity}, {weight, Weight}, {total_requests, TotalRequests}, {accepted_requests, AcceptedRequests}].
TotalIntensity = float() > 0
AcceptIntensity = float() > 0
MaxIntensity = float() > 0
Weight = float() > 0
TotalRequests = integer()
AcceptedRequests = integer()
Returns:
- Current total and accept intensities
- Configuration parameters
- Absolute counts of the total number of requests
- Accepted number of requests (since the overload process was started)