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:
parent
4937577557
commit
5c5dc40f3f
5 changed files with 240 additions and 125 deletions
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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 ));
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -7201,7 +7201,7 @@ The Scheduler is now considered an implementation-level facility with an interfa
|
|||
&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|!|>|!incoming|>|!outgoing|
|
||||
|~|!distance|!tend-next|!regular|!tend-next|!regular|
|
||||
|unknown | ∞| IDLEWAIT | IDLEWAIT | WORKTIME | WORKTIME |
|
||||
|sleep-horizon | >20ms| IDLEWAIT | IDLEWAIT | TENDNEXT | WORKTIME |
|
||||
|work-horizon | >5ms| IDLEWAIT | IDLEWAIT | TENDNEXT | WORKTIME |
|
||||
|near-horizon | >50µs| TENDNEXT | NEARTIME | TENDNEXT | NEARTIME |
|
||||
|imminent | >now| SPINTIME | SPINTIME | SPINTIME | SPINTIME |
|
||||
|past | <now| DISPATCH | DISPATCH| DISPATCH | DISPATCH |
|
||||
|case matrix for capacity redistribution|c
|
||||
&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:
|
||||
|
|
|
|||
|
|
@ -82566,7 +82566,7 @@ Date:   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:   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ätzung entwickeln">
|
||||
<node COLOR="#338800" CREATED="1698632383220" ID="ID_716182887" MODIFIED="1698808105730" TEXT="Last-Schä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:   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äßige Integration / state fusion">
|
||||
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1698544547801" ID="ID_1011726550" MODIFIED="1698808129018" TEXT="regelmäß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äuft (nur) im Tick — kö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:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1697935467508" ID="ID_370682037" MODIFIED="1697935479215" TEXT="Reserve-Kapazität bei Bedarf aktivieren">
|
||||
<node COLOR="#435e98" CREATED="1697935467508" FOLDED="true" ID="ID_370682037" MODIFIED="1698808176629" TEXT="Reserve-Kapazität bei Bedarf aktivieren">
|
||||
<node CREATED="1697937331101" ID="ID_834796842" MODIFIED="1697938265914" TEXT="Scheduler muß (im Tick) erkennen, daß er ü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:   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 »nichts zu tun«">
|
||||
<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 »nichts zu tun«">
|
||||
<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 »tended level« merken">
|
||||
<node COLOR="#435e98" CREATED="1697941259810" ID="ID_1031482347" MODIFIED="1698808159628" TEXT="den »tended level« 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ür den nächsten Task vorgemerkt"/>
|
||||
|
|
@ -83193,7 +83193,7 @@ Date:   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 ⟹ address headTime"/>
|
||||
|
|
@ -83207,7 +83207,7 @@ Date:   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 ⟶ 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:   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ür Flexibilität vorsehen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1697979825353" ID="ID_475190835" MODIFIED="1698808190135" TEXT="Punkte für Flexibilitä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:   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:   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:   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:   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-Ü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ührbar">
|
||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1698544429803" ID="ID_24248194" MODIFIED="1698544506289" TEXT="mögliche Falle: Load-State-Metriken auf Basis der WorkForce">
|
||||
|
|
@ -83691,9 +83692,10 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
<node CREATED="1698544455094" ID="ID_726163729" MODIFIED="1698544500012" TEXT="vorteilhaft wä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:   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:   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ß von selber anhalten" VSHIFT="18"/>
|
||||
<node CREATED="1698372384694" HGAP="25" ID="ID_1896236351" MODIFIED="1698372393274" TEXT="damit fällt die Queue leer"/>
|
||||
</node>
|
||||
<node CREATED="1698522290233" ID="ID_1911911283" MODIFIED="1698522313757" TEXT="Status bereits über empty() / isnil() ersichtlich">
|
||||
<node COLOR="#435e98" CREATED="1698522290233" ID="ID_1911911283" MODIFIED="1698808389494" TEXT="Status bereits ü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übergänge realisieren">
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1698522456723" FOLDED="true" ID="ID_1793836905" MODIFIED="1698808409669" TEXT="Zustandsübergänge realisieren">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1698522466298" ID="ID_1846809868" MODIFIED="1698604976684" TEXT="ignite() ⟶ Tick etablieren">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -88963,9 +88968,9 @@ Date:   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:   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ä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:   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="⟹ 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:   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µs / komplett-Dispatch einer Activity"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698799787474" ID="ID_353378905" MODIFIED="1698799833873" TEXT="Regel mit 5µs aber nur einem Thread ansetzen">
|
||||
<node COLOR="#338800" CREATED="1698799787474" ID="ID_353378905" MODIFIED="1698807437683" TEXT="Regel mit 3µ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ü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änger hoch (obwohl sich Lag nicht ä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:   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:   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 »Tick« 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älligkeiten">
|
||||
<node COLOR="#435e98" CREATED="1698797183388" FOLDED="true" ID="ID_1573620591" MODIFIED="1698799351388" TEXT="Auffä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:   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ür jeden targeted-Sleep und jeden Rückgabewert != PASS ja doch automatisch das Token gedropped wird. Deshalb ist nicht einmal der »Tick« ein Problem (ja der droppt es nicht). Nur wenn eine Interne Verarbeitung in Schleifen gehen würde, hätten wir ein Problem. Dazu müßte sie sich selbst ohne Zeitversatz wieder einplanen (bzw. die Scheduler-Zeitachse müß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äß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 <5µs / Aufruf)"/>
|
||||
<node CREATED="1698799483442" ID="ID_429959322" MODIFIED="1698799507186" TEXT="deshalb kann auch der Load-Indikator länger oben hängen bleiben"/>
|
||||
<node CREATED="1698799518965" ID="ID_431143838" MODIFIED="1698799666998">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
die Kapazitäts-Verteilung wurde expizit geprü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:   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ür den Load-Verlauf?">
|
||||
<node COLOR="#338800" CREATED="1698807553430" ID="ID_496280476" MODIFIED="1698807569742" TEXT="auß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ü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äzise ist)
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1698717192099" ID="ID_981872386" MODIFIED="1698717205321" TEXT="man muß dann die Load-Peaks "erwischen""/>
|
||||
</node>
|
||||
<node CREATED="1698807490718" ID="ID_1537156793" MODIFIED="1698807507860" TEXT="Lösung: pollen und State-Machine mitlaufen lassen"/>
|
||||
<node CREATED="1698807508700" ID="ID_207855735" MODIFIED="1698807520054" TEXT="Zeitpunkte Messen und grobes Raster bestägien"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698592075524" ID="ID_202320750" MODIFIED="1698592208068" TEXT="Test für selbständiges Deaktivieren bei leerer Queue">
|
||||
<node COLOR="#338800" CREATED="1698592075524" ID="ID_202320750" MODIFIED="1698807891425" TEXT="Test für selbstä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ß dafür ca 2sec warten">
|
||||
<node COLOR="#338800" CREATED="1698807904784" ID="ID_1752567594" MODIFIED="1698807913182" TEXT="verifizieren, daß 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ß dafü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ühren lä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"/>
|
||||
|
|
|
|||
Loading…
Reference in a new issue