Scheduler: processing of peak loads works

This is the first kind of integration,
albeit still with a synthetic load.

- placed two excessive load peaks in the scheduling timeline
- verified load behaviour
- verified timings
- verified that the scheduler shuts down automatically when done
This commit is contained in:
Fischlurch 2023-11-01 03:23:55 +01:00
parent 4937577557
commit 5c5dc40f3f
5 changed files with 240 additions and 125 deletions

View file

@ -79,6 +79,13 @@
** Since the scheduler queue only stores references to render activities, which are
** allocated in a [special arrangement](\ref BlockFlow) exploiting the known deadline
** time of each task, further processing can commence concurrently.
** @note The grooming-token should always be dropped by a deliberate state transition.
** Notably _internal processing_ (e.g. planning of new jobs) will _not_ drop
** the token, since it must be able to change the schedule. Such internal
** tasks can be processed in row and will be confined to a single thread
** (there is a special treatment at the end of #getWork() to achieve that).
** As a safety net, the grooming-token will automatically be dropped after
** catching an exception, or when a thread is sent to sleep.
**
** @see SchedulerService_test Component integration test
** @see SchedulerStress_test
@ -108,7 +115,6 @@
//#include "lib/symbol.hpp"
#include "lib/nocopy.hpp"
//#include "lib/util.hpp"
#include "lib/format-cout.hpp"/////////////////TODO
//#include <string>
#include <utility>
@ -264,7 +270,7 @@ namespace gear {
/** send this thread into a targeted short-time wait. */
activity::Proc scatteredDelay (Time now, LoadController::Capacity,bool in);////////////TODO
activity::Proc scatteredDelay (Time now, LoadController::Capacity);
/**
@ -411,7 +417,7 @@ namespace gear {
Time now = ctx.getSchedTime();
Time head = layer1_.headTime();
return scatteredDelay(now,
loadControl_.markIncomingCapacity (head,now),true);
loadControl_.markIncomingCapacity (head,now));
})
.performStep([&]{
Time now = ctx.getSchedTime();
@ -422,7 +428,7 @@ namespace gear {
Time now = ctx.getSchedTime();
Time head = layer1_.headTime();
return scatteredDelay(now,
loadControl_.markOutgoingCapacity (head,now),false);
loadControl_.markOutgoingCapacity (head,now));
});
// ensure lock clean-up
@ -454,7 +460,7 @@ namespace gear {
* place the current thread into a short-term targeted sleep.
*/
inline activity::Proc
Scheduler::scatteredDelay (Time now, LoadController::Capacity capacity, bool in)
Scheduler::scatteredDelay (Time now, LoadController::Capacity capacity)
{
auto doTargetedSleep = [&]
{ // ensure not to block the Scheduler after management work
@ -463,11 +469,7 @@ namespace gear {
layer2_.dropGroomingToken();
// relocate this thread(capacity) to a time where its more useful
Offset targetedDelay = loadControl_.scatteredDelayTime (now, capacity);
TimeVar head = layer1_.headTime()-now;
cout <<"\n|oo|"<<(in?"^":"v")<<" Sleep-->"<<_raw(targetedDelay)<<" <head:"<<_raw(head);
std::this_thread::sleep_for (std::chrono::microseconds (_raw(targetedDelay)));
head = layer1_.headTime()-now;
cout <<"\n|••|"<<(in?"^":"v")<<" eep<--"<<_raw(targetedDelay)<<" <head:"<<_raw(head);
};
auto doTendNextHead = [&]
{
@ -486,10 +488,6 @@ cout <<"\n|••|"<<(in?"^":"v")<<" eep<--"<<_raw(targetedDelay)<<" <head:"<
std::this_thread::yield();
return activity::SKIP; // prompts to abort chain but call again immediately
case LoadController::IDLEWAIT:
{
Time head = layer1_.headTime()-now;
cout <<"\n|**|"<<(in?"^":"v")<<" --------------------------------------------Deep-Sleep--> <head:"<<_raw(head);
}
return activity::WAIT; // prompts to switch this thread into sleep mode
case LoadController::TENDNEXT:
doTendNextHead();

View file

@ -182,6 +182,7 @@ namespace test {
LoadController lctrl;
Time next{0,10};
Time nil{Time::NEVER};
Time mt{1,0};
Time t1{0,9};
@ -197,6 +198,7 @@ namespace test {
lctrl.tendNext (next);
CHECK (Capacity::WORKTIME == lctrl.markOutgoingCapacity (next, mt ));
CHECK (Capacity::WORKTIME == lctrl.markOutgoingCapacity ( nil, mt ));
CHECK (Capacity::WORKTIME == lctrl.markOutgoingCapacity (next, t1 ));
CHECK (Capacity::WORKTIME == lctrl.markOutgoingCapacity (next, t2 ));
CHECK (Capacity::NEARTIME == lctrl.markOutgoingCapacity (next, t3 ));
@ -205,7 +207,7 @@ namespace test {
CHECK (Capacity::DISPATCH == lctrl.markOutgoingCapacity (next,next));
CHECK (Capacity::DISPATCH == lctrl.markOutgoingCapacity (next, t5 ));
CHECK (Capacity::IDLEWAIT == lctrl.markIncomingCapacity (next, mt ));
CHECK (Capacity::IDLEWAIT == lctrl.markIncomingCapacity ( nil, mt ));
CHECK (Capacity::IDLEWAIT == lctrl.markIncomingCapacity (next, t1 ));
CHECK (Capacity::IDLEWAIT == lctrl.markIncomingCapacity (next, t2 ));
CHECK (Capacity::NEARTIME == lctrl.markIncomingCapacity (next, t3 ));
@ -215,8 +217,8 @@ namespace test {
CHECK (Capacity::DISPATCH == lctrl.markIncomingCapacity (next, t5 ));
// tend-next works in limited ways also on incoming capacity
lctrl.tendNext (Time::NEVER);
CHECK (Capacity::IDLEWAIT == lctrl.markIncomingCapacity (next, mt ));
lctrl.tendNext (Time::NEVER); // mark as not yet tended...
CHECK (Capacity::IDLEWAIT == lctrl.markIncomingCapacity ( nil, mt ));
CHECK (Capacity::IDLEWAIT == lctrl.markIncomingCapacity (next, t1 ));
CHECK (Capacity::IDLEWAIT == lctrl.markIncomingCapacity (next, t2 ));
CHECK (Capacity::TENDNEXT == lctrl.markIncomingCapacity (next, t3 ));
@ -226,7 +228,7 @@ namespace test {
CHECK (Capacity::DISPATCH == lctrl.markIncomingCapacity (next, t5 ));
// while being used rather generously on outgoing capacity
CHECK (Capacity::TENDNEXT == lctrl.markOutgoingCapacity (next, mt ));
CHECK (Capacity::WORKTIME == lctrl.markOutgoingCapacity ( nil, mt )); // re-randomisation before long-term sleep
CHECK (Capacity::TENDNEXT == lctrl.markOutgoingCapacity (next, t1 ));
CHECK (Capacity::TENDNEXT == lctrl.markOutgoingCapacity (next, t2 ));
CHECK (Capacity::TENDNEXT == lctrl.markOutgoingCapacity (next, t3 ));

View file

@ -30,6 +30,7 @@
#include "vault/gear/scheduler.hpp"
#include "lib/time/timevalue.hpp"
#include "lib/format-cout.hpp"
#include "lib/format-string.hpp"
#include "lib/test/microbenchmark.hpp"
#include "lib/test/diagnostic-output.hpp"///////////////TODO
#include "lib/util.hpp"
@ -48,7 +49,9 @@ namespace test {
// using lib::time::FrameRate;
// using lib::time::Offset;
using util::max;
using util::isnil;
using util::_Fmt;
using lib::time::Time;
using std::this_thread::sleep_for;
@ -58,7 +61,7 @@ namespace test {
Time t500us = t200us + t200us + t100us;
Time t1ms = Time{1,0};
const uint TYPICAL_TIME_FOR_ONE_SCHEDULE_us = 20;
const uint TYPICAL_TIME_FOR_ONE_SCHEDULE_us = 3;
}
@ -133,9 +136,20 @@ namespace test {
/** @test TODO verify the scheduler processes and winds down automatically
/** @test verify the scheduler processes scheduled events,
* indicates current load and winds down automatically
* when falling empty.
* @todo WIP 10/23 define 🔁 implement
* - placing short bursts of single FEED-Activities
* - these actually do nothing and can be processed typically < 5µs
* - placing them spaced by 1µs, so the scheduler will build up congestion
* - since this Activity does not drop the »grooming-token«, actually only
* a single worker will process all Activities in a single peak
* - after the peak is done, the load indicator will drop again
* - when reaching the scheduler »tick«, the queue should be empty
* and the scheduler will stop active processing
* - the main thread (this test) polls every 50µs to observe the load
* - verify the expected load pattern
* @todo WIP 10/23 define implement
*/
void
verify_LoadFactor()
@ -145,12 +159,14 @@ namespace test {
Scheduler scheduler{bFlow, watch};
CHECK (isnil (scheduler));
// use a single FEED as content
Activity dummy{Activity::FEED};
auto anchor = RealClock::now();
auto wuff = [&](Time when =RealClock::now()){ return _raw(when) - _raw(anchor); };
auto createLoad = [&](Offset start, uint cnt)
{ // use internal API (this test is declared as friend)
auto offset = [&](Time when =RealClock::now()){ return _raw(when) - _raw(anchor); };
auto createLoad = [&](Offset start, uint cnt)
{ // use internal API (this test is declared as friend)
auto& schedCtx = Scheduler::ExecutionCtx::from(scheduler);
for (uint i=0; i<cnt; ++i) // flood the queue
schedCtx.post (anchor + start + TimeValue{i}, &dummy, schedCtx);
@ -158,24 +174,97 @@ auto wuff = [&](Time when =RealClock::now()){ return _raw(when) - _raw(anchor);
auto LOAD_PEAK_DURATION_us = 2000;
auto fatPackage = work::Config::COMPUTATION_CAPACITY * LOAD_PEAK_DURATION_us/TYPICAL_TIME_FOR_ONE_SCHEDULE_us;
SHOW_EXPR(wuff())
SHOW_EXPR(wuff(scheduler.layer1_.headTime()))
createLoad (Offset{Time{5,0}}, fatPackage);
auto fatPackage = LOAD_PEAK_DURATION_us/TYPICAL_TIME_FOR_ONE_SCHEDULE_us;
createLoad (Offset{Time{ 5,0}}, fatPackage);
createLoad (Offset{Time{15,0}}, fatPackage);
SHOW_EXPR(wuff())
scheduler.ignite();
SHOW_EXPR(wuff())
SHOW_EXPR(wuff(scheduler.layer1_.headTime()))
while (not isnil (scheduler))
cout << "Timing: start-up required..."<<offset()<<"µs"<<endl;
// now watch change of load and look out for two peaks....
uint peak1_s =0;
uint peak1_dur=0;
double peak1_max=0;
uint peak2_s =0;
uint peak2_dur=0;
double peak2_max=0;
uint phase=0;
_Fmt row{"%6d | Load: %5.3f Head:%5d Lag:%6d\n"};
while (not isnil (scheduler)) // should fall empty at end
{
sleep_for(50us);
cout << wuff() << " +++ Load: "<<scheduler.getLoadIndicator()
<<" --- HT= "<<wuff(scheduler.layer1_.headTime())
<<" -+- Lag "<< scheduler.loadControl_.averageLag()
<<endl;
double load = scheduler.getLoadIndicator();
switch (phase) {
case 0:
if (load > 1.0)
{
++phase;
peak1_s = offset();
}
break;
case 1:
peak1_max = max (load, peak1_max);
if (load < 1.0)
{
++phase;
peak1_dur = offset() - peak1_s;
}
break;
case 2:
if (load > 1.0)
{
++phase;
peak2_s = offset();
}
break;
case 3:
peak2_max = max (load, peak2_max);
if (load < 1.0)
{
++phase;
peak2_dur = offset() - peak2_s;
}
break;
}
cout << row % offset() % load
% offset(scheduler.layer1_.headTime())
% scheduler.loadControl_.averageLag();
}
uint done = offset();
//--------Summary-Table------------------------------
_Fmt peak{"\nPeak %d ....... %5d +%dµs %34tmax=%3.1f"};
cout << "-------+-------------+----------+----------"
<< "\n\n"
<< peak % 1 % peak1_s % peak1_dur % peak1_max
<< peak % 2 % peak2_s % peak2_dur % peak2_max
<< "\nTick ....... "<<done
<<endl;
CHECK (phase == 4);
CHECK (peak1_s > 5000); // first peak was scheduled at 5ms
CHECK (peak1_s < 10000);
CHECK (peak2_s > 15000); // second peak was scheduled at 15ms
CHECK (peak2_s < 20000);
CHECK (peak1_max > 2.0);
CHECK (peak2_max > 2.0);
CHECK (done > 50000); // »Tick« period is 50ms
// and this tick should determine end of timeline
cout << "\nwaiting for shutdown of WorkForce";
while (scheduler.workForce_.size() > 0)
{
sleep_for(10ms);
cout << "." << std::flush;
}
uint shutdown = offset();
cout << "\nShutdown after "<<shutdown / 1.0e6<<"sec"<<endl;
CHECK (shutdown > 2.0e6);
}

View file

@ -7201,7 +7201,7 @@ The Scheduler is now considered an implementation-level facility with an interfa
&amp;rarr; [[Workers|SchedulerWorker]]
</pre>
</div>
<div title="SchedulerLoadControl" creator="Ichthyostega" modifier="Ichthyostega" created="202310240240" modified="202310272133" tags="Rendering operational spec draft" changecount="48">
<div title="SchedulerLoadControl" creator="Ichthyostega" modifier="Ichthyostega" created="202310240240" modified="202311010317" tags="Rendering operational spec draft" changecount="60">
<pre>The scheduling mechanism //requires active control of work parameters to achieve good performance on average.//
In a nutshell, the scheduler arranges planned [[render activities|RenderActivity]] onto a time axis -- and is complemented by an [[active »work force«|SchedulerWorker]] to //pull and retrieve// the most urgent next task when free processing capacity becomes available. This arrangement shifts focus from the //management of tasks// towards the //management of capacity// -- which seems more adequate, given that capacity is scarce while tasks are abundant, yet limited in size and processed atomically.
@ -7226,6 +7226,18 @@ Drawing upon these principles, the treatment of worker calls can be aligned to t
# beyond that, capacity can be redirected into a focussed zone behind the head
# and if the head is far away, capacity is transitioned into the reserve segment
Worker capacity events can be further distinguished into //incoming capacity// and //outgoing capacity.// The latter is the most desirable transition, since it corresponds to a worker just returning from a computation task, while incoming capacity stems from workers calling back after a sleep period. Thus a high priority is placed on re-assigning the outgoing capacity immediately back to further active work, while for incoming capacity there is a preference to send it back to sleep. A worker placed into the sleeping reserve for an extended stretch of time can be considered excess capacity and will be removed from the [[work force|SchedulerWorker]]. This kind of asymmetry creates a cascading flow, and allows in the end to synthesise an average load factor, which in turn can be used to regulate the Engine on a global level. If scheduling is overloaded, increasing the slip of planned timings, more capacity might be added back when available, or the planning process should be throttled accordingly.
!!!Capacity redistribution scheme
The effective behaviour results from the collaboration of {{{Scheduler::scatteredDelay()}}} with the {{{LoadController}}}. Redistribution can happen on //incoming capacity// (before the actual dispatch) and on //outgoing capacity//. After a »targeted sleep«, the thread is sent back with {{{PASS}}} and will thus immediately re-enter the capacity decision logic. The actual decision is then based on the current distance to the scheduler's »head element«
|!next head|!|&gt;|!incoming|&gt;|!outgoing|
|~|!distance|!tend-next|!regular|!tend-next|!regular|
|unknown | ∞| IDLEWAIT | IDLEWAIT | WORKTIME | WORKTIME |
|sleep-horizon | &gt;20ms| IDLEWAIT | IDLEWAIT | TENDNEXT | WORKTIME |
|work-horizon | &gt;5ms| IDLEWAIT | IDLEWAIT | TENDNEXT | WORKTIME |
|near-horizon | &gt;50µs| TENDNEXT | NEARTIME | TENDNEXT | NEARTIME |
|imminent | &gt;now| SPINTIME | SPINTIME | SPINTIME | SPINTIME |
|past | &lt;now| DISPATCH | DISPATCH| DISPATCH | DISPATCH |
|case matrix for capacity redistribution|c
&amp;rarr; please have a look at {{{SchedulerLoadControl_test::classifyCapacity}}}
!!!Playback and processing priority
Not all tasks are on equal footing though. Given the diverse nature of functions fulfilled by the render engine, several kinds of render processes can be distinguished:

View file

@ -82566,7 +82566,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1697663918107" ID="ID_210862409" MODIFIED="1697675123151" TEXT="Load-Controller vorsehen">
<linktarget COLOR="#af587f" DESTINATION="ID_210862409" ENDARROW="Default" ENDINCLINATION="-33;645;" ID="Arrow_ID_204955453" SOURCE="ID_1110932778" STARTARROW="None" STARTINCLINATION="250;17;"/>
<linktarget COLOR="#5898af" DESTINATION="ID_210862409" ENDARROW="Default" ENDINCLINATION="-33;645;" ID="Arrow_ID_204955453" SOURCE="ID_1110932778" STARTARROW="None" STARTINCLINATION="250;17;"/>
<linktarget COLOR="#75769b" DESTINATION="ID_210862409" ENDARROW="Default" ENDINCLINATION="-667;72;" ID="Arrow_ID_1800712901" SOURCE="ID_464175339" STARTARROW="None" STARTINCLINATION="-540;37;"/>
<icon BUILTIN="flag-pink"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1697808322602" ID="ID_1787549088" MODIFIED="1697808340997" TEXT="Entwickelt sich wohl in Richtung einer Steuerzentrale">
@ -82648,9 +82648,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1697808357389" ID="ID_1714344789" MODIFIED="1697808392696" TEXT="Signal-fusion in gemeinsamen Load-Indikator">
<icon BUILTIN="bell"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1698632383220" ID="ID_716182887" MODIFIED="1698632491040" TEXT="Last-Sch&#xe4;tzung entwickeln">
<node COLOR="#338800" CREATED="1698632383220" ID="ID_716182887" MODIFIED="1698808105730" TEXT="Last-Sch&#xe4;tzung entwickeln">
<arrowlink COLOR="#4a5982" DESTINATION="ID_846411589" ENDARROW="Default" ENDINCLINATION="-55;-589;" ID="Arrow_ID_1233923536" STARTARROW="None" STARTINCLINATION="-390;272;"/>
<icon BUILTIN="pencil"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1698632501888" FOLDED="true" ID="ID_334185073" MODIFIED="1698715205196" TEXT="1. Idee : WorkForce::size()">
<node CREATED="1698632520658" ID="ID_1308650674" MODIFIED="1698632625312" TEXT="funktioniert so lala">
<richcontent TYPE="NOTE"><html>
@ -82910,9 +82910,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698544547801" ID="ID_1011726550" MODIFIED="1698544832553" TEXT="regelm&#xe4;&#xdf;ige Integration / state fusion">
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1698544547801" ID="ID_1011726550" MODIFIED="1698808129018" TEXT="regelm&#xe4;&#xdf;ige Integration / state fusion">
<linktarget COLOR="#9e4279" DESTINATION="ID_1011726550" ENDARROW="Default" ENDINCLINATION="235;181;" ID="Arrow_ID_1299019434" SOURCE="ID_897465919" STARTARROW="None" STARTINCLINATION="425;-47;"/>
<icon BUILTIN="flag-yellow"/>
<icon BUILTIN="hourglass"/>
<node CREATED="1698544656547" ID="ID_422887207" MODIFIED="1698544802405" TEXT="l&#xe4;uft (nur) im Tick &#x2014; k&#xf6;nnte daher Statistiken vom EngineObserver beziehen">
<arrowlink COLOR="#fefdd9" DESTINATION="ID_1280127725" ENDARROW="Default" ENDINCLINATION="-176;11;" ID="Arrow_ID_187765169" STARTARROW="None" STARTINCLINATION="-154;-113;"/>
<font NAME="SansSerif" SIZE="12"/>
@ -83078,7 +83078,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node CREATED="1697935467508" ID="ID_370682037" MODIFIED="1697935479215" TEXT="Reserve-Kapazit&#xe4;t bei Bedarf aktivieren">
<node COLOR="#435e98" CREATED="1697935467508" FOLDED="true" ID="ID_370682037" MODIFIED="1698808176629" TEXT="Reserve-Kapazit&#xe4;t bei Bedarf aktivieren">
<node CREATED="1697937331101" ID="ID_834796842" MODIFIED="1697938265914" TEXT="Scheduler mu&#xdf; (im Tick) erkennen, da&#xdf; er &#xfc;berlastet ist">
<arrowlink COLOR="#3c7bbb" DESTINATION="ID_250349956" ENDARROW="Default" ENDINCLINATION="15;-74;" ID="Arrow_ID_776284276" STARTARROW="None" STARTINCLINATION="190;10;"/>
</node>
@ -83175,11 +83175,11 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<font NAME="SansSerif" SIZE="16"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697940307771" ID="ID_844059029" MODIFIED="1697940319855" TEXT="Regulierungs-Schema (1.Wurf)">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1697940394533" ID="ID_785288479" MODIFIED="1697940402312" TEXT="Kriterium &#xbb;nichts zu tun&#xab;">
<node COLOR="#338800" CREATED="1697940307771" ID="ID_844059029" MODIFIED="1698808226960" TEXT="Regulierungs-Schema (1.Wurf)">
<icon BUILTIN="button_ok"/>
<node CREATED="1697940394533" FOLDED="true" ID="ID_785288479" MODIFIED="1698808255393" TEXT="Kriterium &#xbb;nichts zu tun&#xab;">
<node CREATED="1697940405507" ID="ID_994386789" MODIFIED="1697940450809" TEXT="hierzu den Abstand zur headTime beachten!"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697941259810" ID="ID_1031482347" MODIFIED="1697980089996" TEXT="den &#xbb;tended level&#xab; merken">
<node COLOR="#435e98" CREATED="1697941259810" ID="ID_1031482347" MODIFIED="1698808159628" TEXT="den &#xbb;tended level&#xab; merken">
<icon BUILTIN="idea"/>
<node CREATED="1697941294460" ID="ID_203013250" MODIFIED="1697941353814" TEXT="einen working Worker auf die headTime zielen"/>
<node CREATED="1697941360345" ID="ID_91924483" MODIFIED="1697941370127" TEXT="dieser ist damit schon f&#xfc;r den n&#xe4;chsten Task vorgemerkt"/>
@ -83193,7 +83193,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<arrowlink COLOR="#7f95ab" DESTINATION="ID_1280875799" ENDARROW="Default" ENDINCLINATION="10;121;" ID="Arrow_ID_1356077365" STARTARROW="None" STARTINCLINATION="284;21;"/>
</node>
</node>
<node CREATED="1697940327885" ID="ID_387348315" MODIFIED="1697941569266" TEXT="Unterscheidung working / idle">
<node CREATED="1697940327885" FOLDED="true" ID="ID_387348315" MODIFIED="1698808254259" TEXT="Unterscheidung working / idle">
<arrowlink COLOR="#6463c4" DESTINATION="ID_1844164309" ENDARROW="Default" ENDINCLINATION="-359;14;" ID="Arrow_ID_1762094389" STARTARROW="None" STARTINCLINATION="12;-45;"/>
<node CREATED="1697941581727" ID="ID_1655948334" MODIFIED="1697941591937" TEXT="working (=after work)">
<node CREATED="1697941593803" ID="ID_1548473253" MODIFIED="1697941694724" TEXT="headTime != tendedLevel &#x27f9; address headTime"/>
@ -83207,7 +83207,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1697941881102" ID="ID_1281507935" MODIFIED="1697941890218" TEXT="else: switch to sleep"/>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#420117" CREATED="1698020504097" ID="ID_1156275715" MODIFIED="1698432446373" TEXT="Bedeutung der Zeit-Ordnung">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#420117" CREATED="1698020504097" FOLDED="true" ID="ID_1156275715" MODIFIED="1698808252809" TEXT="Bedeutung der Zeit-Ordnung">
<icon BUILTIN="idea"/>
<node BACKGROUND_COLOR="#eada9f" COLOR="#990000" CREATED="1698020524734" ID="ID_1985773186" MODIFIED="1698432667093" TEXT="hier hilft eine probabilistische Betrachtung &#x27f6; Flow">
<arrowlink COLOR="#722322" DESTINATION="ID_1475863913" ENDARROW="Default" ENDINCLINATION="888;-37;" ID="Arrow_ID_1254135767" STARTARROW="None" STARTINCLINATION="741;41;"/>
@ -83244,8 +83244,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1697979808075" ID="ID_95576898" MODIFIED="1697982191396" TEXT="stattdessen: generische Prinzipien">
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697979825353" ID="ID_475190835" MODIFIED="1697982176624" TEXT="Punkte f&#xfc;r Flexibilit&#xe4;t vorsehen">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1697979825353" ID="ID_475190835" MODIFIED="1698808190135" TEXT="Punkte f&#xfc;r Flexibilit&#xe4;t vorsehen">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1697979852789" ID="ID_925253615" MODIFIED="1697982166711" TEXT="statistische Untersuchungen">
<arrowlink COLOR="#ffd3a8" DESTINATION="ID_1502196172" ENDARROW="Default" ENDINCLINATION="-417;-573;" ID="Arrow_ID_18099677" STARTARROW="None" STARTINCLINATION="-1881;175;"/>
@ -83258,20 +83258,21 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1697982413572" ID="ID_1701704976" MODIFIED="1697982424659" TEXT="Wartezyklen randomisieren"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697982430798" ID="ID_858120344" MODIFIED="1697982440269" TEXT="Implementierung">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697982445677" ID="ID_1503747441" MODIFIED="1697982460315" TEXT="Ankerpunkte">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697982430798" ID="ID_858120344" MODIFIED="1698808346681" TEXT="Implementierung">
<icon BUILTIN="button_ok"/>
<icon BUILTIN="hourglass"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1697982445677" ID="ID_1503747441" MODIFIED="1698808242557" TEXT="Ankerpunkte">
<icon BUILTIN="info"/>
<node CREATED="1697982488254" ID="ID_1839282150" MODIFIED="1697982492138" TEXT="incomingCapacity"/>
<node CREATED="1697982492782" ID="ID_1050821331" MODIFIED="1697982497641" TEXT="outgoingCapacity"/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1697982575563" ID="ID_1770606344" MODIFIED="1698078325355" TEXT="dispatchedCapacity">
<icon BUILTIN="help"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697982589257" HGAP="11" ID="ID_1783139757" MODIFIED="1697982614929" TEXT="pro-forma in den LoadController legen" VSHIFT="9">
<node COLOR="#435e98" CREATED="1697982589257" HGAP="11" ID="ID_1783139757" MODIFIED="1698808234515" TEXT="pro-forma in den LoadController legen" VSHIFT="9">
<icon BUILTIN="yes"/>
</node>
</node>
<node COLOR="#338800" CREATED="1697982455236" ID="ID_645321047" MODIFIED="1698519641737" TEXT="Schemata">
<node COLOR="#338800" CREATED="1697982455236" FOLDED="true" ID="ID_645321047" MODIFIED="1698808270767" TEXT="Schemata">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1697982678423" ID="ID_77969589" MODIFIED="1698072830497" TEXT="tendNext">
<icon BUILTIN="button_ok"/>
@ -83604,7 +83605,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698003862646" ID="ID_402749835" MODIFIED="1698003871297" TEXT="Integration mit...">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1698003871908" ID="ID_391492289" MODIFIED="1698519650070" TEXT="work-Function">
<node COLOR="#338800" CREATED="1698003871908" FOLDED="true" ID="ID_391492289" MODIFIED="1698808274682" TEXT="work-Function">
<arrowlink COLOR="#7779a3" DESTINATION="ID_492054934" ENDARROW="Default" ENDINCLINATION="-814;62;" ID="Arrow_ID_817672667" STARTARROW="None" STARTINCLINATION="1393;-112;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1698019149574" HGAP="40" ID="ID_982468485" MODIFIED="1698078066168" TEXT="Fallunterscheidung" VSHIFT="21">
@ -83656,7 +83657,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1698159441179" ID="ID_486995126" MODIFIED="1698605578216" TEXT="Scheduler-Tick">
<linktarget COLOR="#fffcc5" DESTINATION="ID_486995126" ENDARROW="Default" ENDINCLINATION="579;-95;" ID="Arrow_ID_1801107947" SOURCE="ID_671338782" STARTARROW="None" STARTINCLINATION="292;11;"/>
<linktarget COLOR="#994d72" DESTINATION="ID_486995126" ENDARROW="Default" ENDINCLINATION="-91;14;" ID="Arrow_ID_973238030" SOURCE="ID_1391329454" STARTARROW="None" STARTINCLINATION="71;5;"/>
<linktarget COLOR="#5198bc" DESTINATION="ID_486995126" ENDARROW="Default" ENDINCLINATION="-91;14;" ID="Arrow_ID_973238030" SOURCE="ID_1391329454" STARTARROW="None" STARTINCLINATION="71;5;"/>
<linktarget COLOR="#4f89b7" DESTINATION="ID_486995126" ENDARROW="Default" ENDINCLINATION="232;35;" ID="Arrow_ID_1502519432" SOURCE="ID_1247362696" STARTARROW="None" STARTINCLINATION="108;-12;"/>
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1698523819504" HGAP="114" ID="ID_1592332331" MODIFIED="1698605640201" TEXT="Rahmen schaffen" VSHIFT="8">
@ -83682,8 +83683,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1698523868063" HGAP="124" ID="ID_26600563" MODIFIED="1698605584160" TEXT="Selbst-&#xdc;berwachung">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698534832254" ID="ID_1414543996" MODIFIED="1698534887888" TEXT="Plan: der DutyCycle ist Status-Asessment">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#435e98" CREATED="1698534832254" FOLDED="true" ID="ID_1414543996" MODIFIED="1698808322736" TEXT="Plan: der DutyCycle ist Status-Asessment">
<icon BUILTIN="yes"/>
<node CREATED="1698534900965" ID="ID_488282572" MODIFIED="1698534907381" TEXT="er ist idempotent"/>
<node CREATED="1698534889399" ID="ID_1021949731" MODIFIED="1698534900169" TEXT="er ist ohne Vorbedingungen stets aufsf&#xfc;hrbar">
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1698544429803" ID="ID_24248194" MODIFIED="1698544506289" TEXT="m&#xf6;gliche Falle: Load-State-Metriken auf Basis der WorkForce">
@ -83691,9 +83692,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1698544455094" ID="ID_726163729" MODIFIED="1698544500012" TEXT="vorteilhaft w&#xe4;re, die WorkForce erst nach dem ersten Tick hochzufahren"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698534920078" ID="ID_1926216575" MODIFIED="1698534936605" TEXT="nach seinem Aufruf ist der Status normalisiert">
<node COLOR="#435e98" CREATED="1698534920078" ID="ID_1926216575" MODIFIED="1698808299010" TEXT="nach seinem Aufruf ist der Status normalisiert">
<icon BUILTIN="yes"/>
</node>
<node COLOR="#338800" CREATED="1698808300122" ID="ID_1808480702" MODIFIED="1698808313387" TEXT="(Konzept scheint aufzugehen)"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1698542388722" ID="ID_1120963605" MODIFIED="1698543129256" TEXT="Queue bereinigen">
<icon BUILTIN="pencil"/>
@ -83761,10 +83763,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1697982436029" ID="ID_288711039" MODIFIED="1698521623327" TEXT="Test">
<node COLOR="#338800" CREATED="1697982436029" ID="ID_288711039" MODIFIED="1698808212796" TEXT="Test">
<arrowlink COLOR="#56a5a9" DESTINATION="ID_488605324" ENDARROW="Default" ENDINCLINATION="457;-68;" ID="Arrow_ID_1794430254" STARTARROW="None" STARTINCLINATION="-752;0;"/>
<arrowlink COLOR="#56a5a9" DESTINATION="ID_1292738036" ENDARROW="Default" ENDINCLINATION="286;-465;" ID="Arrow_ID_367470516" STARTARROW="None" STARTINCLINATION="-752;0;"/>
<icon BUILTIN="pencil"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1698521316395" ID="ID_1194473945" MODIFIED="1698521326921" TEXT="kann im Test die Timing/Sleep-Muster zeigen">
<icon BUILTIN="button_ok"/>
</node>
@ -83774,23 +83776,26 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698372200013" ID="ID_1863445864" MODIFIED="1698372206543" TEXT="Scheduler start/stop">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698372207398" ID="ID_1110932778" MODIFIED="1698372310208" TEXT="braucht Integration mit LoadController">
<arrowlink COLOR="#af587f" DESTINATION="ID_210862409" ENDARROW="Default" ENDINCLINATION="-33;645;" ID="Arrow_ID_204955453" STARTARROW="None" STARTINCLINATION="250;17;"/>
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1698372200013" FOLDED="true" ID="ID_1863445864" MODIFIED="1698808416494" TEXT="Scheduler start/stop">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1698372207398" ID="ID_1110932778" MODIFIED="1698808364649" TEXT="braucht Integration mit LoadController">
<arrowlink COLOR="#5898af" DESTINATION="ID_210862409" ENDARROW="Default" ENDINCLINATION="-33;645;" ID="Arrow_ID_204955453" STARTARROW="None" STARTINCLINATION="250;17;"/>
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698372288228" ID="ID_1391329454" MODIFIED="1698372361257" TEXT="richtiges Zusammenspiel mit dem Tick">
<arrowlink COLOR="#994d72" DESTINATION="ID_486995126" ENDARROW="Default" ENDINCLINATION="-91;14;" ID="Arrow_ID_973238030" STARTARROW="None" STARTINCLINATION="71;5;"/>
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1698372288228" ID="ID_1391329454" MODIFIED="1698808377073" TEXT="richtiges Zusammenspiel mit dem Tick">
<arrowlink COLOR="#5198bc" DESTINATION="ID_486995126" ENDARROW="Default" ENDINCLINATION="-91;14;" ID="Arrow_ID_973238030" STARTARROW="None" STARTINCLINATION="71;5;"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1698372366569" HGAP="31" ID="ID_581955078" MODIFIED="1698539690981" TEXT="der Tick mu&#xdf; von selber anhalten" VSHIFT="18"/>
<node CREATED="1698372384694" HGAP="25" ID="ID_1896236351" MODIFIED="1698372393274" TEXT="damit f&#xe4;llt die Queue leer"/>
</node>
<node CREATED="1698522290233" ID="ID_1911911283" MODIFIED="1698522313757" TEXT="Status bereits &#xfc;ber empty() / isnil() ersichtlich">
<node COLOR="#435e98" CREATED="1698522290233" ID="ID_1911911283" MODIFIED="1698808389494" TEXT="Status bereits &#xfc;ber empty() / isnil() ersichtlich">
<icon BUILTIN="idea"/>
<node CREATED="1698522320375" ID="ID_1572899444" MODIFIED="1698522328008" TEXT="solange der Tick tickt, kann er nicht leer sein"/>
<node COLOR="#338800" CREATED="1698808391150" ID="ID_391218762" MODIFIED="1698808398969" TEXT="im Test verifiziert">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1698522456723" ID="ID_1793836905" MODIFIED="1698605370497" TEXT="Zustands&#xfc;berg&#xe4;nge realisieren">
</node>
<node COLOR="#338800" CREATED="1698522456723" FOLDED="true" ID="ID_1793836905" MODIFIED="1698808409669" TEXT="Zustands&#xfc;berg&#xe4;nge realisieren">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1698522466298" ID="ID_1846809868" MODIFIED="1698604976684" TEXT="ignite() &#x27f6; Tick etablieren">
<icon BUILTIN="button_ok"/>
@ -88963,9 +88968,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688336835085" ID="ID_1753236898" MODIFIED="1697732777759" TEXT="SchedulerService_test">
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1688336835085" ID="ID_1753236898" MODIFIED="1698808463741" TEXT="SchedulerService_test">
<linktarget COLOR="#678999" DESTINATION="ID_1753236898" ENDARROW="Default" ENDINCLINATION="-719;-67;" ID="Arrow_ID_197736729" SOURCE="ID_862845398" STARTARROW="None" STARTINCLINATION="-295;159;"/>
<icon BUILTIN="flag-yellow"/>
<icon BUILTIN="pencil"/>
<node CREATED="1688337200875" ID="ID_1269476607" MODIFIED="1697732840741" TEXT="Scheduler Component Integration End-to-End">
<icon BUILTIN="info"/>
</node>
@ -89425,7 +89430,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#338800" CREATED="1698521856803" ID="ID_1548722737" MODIFIED="1698604615321" TEXT="verify_StartStop">
<node COLOR="#338800" CREATED="1698521856803" FOLDED="true" ID="ID_1548722737" MODIFIED="1698808448838" TEXT="verify_StartStop">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1698592367530" ID="ID_1513214570" MODIFIED="1698605544097" TEXT="tats&#xe4;chlich Activities einplanen">
<linktarget COLOR="#389bcf" DESTINATION="ID_1513214570" ENDARROW="Default" ENDINCLINATION="365;-28;" ID="Arrow_ID_554717849" SOURCE="ID_284194667" STARTARROW="None" STARTINCLINATION="333;12;"/>
@ -89590,18 +89595,19 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1698592173326" ID="ID_1298598152" MODIFIED="1698621870653" TEXT="verify_LoadFactor">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698621875902" ID="ID_846411589" MODIFIED="1698632491041" TEXT="Scheduler beladen und Lastverlauf beobachten">
<node COLOR="#338800" CREATED="1698592173326" FOLDED="true" ID="ID_1298598152" MODIFIED="1698808453912" TEXT="verify_LoadFactor">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1698621875902" ID="ID_846411589" MODIFIED="1698807574994" TEXT="Scheduler beladen und Lastverlauf beobachten">
<linktarget COLOR="#4a5982" DESTINATION="ID_846411589" ENDARROW="Default" ENDINCLINATION="-55;-589;" ID="Arrow_ID_1233923536" SOURCE="ID_716182887" STARTARROW="None" STARTINCLINATION="-390;272;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1698622735430" ID="ID_1186149699" MODIFIED="1698622754977" TEXT="geeignetes Test-Setup">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1698622735430" ID="ID_1186149699" MODIFIED="1698807481920" TEXT="geeignetes Test-Setup">
<icon BUILTIN="help"/>
<node CREATED="1698622757560" ID="ID_50779860" MODIFIED="1698622776217" TEXT="das hier sollte noch ein low-level-Test sein"/>
<node CREATED="1698622777629" ID="ID_1888787087" MODIFIED="1698622791685" TEXT="also besser nur mit einzelne(n) Activities"/>
<node CREATED="1698622792747" ID="ID_505766155" MODIFIED="1698622861886" TEXT="&#x27f9; Last erzeugen durch Masse"/>
</node>
<node CREATED="1698627049989" ID="ID_156522497" MODIFIED="1698632301867" TEXT="guten Belastungs-Faktor herausfinden">
<node COLOR="#338800" CREATED="1698627049989" FOLDED="true" ID="ID_156522497" MODIFIED="1698808089267" TEXT="guten Belastungs-Faktor herausfinden">
<icon BUILTIN="button_ok"/>
<node COLOR="#5b280f" CREATED="1698627058057" ID="ID_732034472" MODIFIED="1698628256700" TEXT="Microbenchmark machen">
<icon BUILTIN="yes"/>
<icon BUILTIN="button_cancel"/>
@ -89656,15 +89662,17 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1698799723651" ID="ID_1639854472" LINK="#ID_760149120" MODIFIED="1698799738323" TEXT="Falsche Annahme: wir laufen nicht multithreaded"/>
<node CREATED="1698799745718" ID="ID_1554986044" MODIFIED="1698799764512" TEXT="und es sind ehr 5&#xb5;s / komplett-Dispatch einer Activity"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698799787474" ID="ID_353378905" MODIFIED="1698799833873" TEXT="Regel mit 5&#xb5;s aber nur einem Thread ansetzen">
<node COLOR="#338800" CREATED="1698799787474" ID="ID_353378905" MODIFIED="1698807437683" TEXT="Regel mit 3&#xb5;s aber nur einem Thread ansetzen">
<linktarget COLOR="#4b5ab6" DESTINATION="ID_353378905" ENDARROW="Default" ENDINCLINATION="-845;50;" ID="Arrow_ID_1142667813" SOURCE="ID_632270963" STARTARROW="None" STARTINCLINATION="-120;-9;"/>
<icon BUILTIN="flag-yellow"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1698807439214" ID="ID_1214021768" MODIFIED="1698807447888" TEXT="Begr&#xfc;ndung: lieber zu viel als zu wenig"/>
<node CREATED="1698807455627" ID="ID_375927019" MODIFIED="1698807463662" TEXT="man denke an -O3 und schnellere Maschinen"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698717012643" ID="ID_173734089" MODIFIED="1698717022970" TEXT="verwende 2 mal einen 2ms-Peak">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1698717012643" ID="ID_173734089" MODIFIED="1698807472412" TEXT="verwende 2 mal einen 2ms-Peak">
<icon BUILTIN="button_ok"/>
<node CREATED="1698717024321" ID="ID_1397476094" MODIFIED="1698717031620" TEXT="erster Peak wie erwartet"/>
<node CREATED="1698717032144" ID="ID_262693088" MODIFIED="1698717042523" TEXT="zweiter auch...">
<node CREATED="1698717032144" FOLDED="true" ID="ID_262693088" MODIFIED="1698800658103" TEXT="zweiter auch...">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1698717043482" ID="ID_747236369" MODIFIED="1698797095872" TEXT="aber Load bleibt l&#xe4;nger hoch (obwohl sich Lag nicht &#xe4;ndert)">
<icon BUILTIN="broken-line"/>
<node COLOR="#435e98" CREATED="1698717071523" ID="ID_1822841922" MODIFIED="1698798474545" TEXT="wird da der Indikator nicht aktualisiert?">
@ -89686,17 +89694,15 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="forward"/>
</node>
</node>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#23355d" CREATED="1698763004667" ID="ID_431116549" MODIFIED="1698799901048" TEXT="sleeps instrumentieren">
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#23355d" CREATED="1698763004667" ID="ID_431116549" MODIFIED="1698800633775" TEXT="sleeps instrumentieren">
<arrowlink COLOR="#4a567e" DESTINATION="ID_1608331813" ENDARROW="Default" ENDINCLINATION="26;-45;" ID="Arrow_ID_7575484" STARTARROW="None" STARTINCLINATION="-13;120;"/>
<font NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="yes"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1698767212531" ID="ID_1608331813" MODIFIED="1698799894089" TEXT="Timing-Beobachtungen">
<node COLOR="#435e98" CREATED="1698767212531" FOLDED="true" ID="ID_1608331813" MODIFIED="1698800636592" TEXT="Timing-Beobachtungen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
0000000599: INFO: suite.cpp:180: thread_1: invokeTestCase: ++------------------- invoking TEST: vault::gear::test::SchedulerService_test
@ -91334,7 +91340,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1698796802953" ID="ID_288874835" MODIFIED="1698796847029" TEXT="nun werden sie (und weitere aber hinter dem &#xbb;Tick&#xab; verteilt (1..4ms)"/>
<node CREATED="1698796887732" ID="ID_1205854372" MODIFIED="1698796904725" TEXT="nach dem Tick wird ein Thread redistributed +6.9ms"/>
</node>
<node COLOR="#435e98" CREATED="1698797183388" ID="ID_1573620591" MODIFIED="1698799351388" TEXT="Auff&#xe4;lligkeiten">
<node COLOR="#435e98" CREATED="1698797183388" FOLDED="true" ID="ID_1573620591" MODIFIED="1698799351388" TEXT="Auff&#xe4;lligkeiten">
<icon BUILTIN="messagebox_warning"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1698797189100" ID="ID_1274008072" MODIFIED="1698798401099" TEXT="der averageLag wird nicht aktualisiert wenn Threads outgoing in den Schlaf geschickt werden"/>
<node BACKGROUND_COLOR="#e8dfb2" COLOR="#a50125" CREATED="1698797231341" ID="ID_1313364590" MODIFIED="1698799373623" TEXT="es werden mehrere Threads direkt nach dem Peak incoming in deep-sleep geschickt">
@ -91358,51 +91364,40 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1698799110379" ID="ID_961144930" MODIFIED="1698799332771" TEXT="betrachte ich aber trotzdem nur als ein Artefakt dieses Test-Setup">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Und zwar weil f&#252;r jeden targeted-Sleep und jeden R&#252;ckgabewert != PASS ja doch automatisch das Token gedropped wird. Deshalb ist nicht einmal der &#187;Tick&#171; ein Problem (ja der droppt es nicht). Nur wenn eine Interne Verarbeitung in Schleifen gehen w&#252;rde, h&#228;tten wir ein Problem. Dazu m&#252;&#223;te sie sich selbst ohne Zeitversatz wieder einplanen (bzw. die Scheduler-Zeitachse m&#252;&#223;te geflutet sein)
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
</node>
<node COLOR="#435e98" CREATED="1698799381303" ID="ID_1393749600" MODIFIED="1698799395610">
<node COLOR="#435e98" CREATED="1698799381303" FOLDED="true" ID="ID_1393749600" MODIFIED="1698799395610">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
<b>Fazit</b>: works as designed
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="forward"/>
<node CREATED="1698799397397" ID="ID_985998010" MODIFIED="1698799415311" TEXT="dieser Test l&#xe4;&#xdf;t effektiv nur einen Thread die ganze Arbeit machen"/>
<node CREATED="1698799415850" ID="ID_967384012" MODIFIED="1698799478469" TEXT="die sich dabei ergebenden Timings sind aber recht ordentlich (Debug-Modus &lt;5&#xb5;s / Aufruf)"/>
<node CREATED="1698799483442" ID="ID_429959322" MODIFIED="1698799507186" TEXT="deshalb kann auch der Load-Indikator l&#xe4;nger oben h&#xe4;ngen bleiben"/>
<node CREATED="1698799518965" ID="ID_431143838" MODIFIED="1698799666998">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
die Kapazit&#228;ts-Verteilung wurde expizit gepr&#252;ft und <b>arbeitet sehr gut</b>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<ul>
<li>
@ -91413,46 +91408,65 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</li>
</ul>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1698799674792" ID="ID_632270963" MODIFIED="1698799840904" TEXT="sollte aber die Last-Berechnung anpassen">
<arrowlink COLOR="#4b5ab6" DESTINATION="ID_353378905" ENDARROW="Default" ENDINCLINATION="-845;50;" ID="Arrow_ID_1142667813" STARTARROW="None" STARTINCLINATION="-120;-9;"/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1698807529025" ID="ID_109672823" MODIFIED="1698807573123" TEXT="Anzeige">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1698807533649" ID="ID_671686548" MODIFIED="1698807571388" TEXT="lasse das Polling dauerhaft die Last und den Lag anzeigen">
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1698717098815" ID="ID_1125851674" MODIFIED="1698717126964" TEXT="sinnvolle Verifikation f&#xfc;r den Load-Verlauf?">
<node COLOR="#338800" CREATED="1698807553430" ID="ID_496280476" MODIFIED="1698807569742" TEXT="au&#xdf;erdem eine Tabelle mit den Ergebnissen">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1698807561838" ID="ID_885881383" MODIFIED="1698807567263" TEXT="erst zuletzt die Verifikationen">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
<node COLOR="#435e98" CREATED="1698717098815" ID="ID_1125851674" MODIFIED="1698807521682" TEXT="sinnvolle Verifikation f&#xfc;r den Load-Verlauf?">
<icon BUILTIN="help"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1698717134618" ID="ID_647920304" MODIFIED="1698717208459" TEXT="Probleme">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1698717134618" ID="ID_647920304" MODIFIED="1698807489923" TEXT="Probleme">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1698717139679" ID="ID_741586859" MODIFIED="1698717189427" TEXT="wir haben eine Offset">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
weil das Beladen und Starten des Schedulers erhebliche Zeit kostet (und nicht pr&#228;zise ist)
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1698717192099" ID="ID_981872386" MODIFIED="1698717205321" TEXT="man mu&#xdf; dann die Load-Peaks &quot;erwischen&quot;"/>
</node>
<node CREATED="1698807490718" ID="ID_1537156793" MODIFIED="1698807507860" TEXT="L&#xf6;sung: pollen und State-Machine mitlaufen lassen"/>
<node CREATED="1698807508700" ID="ID_207855735" MODIFIED="1698807520054" TEXT="Zeitpunkte Messen und grobes Raster best&#xe4;gien"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698592075524" ID="ID_202320750" MODIFIED="1698592208068" TEXT="Test f&#xfc;r selbst&#xe4;ndiges Deaktivieren bei leerer Queue">
<node COLOR="#338800" CREATED="1698592075524" ID="ID_202320750" MODIFIED="1698807891425" TEXT="Test f&#xfc;r selbst&#xe4;ndiges Deaktivieren bei leerer Queue">
<linktarget COLOR="#3e9b94" DESTINATION="ID_202320750" ENDARROW="Default" ENDINCLINATION="-1156;-61;" ID="Arrow_ID_727945119" SOURCE="ID_191013179" STARTARROW="None" STARTINCLINATION="61;1261;"/>
<icon BUILTIN="flag-yellow"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1698807894416" ID="ID_20635201" MODIFIED="1698807913644" TEXT="einfach am Ende nochmal in einer while-Schleife warten">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1698592582560" ID="ID_953889358" MODIFIED="1698592600782" TEXT="mu&#xdf; daf&#xfc;r ca 2sec warten">
<node COLOR="#338800" CREATED="1698807904784" ID="ID_1752567594" MODIFIED="1698807913182" TEXT="verifizieren, da&#xdf; es mehr als 2 sec sind">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1698592582560" ID="ID_953889358" MODIFIED="1698807916661" TEXT="mu&#xdf; daf&#xfc;r ca 2sec warten">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1698592605242" ID="ID_233491478" MODIFIED="1698592613559" TEXT="auf Dauer kann man diesen Test deaktivieren"/>
<node CREATED="1698592614124" ID="ID_696418800" MODIFIED="1698592633653" TEXT="oder wir f&#xfc;hren l&#xe4;ngerfristig mal verschiedene Test-Tiefen ein"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1698807920004" ID="ID_1009945367" MODIFIED="1698807932771" TEXT="oder man akzeptiert das hier einfach mal">
<icon BUILTIN="yes"/>
</node>
</node>
<node COLOR="#338800" CREATED="1698247388556" ID="ID_1402046356" MODIFIED="1698448243571" TEXT="invokeWorkFunction">
</node>
<node COLOR="#338800" CREATED="1698247388556" FOLDED="true" ID="ID_1402046356" MODIFIED="1698448243571" TEXT="invokeWorkFunction">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1698247394051" ID="ID_198829622" MODIFIED="1698247420009" TEXT="kann einfachen Aufruf einer vorher eingespielten Activity belegen">
<icon BUILTIN="button_ok"/>