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:
Fischlurch 2023-10-30 20:22:06 +01:00
parent 6a7a2832bf
commit a087e52ab1
3 changed files with 70 additions and 31 deletions

View file

@ -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 */

View file

@ -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);

View file

@ -82647,8 +82647,7 @@ Date:&#160;&#160;&#160;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&#xf6;nnte trotzdem brauchbar sein">
@ -82661,8 +82660,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
...das kann aber erst beurteilt werden, wenn wir echte Last-Szenarien kennen. Denkbar w&#228;re, da&#223; z.B. ein real-Time Render in etwa mit 3 Cores &#252;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&#xe4;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:&#160;&#160;&#160;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:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
&#160;mean &#8788; mean&#160;&#183; 1/N &#183; ( N-1&#160;&#160;+ 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:&#160;&#160;&#160;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&#252;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:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
&#187;irgendwann eventuell&#171; 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:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
und <i>das </i>l&#228;&#223;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&#xdf; ich doch die compare-exchange-Schleife machen"/>
@ -82797,9 +82790,57 @@ Date:&#160;&#160;&#160;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&#xe4;ufig aufgerufen &#x2014; warum?">
<node COLOR="#435e98" CREATED="1698638471844" ID="ID_429172374" MODIFIED="1698679552921" TEXT="wird aber extrem h&#xe4;ufig aufgerufen &#x2014; 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="&#xfc;berpr&#xfc;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&#xe4;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&#xe4;hrend der Grooming-holder mit Output besch&#xe4;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&#xe4;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&#xb5;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&#xe4;ngt nicht von Komplexit&#xe4;t des Output ab"/>
</node>
</node>
</node>
<node CREATED="1698680053860" ID="ID_1477905589" MODIFIED="1698680070366" TEXT="Microbenchmark der Me&#xdf;-Funktion">
<node CREATED="1698680080248" ID="ID_1604376595" MODIFIED="1698680100226" TEXT="100&apos;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&#xb5;s"/>
</node>
</node>
</node>