Scheduler: develop scheme for capacity redirection
...to make that abundantly clear: we do not aim at precision timing, rather the goal is to redistribute capacity currently not usable... Basically we're telling the worker "nothing to do right now, sorry, but check back in <timespan> because I may need you then"
This commit is contained in:
parent
08c13ed6fe
commit
3eaf623e98
3 changed files with 196 additions and 10 deletions
|
|
@ -143,7 +143,7 @@ namespace gear {
|
|||
{ }
|
||||
|
||||
private:
|
||||
Wiring wiring_;
|
||||
const Wiring wiring_;
|
||||
|
||||
TimeVar tendedHead_{Time::ANYTIME};
|
||||
public:
|
||||
|
|
@ -209,10 +209,31 @@ namespace gear {
|
|||
}
|
||||
|
||||
|
||||
Time
|
||||
scatteredDelayTime (Capacity capacity)
|
||||
Offset
|
||||
scatteredDelayTime (Time now, Capacity capacity)
|
||||
{
|
||||
UNIMPLEMENTED ("establish a randomised targeted delay time");
|
||||
auto scatter = [&](Duration horizon)
|
||||
{
|
||||
size_t step = 1;////////////////////////////////////////////////////TODO implement randomisation
|
||||
return Offset{_raw(horizon) * step / wiring_.maxCapacity};
|
||||
};
|
||||
|
||||
switch (capacity) {
|
||||
case DISPATCH:
|
||||
return Offset::ZERO;
|
||||
case SPINTIME:
|
||||
return Offset::ZERO;
|
||||
case TENDNEXT:
|
||||
return Offset{tendedHead_-now};
|
||||
case NEARTIME:
|
||||
return Offset{tendedHead_-now + scatter(WORK_HORIZON)};
|
||||
case WORKTIME:
|
||||
return Offset{tendedHead_-now + scatter(SLEEP_HORIZON)};
|
||||
case IDLETIME:
|
||||
return /*without start offset*/ scatter(SLEEP_HORIZON);
|
||||
default:
|
||||
NOTREACHED ("uncovered work capacity classification.");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
|
||||
#include "lib/test/run.hpp"
|
||||
#include "vault/gear/load-controller.hpp"
|
||||
#include "vault/real-clock.hpp"
|
||||
//#include "lib/time/timevalue.hpp"
|
||||
//#include "lib/format-cout.hpp"
|
||||
//#include "lib/util.hpp"
|
||||
|
|
@ -34,7 +35,7 @@
|
|||
//#include <utility>
|
||||
|
||||
using test::Test;
|
||||
//using std::move;
|
||||
using std::move;
|
||||
//using util::isSameObject;
|
||||
|
||||
|
||||
|
|
@ -46,6 +47,7 @@ namespace test {
|
|||
// using lib::time::Offset;
|
||||
// using lib::time::Time;
|
||||
using Capacity = LoadController::Capacity;
|
||||
using Wiring = LoadController::Wiring;
|
||||
|
||||
|
||||
|
||||
|
|
@ -67,6 +69,7 @@ namespace test {
|
|||
classifyHorizon();
|
||||
tendNextActivity();
|
||||
classifyCapacity();
|
||||
scatteredReCheck();
|
||||
walkingDeadline();
|
||||
setupLalup();
|
||||
}
|
||||
|
|
@ -228,6 +231,34 @@ namespace test {
|
|||
}
|
||||
|
||||
|
||||
|
||||
/** @test verify the re-distribution of free capacity by targeted delay
|
||||
* @todo WIP 10/23 🔁 define ⟶ implement
|
||||
*/
|
||||
void
|
||||
scatteredReCheck()
|
||||
{
|
||||
Wiring setup;
|
||||
setup.maxCapacity = 16;
|
||||
LoadController lctrl{move(setup)};
|
||||
|
||||
auto isBetween = [](auto lo, auto hi, auto val)
|
||||
{
|
||||
return lo <= val and val < hi;
|
||||
};
|
||||
|
||||
TimeVar now = RealClock::now();
|
||||
Time next{now + FSecs(10)};
|
||||
lctrl.tendNext (next);
|
||||
CHECK (Time::ZERO == lctrl.scatteredDelayTime (now, Capacity::DISPATCH) );
|
||||
CHECK (Time::ZERO == lctrl.scatteredDelayTime (now, Capacity::SPINTIME) );
|
||||
CHECK ( next == lctrl.scatteredDelayTime (now, Capacity::TENDNEXT) );
|
||||
CHECK (isBetween ( next, next+WORK_HORIZON , lctrl.scatteredDelayTime (now, Capacity::NEARTIME)));
|
||||
CHECK (isBetween ( next, next+SLEEP_HORIZON, lctrl.scatteredDelayTime (now, Capacity::WORKTIME)));
|
||||
CHECK (isBetween (Time::ZERO, SLEEP_HORIZON , lctrl.scatteredDelayTime (now, Capacity::IDLETIME)));
|
||||
}
|
||||
|
||||
|
||||
/** @test TODO
|
||||
* @todo WIP 10/23 🔁 define ⟶ implement
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -82300,8 +82300,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
Parametrisierung: maxCapacity = <font face="Monospaced" color="#868686">work::Config::</font><font face="Monospaced" color="#3f2c83">COMPUTATION_CAPACITY</font>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1698090324855" ID="ID_1784536173" MODIFIED="1698090336812" TEXT="Zugriff auf BlockFlow-Auslastung">
|
||||
<icon BUILTIN="hourglass"/>
|
||||
|
|
@ -82728,6 +82727,119 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1697983546449" ID="ID_1801117774" MODIFIED="1698079545463" TEXT="scatteredDelayTime()">
|
||||
<icon BUILTIN="forward"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698093070813" ID="ID_940807400" MODIFIED="1698093078487" TEXT="Parameter">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1698093149583" ID="ID_1430906257" MODIFIED="1698093152974" TEXT="inhaltlich benötigt">
|
||||
<node CREATED="1698093101030" ID="ID_1059393148" MODIFIED="1698093114592" TEXT="Startpunkt"/>
|
||||
<node CREATED="1698093082201" ID="ID_1834606392" MODIFIED="1698093166710" TEXT="Zeitspanne"/>
|
||||
<node CREATED="1698093141241" ID="ID_1715483141" MODIFIED="1698093145868" TEXT="Bezugspunkt"/>
|
||||
<node CREATED="1698093116183" ID="ID_1914540136" MODIFIED="1698093121297" TEXT="Zufalls-Quelle"/>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1698093201025" ID="ID_511277140" MODIFIED="1698097593295" TEXT="Zeit-Datentyp?">
|
||||
<icon BUILTIN="help"/>
|
||||
<node CREATED="1698093265376" ID="ID_1783179603" MODIFIED="1698093269668" TEXT="Verwendungszweck">
|
||||
<node CREATED="1698093270800" ID="ID_1916220892" MODIFIED="1698093280466" TEXT="this_thread::sleep_for">
|
||||
<node CREATED="1698093301715" ID="ID_1918932110" MODIFIED="1698093307270" TEXT="braucht chrono::duration"/>
|
||||
<node CREATED="1698093343943" ID="ID_358242861" MODIFIED="1698093348872" TEXT="Genauigkeit ist implizit"/>
|
||||
</node>
|
||||
<node CREATED="1698093284117" ID="ID_840363847" MODIFIED="1698093288433" TEXT="this_thread::sleep_until">
|
||||
<node CREATED="1698093289757" ID="ID_1416947114" MODIFIED="1698093315397" TEXT="braucht chrono::time_point"/>
|
||||
<node CREATED="1698093292997" ID="ID_727329476" MODIFIED="1698093300063" TEXT="per Typ an die unterliegende Clock gebunden"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1698093350477" ID="ID_371292667" MODIFIED="1698093353800" TEXT="Kontext">
|
||||
<node CREATED="1698093354789" ID="ID_1741496299" MODIFIED="1698093371688" TEXT="der gesamte Scheduler verwendet lumiera::Time"/>
|
||||
<node CREATED="1698093376559" ID="ID_633041348" MODIFIED="1698093384628" TEXT="das sind µ-Ticks">
|
||||
<icon BUILTIN="info"/>
|
||||
<node CREATED="1698093411613" ID="ID_1048787060" MODIFIED="1698093507603" TEXT="Genauigkeit ist grenzwertig">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
Die Zeitangaben im std::chrono-Framework reichen bis in den Nano-Bereich, und es gibt einen high-precision-Timer
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
<node CREATED="1698093418798" ID="ID_1005113032" MODIFIED="1698097058330" TEXT="aber für derzeitige ⚠ Systeme hinreichend">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...andererseits weiß ich, daß man schon einfachste Scheduling-Delays ab mindestens 400ns mißt, und daß das Starten eines Thread auf meinem System mindestens 100µs braucht. Der aktuelle Scheduler unter Linux (CFS) verwendet keine festen Time-Slices mehr, aber man versucht definitiv die Kontext-Switches zu minimieren. Latenzen oder Scheduling-Zyklen für normale (nicht-realtime)-Prozesse liegen im Bereich <b>von Millisekunden</b>. Andererseits arbeitet die C++-Chrono-Funktion sleep_for nachweislich <i>im Schnitt</i> bis in den zweistelligen µs-Bereich genau
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
<node CREATED="1698097066647" ID="ID_486321067" MODIFIED="1698097088638" TEXT="Anwendungszweck ist Kapazitäts-Verteilung">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1698097112840" ID="ID_512066576" MODIFIED="1698097575285" TEXT="Fazit: bei Lumiera-Zeittypen bleiben">
|
||||
<arrowlink COLOR="#8494c7" DESTINATION="ID_1504658001" ENDARROW="Default" ENDINCLINATION="-3062;-49;" ID="Arrow_ID_1741608203" STARTARROW="None" STARTINCLINATION="1460;105;"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1698097633547" HGAP="9" ID="ID_454818161" MODIFIED="1698097650675" TEXT="⟹ Schlußfolgerungen" VSHIFT="8">
|
||||
<node CREATED="1698097652193" ID="ID_507081898" MODIFIED="1698097676649" TEXT="brauche an irgend einem Ende die aktuelle Zeit"/>
|
||||
<node CREATED="1698097678445" ID="ID_1655075680" LINK="#ID_102946038" MODIFIED="1698097733701" TEXT="diese aktuelle Zeit sollte auch als Zufalls-Quelle dienen"/>
|
||||
<node CREATED="1698097835356" ID="ID_1972633500" MODIFIED="1698097847906" TEXT="aus Performance-Gründen sollte diese Zeit ein Parameter sein"/>
|
||||
<node CREATED="1698097848806" ID="ID_1030706126" MODIFIED="1698097864752" TEXT="dagegen den Bezugspunkt kann man aus tended-next gewinnen"/>
|
||||
<node CREATED="1698097910006" ID="ID_1800439542" MODIFIED="1698100816307">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
die Funktion liefert eine <b>Duration</b>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<arrowlink DESTINATION="ID_735254473" ENDARROW="Default" ENDINCLINATION="-57;47;" ID="Arrow_ID_806787669" STARTARROW="None" STARTINCLINATION="69;10;"/>
|
||||
<icon BUILTIN="forward"/>
|
||||
<node CREATED="1698097935810" ID="ID_1458098203" MODIFIED="1698097945269" TEXT="in µ-Tick-Auflösung"/>
|
||||
<node CREATED="1698097946017" ID="ID_1013671224" MODIFIED="1698097965475" TEXT="⟶ chrono::microseconds"/>
|
||||
<node CREATED="1698100685330" ID="ID_735254473" MODIFIED="1698100816307" TEXT="naja... Offset geht auch...">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...und spart einen zusätzlichen clamp-Schritt und den Absolutwert (den das OS sowiso machen wird)
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<linktarget COLOR="#a9b4c1" DESTINATION="ID_735254473" ENDARROW="Default" ENDINCLINATION="-57;47;" ID="Arrow_ID_806787669" SOURCE="ID_1800439542" STARTARROW="None" STARTINCLINATION="69;10;"/>
|
||||
<icon BUILTIN="smiley-oh"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1698101257233" ID="ID_254738750" MODIFIED="1698101462139" TEXT="Implementierung">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1698101262893" ID="ID_664525403" MODIFIED="1698101459058" TEXT="läuft auf eine Fallunterscheidung hinaus">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1698101300800" ID="ID_1888321367" MODIFIED="1698101337767" TEXT="jetzt ⟼ nix"/>
|
||||
<node CREATED="1698101338355" ID="ID_43153407" MODIFIED="1698101370639" TEXT="TENDNEXT ist logischerweise ⟼ Δ next"/>
|
||||
<node CREATED="1698101372287" ID="ID_1451931012" MODIFIED="1698101450569" TEXT="NEARTIME ⟼ Δ + scatter WORK_HORIZON"/>
|
||||
<node CREATED="1698101394396" ID="ID_144988262" MODIFIED="1698101446121" TEXT="WORKTIME ⟼ Δ + scatter SLEEP_HORIZON"/>
|
||||
<node CREATED="1698101413705" ID="ID_1574790196" MODIFIED="1698101438499" TEXT="IDLETIME ⟼ ebenso, aber ohne Δ"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1698101272892" ID="ID_826560450" MODIFIED="1698101293954" TEXT="Randomisierung per Zeit">
|
||||
<icon BUILTIN="flag-pink"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -90370,6 +90482,9 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1697982054792" ID="ID_712555328" MODIFIED="1697982065291" TEXT="wieviele Activities werden von Schläfern übernommen"/>
|
||||
<node CREATED="1697982086540" ID="ID_1123632550" MODIFIED="1697982105925" TEXT="waiting-due time speziell wenn von Schläfer übernommen"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1698097719743" ID="ID_102946038" MODIFIED="1698097741666" TEXT="Güte der Randomisierung per Systemzeit prüfen">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697981156144" ID="ID_190534528" MODIFIED="1697981425435" TEXT="Datenerfassung über EngineObserver realisieren">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
|
|
@ -90903,7 +91018,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1687652249218" ID="ID_1174002353" MODIFIED="1687652266192" TEXT="Overload und Prioritäts-Klassen">
|
||||
<node CREATED="1687652249218" ID="ID_1174002353" MODIFIED="1698097252826" TEXT="Laststeuerung und Prioritäts-Klassen">
|
||||
<node CREATED="1687652267839" ID="ID_739691729" LINK="https://en.wikipedia.org/wiki/Earliest_deadline_first_scheduling" MODIFIED="1687652334909" TEXT="was wir hier machen ist analog EDS">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
|
|
@ -90930,6 +91045,25 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1698097270027" ID="ID_1129105536" MODIFIED="1698097290884" TEXT="Timing-Genauigkeit">
|
||||
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1698097298079" ID="ID_578937577" MODIFIED="1698097305903" TEXT="was brauchen wir wirklich?">
|
||||
<icon BUILTIN="help"/>
|
||||
</node>
|
||||
<node CREATED="1698097312895" ID="ID_1679874959" MODIFIED="1698097325877" TEXT="System-Gegebenheiten">
|
||||
<icon BUILTIN="info"/>
|
||||
<node CREATED="1698097328174" ID="ID_80995931" MODIFIED="1698097345126" TEXT="die std::chrono - Implementierungen schlagen sich ganz ordentlich"/>
|
||||
<node CREATED="1698097345681" ID="ID_1504658001" MODIFIED="1698097575285" TEXT="aber ohne weitere Maßnahmen kann man keine Genauigkeiten unter 1ms erwarten">
|
||||
<linktarget COLOR="#8494c7" DESTINATION="ID_1504658001" ENDARROW="Default" ENDINCLINATION="-3062;-49;" ID="Arrow_ID_1741608203" SOURCE="ID_512066576" STARTARROW="None" STARTINCLINATION="1460;105;"/>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node CREATED="1698097389049" ID="ID_600802835" MODIFIED="1698097410164" TEXT="es gibt high-resolution time sources im Kernel und die chrono::high_resolution_clock">
|
||||
<node CREATED="1698097412552" ID="ID_35271353" MODIFIED="1698097417835" TEXT="damit kann man Spinnen"/>
|
||||
<node CREATED="1698097418447" ID="ID_589008501" MODIFIED="1698097427939" TEXT="ob man das soll ist eine andere Frage">
|
||||
<icon BUILTIN="smiley-oh"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1693499887783" ID="ID_1870927644" MODIFIED="1693499914940" TEXT="für später...">
|
||||
<icon BUILTIN="hourglass"/>
|
||||
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1693499916691" ID="ID_1453759334" MODIFIED="1693499934621" TEXT="zu überprüfen">
|
||||
|
|
@ -95388,7 +95522,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1482365415326" HGAP="71" ID="ID_886002365" MODIFIED="1557498707240" TEXT="Standard C++" VSHIFT="-25">
|
||||
<node CREATED="1688646174430" ID="ID_1246578113" MODIFIED="1688646186652" TEXT="base language knowledge">
|
||||
<icon BUILTIN="info"/>
|
||||
<node CREATED="1688646188508" ID="ID_464419365" MODIFIED="1688648419999" TEXT="POD and unions">
|
||||
<node CREATED="1688646188508" FOLDED="true" ID="ID_464419365" MODIFIED="1688648419999" TEXT="POD and unions">
|
||||
<linktarget COLOR="#534e96" DESTINATION="ID_464419365" ENDARROW="Default" ENDINCLINATION="-729;124;" ID="Arrow_ID_1095556572" SOURCE="ID_683405596" STARTARROW="None" STARTINCLINATION="-1826;106;"/>
|
||||
<node CREATED="1688646230670" ID="ID_1200807820" MODIFIED="1688646259534" TEXT="POD ⟺ „no compiler magic happens“">
|
||||
<node CREATED="1688646260810" ID="ID_1731163706" LINK="https://stackoverflow.com/a/146589" MODIFIED="1688646437208" TEXT="basic built-in types and aggretates thereof"/>
|
||||
|
|
@ -95590,7 +95724,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1695776592132" ID="ID_1103669600" LINK="https://en.cppreference.com/w/cpp/language/class_template_argument_deduction#Deduction_for_class_templates" MODIFIED="1695779285785" TEXT="via Class Template Argument Deduction (CTAD)">
|
||||
<node CREATED="1695776592132" FOLDED="true" ID="ID_1103669600" LINK="https://en.cppreference.com/w/cpp/language/class_template_argument_deduction#Deduction_for_class_templates" MODIFIED="1695779285785" TEXT="via Class Template Argument Deduction (CTAD)">
|
||||
<linktarget COLOR="#7c86a6" DESTINATION="ID_1103669600" ENDARROW="Default" ENDINCLINATION="-1340;79;" ID="Arrow_ID_344305057" SOURCE="ID_505417061" STARTARROW="None" STARTINCLINATION="-2530;150;"/>
|
||||
<linktarget COLOR="#7c86a6" DESTINATION="ID_1103669600" ENDARROW="Default" ENDINCLINATION="-1340;79;" ID="Arrow_ID_171962477" SOURCE="ID_313781081" STARTARROW="None" STARTINCLINATION="-729;83;"/>
|
||||
<node CREATED="1695776635546" ID="ID_536392621" MODIFIED="1695776837788" TEXT="geht normalerweise nicht — da keine »universelle Referenz«">
|
||||
|
|
|
|||
Loading…
Reference in a new issue