Scheduler: draft a load indicator
...using a state fusion based on both the threadpool size and the average distance or lag to the next task to be scheduled.
This commit is contained in:
parent
6a7a2832bf
commit
a087e52ab1
3 changed files with 70 additions and 31 deletions
|
|
@ -164,16 +164,14 @@ namespace gear {
|
|||
void
|
||||
markLagSample (Time head, Time now)
|
||||
{
|
||||
double headroom = _raw(std::clamp<TimeVar> (now - (head.isRegular()? head:now)
|
||||
, -SLEEP_HORIZON
|
||||
, WORK_HORIZON));
|
||||
const int64_t N = wiring_.maxCapacity * 3;
|
||||
double headroom = _raw(head.isRegular()? head:now) - _raw(now);
|
||||
int64_t average = sampledLag_.load (std::memory_order_relaxed);
|
||||
int64_t newAverage;
|
||||
do{
|
||||
double chango = (headroom + (N-1)*average) / N;
|
||||
newAverage = std::floor (chango);
|
||||
}
|
||||
do newAverage = std::floor ((headroom + (N-1)*average) / N);
|
||||
while (not sampledLag_.compare_exchange_weak (average, newAverage, std::memory_order_relaxed));
|
||||
//cout<<"NAV "<< newAverage<< " headroom="<<headroom<<endl;
|
||||
}
|
||||
|
||||
public:
|
||||
|
|
@ -188,14 +186,20 @@ namespace gear {
|
|||
double
|
||||
effectiveLoad()
|
||||
{
|
||||
return wiring_.currWorkForceSize() / double(wiring_.maxCapacity);
|
||||
double lag = sampledLag_.load (std::memory_order_relaxed);
|
||||
lag -= 200;
|
||||
lag /= _raw(WORK_HORIZON);
|
||||
lag *= 10;
|
||||
double lagFactor = lag<0? 1/(1-lag): 1+lag;
|
||||
double loadFactor = wiring_.currWorkForceSize() / double(wiring_.maxCapacity);
|
||||
return loadFactor * lagFactor;
|
||||
}
|
||||
|
||||
/** periodic call to build integrated state indicators */
|
||||
void
|
||||
updateState (Time now)
|
||||
updateState (Time)
|
||||
{
|
||||
/////////////////////////////////////////////////////////////////////////////OOO build integrated load state
|
||||
/////////////////////////////////////////////////////////////////////////////TODO anything we need to calculate on each »scheduler tick«?
|
||||
}
|
||||
|
||||
/** statistics update on scaling down the WorkForce */
|
||||
|
|
|
|||
|
|
@ -151,12 +151,6 @@ namespace test {
|
|||
schedCtx.post (RealClock::now() + start + TimeValue{i}, &dummy, schedCtx);
|
||||
};
|
||||
|
||||
auto [mil,_] = lib::test::microBenchmark([&](int i){
|
||||
auto& schedCtx = Scheduler::ExecutionCtx::from(scheduler);
|
||||
schedCtx.post (RealClock::now() + TimeValue{i}, &dummy, schedCtx);
|
||||
}, 1e5);
|
||||
SHOW_EXPR(mil);
|
||||
scheduler.layer2_.dropGroomingToken();
|
||||
|
||||
auto fatPackage = work::Config::COMPUTATION_CAPACITY * 1000/20;
|
||||
createLoad (Offset{Time{5,0}}, fatPackage);
|
||||
|
|
|
|||
|
|
@ -82647,8 +82647,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
...weil wir im Moment immer mit Vollast einsteigen und dann zwar im Idle-Fall herunterregeln; letzteres passiert typischerweise aber schnell. Also im Test sehe ich daher immer nur 1.0 oder keine Last
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="smiley-neutral"/>
|
||||
</node>
|
||||
<node CREATED="1698632626540" ID="ID_1025237859" MODIFIED="1698632714226" TEXT="könnte trotzdem brauchbar sein">
|
||||
|
|
@ -82661,8 +82660,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
...das kann aber erst beurteilt werden, wenn wir echte Last-Szenarien kennen. Denkbar wäre, daß z.B. ein real-Time Render in etwa mit 3 Cores über die Runden kommt
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1698632716069" ID="ID_348864601" MODIFIED="1698632819292" TEXT="sollte trotzdem mit einem Situations-Faktor ergänzen">
|
||||
<arrowlink COLOR="#ce6c70" DESTINATION="ID_167635013" ENDARROW="Default" ENDINCLINATION="14;-26;" ID="Arrow_ID_1543325365" STARTARROW="None" STARTINCLINATION="-53;3;"/>
|
||||
|
|
@ -82688,8 +82686,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</li>
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1698632941116" ID="ID_1797377910" MODIFIED="1698633204991" TEXT="kommt man irgendwie an Werte pro Worker heran?">
|
||||
|
|
@ -82736,8 +82733,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
 mean ≔ mean · 1/N · ( N-1  + newVal/mean)
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1698633459189" HGAP="44" ID="ID_465609411" MODIFIED="1698633548963" TEXT="siehe BlockFlow::markEpochUnderflow()" VSHIFT="-13"/>
|
||||
</node>
|
||||
|
|
@ -82751,8 +82747,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
Bei einem moving-Average interessiert es uns eigentlich nicht, <i>wann genau </i>der Wert gilt und <i>für wen </i>er gilt. Es interessiert uns nur, was am Ende rausgekommen ist, bzw. wie der Trend im Moment so ist
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1698633875244" ID="ID_202660501" MODIFIED="1698633929103">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
|
|
@ -82770,8 +82765,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
»irgendwann eventuell« in das MA ein
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
<node COLOR="#5b280f" CREATED="1698633939212" ID="ID_1007287132" MODIFIED="1698635722966">
|
||||
|
|
@ -82784,8 +82778,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
und <i>das </i>läßt sich mit <b>zwei </b>Atomic-Operationen realisieren
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
<node CREATED="1698635724493" ID="ID_1504851010" MODIFIED="1698635742694" TEXT="Nein! es gibt keine atomare Multiplikation"/>
|
||||
<node CREATED="1698635745173" ID="ID_509243439" MODIFIED="1698635754653" TEXT="damit muß ich doch die compare-exchange-Schleife machen"/>
|
||||
|
|
@ -82797,9 +82790,57 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1698635767135" ID="ID_1284337606" MODIFIED="1698635791023" TEXT="erst einmal nur den Offset samplen und beobachten"/>
|
||||
<node CREATED="1698635791606" ID="ID_1832030937" MODIFIED="1698635805382" TEXT="Berechnung per compare-and-swap"/>
|
||||
<node CREATED="1698638460422" ID="ID_583392778" MODIFIED="1698638471065" TEXT="Werte sehen plausibel aus"/>
|
||||
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1698638471844" ID="ID_429172374" MODIFIED="1698638495490" TEXT="wird aber extrem häufig aufgerufen — warum?">
|
||||
<node COLOR="#435e98" CREATED="1698638471844" ID="ID_429172374" MODIFIED="1698679552921" TEXT="wird aber extrem häufig aufgerufen — warum?">
|
||||
<arrowlink COLOR="#ab2254" DESTINATION="ID_1087870120" ENDARROW="Default" ENDINCLINATION="-356;12;" ID="Arrow_ID_187678307" STARTARROW="None" STARTINCLINATION="215;13;"/>
|
||||
<icon BUILTIN="broken-line"/>
|
||||
<node CREATED="1698638515487" ID="ID_847572680" MODIFIED="1698638528753" TEXT="sitzt in einem Poll-Zyklus?!"/>
|
||||
<node COLOR="#5b280f" CREATED="1698638515487" ID="ID_847572680" MODIFIED="1698677275734" TEXT="sitzt in einem Poll-Zyklus?!">
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
<node CREATED="1698677277552" ID="ID_1317926717" MODIFIED="1698677278981" TEXT="Nein"/>
|
||||
<node CREATED="1698677279614" ID="ID_1709786106" MODIFIED="1698677300582" TEXT="Klassifikation mit ausgegeben; SPINTIME ist selten"/>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1698677306748" ID="ID_866077855" MODIFIED="1698678768055" TEXT="es sind zu viele Aufrufe mit Klassifikation == DISPATCH">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1698677690883" ID="ID_351118530" MODIFIED="1698677705290" TEXT="nimmt zu bei detailierterm Output"/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1698677705883" ID="ID_71450734" MODIFIED="1698678751844" TEXT="Verdacht: Lock contention">
|
||||
<linktarget COLOR="#43a3ba" DESTINATION="ID_71450734" ENDARROW="Default" ENDINCLINATION="-8;32;" ID="Arrow_ID_556655771" SOURCE="ID_1104620236" STARTARROW="None" STARTINCLINATION="-1;-9;"/>
|
||||
<icon BUILTIN="broken-line"/>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1698678080681" ID="ID_1138703507" MODIFIED="1698678762618" TEXT="überprüfen(DUMP)....">
|
||||
<node CREATED="1698678090842" ID="ID_221981224" MODIFIED="1698678094141" TEXT="einfacher output">
|
||||
<node CREATED="1698678125933" ID="ID_1177337579" MODIFIED="1698678140448" TEXT="grooming: 361"/>
|
||||
<node CREATED="1698678205643" ID="ID_1365668352" MODIFIED="1698678227494" TEXT="contended: 1720"/>
|
||||
<node CREATED="1698678319162" ID="ID_980416022" MODIFIED="1698678329041" TEXT="non-grooming: 16"/>
|
||||
</node>
|
||||
<node CREATED="1698678459400" ID="ID_1353160812" MODIFIED="1698678463900" TEXT="komplexer output">
|
||||
<node CREATED="1698678465823" ID="ID_1714537466" MODIFIED="1698678471771" TEXT="grooming: 368"/>
|
||||
<node CREATED="1698678485269" ID="ID_1234538576" MODIFIED="1698678492959" TEXT="contended: 5268"/>
|
||||
<node CREATED="1698678520977" ID="ID_324309059" MODIFIED="1698678558911" TEXT="non-grooming: 12"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1698678562723" ID="ID_1104620236" MODIFIED="1698678757099" TEXT="Verdacht bestätigt">
|
||||
<arrowlink COLOR="#43a3ba" DESTINATION="ID_71450734" ENDARROW="Default" ENDINCLINATION="-8;32;" ID="Arrow_ID_556655771" STARTARROW="None" STARTINCLINATION="-1;-9;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1698678620043" ID="ID_1446446292" MODIFIED="1698678637051" TEXT="während der Grooming-holder mit Output beschäftigt ist..."/>
|
||||
<node CREATED="1698678638145" ID="ID_1087870120" MODIFIED="1698679544330" TEXT="...werden andere Threads als DISPATCH klassifiziert und gehen in spinning-wait">
|
||||
<linktarget COLOR="#ab2254" DESTINATION="ID_1087870120" ENDARROW="Default" ENDINCLINATION="-356;12;" ID="Arrow_ID_187678307" SOURCE="ID_429172374" STARTARROW="None" STARTINCLINATION="215;13;"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1698679142813" ID="ID_976863690" MODIFIED="1698679152908" TEXT="auch mal direkt mitzählen (atomic)">
|
||||
<node CREATED="1698679154779" ID="ID_904886528" MODIFIED="1698679171128" TEXT="ohne output: 1340 Aufrufe in ~60ms">
|
||||
<node CREATED="1698679469920" ID="ID_1610453198" MODIFIED="1698679474557" TEXT="erscheint OK"/>
|
||||
<node CREATED="1698679475241" ID="ID_1243726905" MODIFIED="1698679486283" TEXT="~ 2.5 Aufrufe in 100µs"/>
|
||||
</node>
|
||||
<node CREATED="1698679203240" ID="ID_492331251" MODIFIED="1698679431523" TEXT="mit output: 6000 - 9000 Aufrufe">
|
||||
<node CREATED="1698679432351" ID="ID_1890029359" MODIFIED="1698679436216" TEXT="schwankt stark"/>
|
||||
<node CREATED="1698679436734" ID="ID_1277950065" MODIFIED="1698679446975" TEXT="hängt nicht von Komplexität des Output ab"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1698680053860" ID="ID_1477905589" MODIFIED="1698680070366" TEXT="Microbenchmark der Meß-Funktion">
|
||||
<node CREATED="1698680080248" ID="ID_1604376595" MODIFIED="1698680100226" TEXT="100'000 Iterationen (pro thread)"/>
|
||||
<node CREATED="1698680071746" ID="ID_1915767027" MODIFIED="1698680266483" TEXT="single-threaded: 120ns"/>
|
||||
<node CREATED="1698680116412" ID="ID_1012490645" MODIFIED="1698680136077" TEXT="7-threads-contending: 4.5µs"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
|
|||
Loading…
Reference in a new issue