Scheduler-test: reorganise test-setup in Stress-test-rig

With the addition of a second tool `bench::ParameterRange`,
the setup of the test-context for measurement became confusing,
since the original scheme was mostly oriented towards the
''breaking point search.''

On close investigation, I discovered several redundancies, and
moreover, it seems questionable to generate an ''adapted-schedule''
for the Parameter-Range measurement method, which aims at overloading
the scheduler and watch the time to resolve such a load peak.

The solution entertained here is to move most of the schedule-ctx setup
into the base implementation, which is typically just inherited by the
actual testcase setup. This allows to leave the decision whether to build
an adapted schedule to the actual tool. So `bench::BreakingPoint` can
always setup the adapted schedule with a specific stress-factor,
while `bench::ParameterRange` by default does nothing in this
respect, and thus the `ScheduleCtx` will provide a default schedule
with the configured level-duration (and the default for this is
lowered to 200µs here).

In a similar vein, calculation of result data points from the raw measurement
is moved over into the actual test setup, thereby gaining flexibility.
This commit is contained in:
Fischlurch 2024-04-05 22:50:06 +02:00
parent 0d3dc91584
commit d47f24d745
4 changed files with 200 additions and 40 deletions

View file

@ -393,7 +393,6 @@ namespace test {
{
usec LOAD_BASE = 500us;
uint CONCURRENCY = 4;
bool showRuns = true;
using Param = size_t;
using Table = bench::DataTable<Param>;
@ -406,10 +405,12 @@ namespace test {
}
void
collectResult(Table& data, double millis, bench::IncidenceStat const& stat)
collectResult(Table& data, Param param, double millis, bench::IncidenceStat const& stat)
{
data.time = stat.coveredTime / 1000;
data.conc = stat.avgConcurrency;
data.newRow();
data.param = param;
data.time = stat.coveredTime / 1000;
data.conc = stat.avgConcurrency;
data.jobtime = stat.activeTime/stat.activationCnt;
data.overhead = stat.timeAtConc(1) / stat.activationCnt; ////OOO not really clear if sensible
}

View file

@ -168,6 +168,7 @@ namespace test {
using usec = std::chrono::microseconds;
usec LOAD_BASE = 500us;
usec LEVEL_STEP = 200us;
usec BASE_EXPENSE = 0us;
bool SCHED_NOTIFY = true;
bool SCHED_DEPENDS = false;
@ -206,6 +207,11 @@ namespace test {
testSetup (TL& testLoad)
{
return testLoad.setupSchedule(scheduler)
.withLoadTimeBase(LOAD_BASE)
.withLevelDuration(LEVEL_STEP)
.withBaseExpense (BASE_EXPENSE)
.withSchedNotify (SCHED_NOTIFY)
.withSchedDepends(SCHED_DEPENDS)
.withJobDeadline(100ms)
.withUpfrontPlanning();
}
@ -257,11 +263,7 @@ namespace test {
void
configureTest (TestSetup& testSetup, double stressFac)
{
testSetup.withLoadTimeBase(CONF::LOAD_BASE)
.withBaseExpense (CONF::BASE_EXPENSE)
.withSchedNotify (CONF::SCHED_NOTIFY)
.withSchedDepends(CONF::SCHED_DEPENDS)
.withInstrumentation(CONF::INSTRUMENTATION) // side-effect: clear existing statistics
testSetup.withInstrumentation(CONF::INSTRUMENTATION) // side-effect: clear existing statistics
.withAdaptedSchedule(stressFac, CONF::CONCURRENCY, adjustmentFac);
}
@ -468,21 +470,14 @@ namespace test {
void
runTest (Table& data)
runTest (Param param, Table& data)
{
Param param = data.param;
double stressFac = 1.0;
TestLoad testLoad = CONF::testLoad(param).buildTopology();
TestSetup testSetup = CONF::testSetup (testLoad)
.withLoadTimeBase(CONF::LOAD_BASE)
.withBaseExpense (CONF::BASE_EXPENSE)
.withSchedNotify (CONF::SCHED_NOTIFY)
.withSchedDepends(CONF::SCHED_DEPENDS)
.withAdaptedSchedule(stressFac, CONF::CONCURRENCY)
.withInstrumentation();
.withInstrumentation(); // Note: by default Schedule with CONF::LEVEL_STEP
double millis = testSetup.launch_and_wait() / 1000;
auto stat = testSetup.getInvocationStatistic();
CONF::collectResult (data, millis, stat);
CONF::collectResult (data, param, millis, stat);
}
public:
@ -514,12 +509,8 @@ namespace test {
if (minP > lower) points[cnt-1] = lower;
Table results;
for (Param& point : points)
{
results.newRow();
results.param = point;
runTest (results);
}
for (Param point : points)
runTest (point, results);
return results;
}
};

View file

@ -1944,12 +1944,6 @@ namespace test {
return move(*this);
}
ScheduleCtx&&
withBaseExpense ()
{
return move(*this);
}
/**
* Establish a differentiated schedule per level, taking node weights into account
* @param stressFac further proportional tightening of the schedule times

View file

@ -112002,14 +112002,59 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1708738935308" ID="ID_762477739" MODIFIED="1708738938240" TEXT="Parameter">
<node CREATED="1708738939092" ID="ID_1336682025" MODIFIED="1708738949919" TEXT="REPETITIONS : meint hier die Zahl der Me&#xdf;l&#xe4;ufe"/>
<node CREATED="1708738958993" ID="ID_366857603" MODIFIED="1708739018813" TEXT="lower, upper : Grenzen des Parameterbereichs"/>
<node CREATED="1708744051168" ID="ID_832742285" MODIFIED="1708744058443" TEXT="Typ des Parameters als Template PAR"/>
<node CREATED="1708744051168" ID="ID_832742285" MODIFIED="1712238251481" TEXT="Typ des Parameters als Typ-Parameter"/>
<node CREATED="1712238264496" ID="ID_1762169754" MODIFIED="1712238611252" TEXT="Setup-Klasse relativ flexibel">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<ul>
<li>
legt Parameter-Typ und Ergebnis-Spalten fest
</li>
<li>
konfiguriert f&#252;r jeden Lauf erneut einen Graphen
</li>
<li>
ist auch f&#252;r das Aufsammeln der Ergebnisse zust&#228;ndig
</li>
</ul>
</body>
</html></richcontent>
<arrowlink COLOR="#66a0bc" DESTINATION="ID_1813891417" ENDARROW="Default" ENDINCLINATION="221;-14;" ID="Arrow_ID_305160226" STARTARROW="None" STARTINCLINATION="246;-21;"/>
<linktarget COLOR="#586fba" DESTINATION="ID_1762169754" ENDARROW="Default" ENDINCLINATION="470;43;" ID="Arrow_ID_117823155" SOURCE="ID_1082061089" STARTARROW="None" STARTINCLINATION="-465;30;"/>
</node>
<node CREATED="1708743962212" ID="ID_1501901450" MODIFIED="1708743996092" TEXT="Result-Vector...">
<node CREATED="1708743998321" ID="ID_1433691531" MODIFIED="1708744007997" TEXT="mit zuf&#xe4;lligen Me&#xdf;punkten f&#xfc;llen">
<node CREATED="1708744023987" ID="ID_1484783314" MODIFIED="1708744039517" TEXT="vorsicht rand() &#x27fc; int"/>
<node CREATED="1708744039986" ID="ID_699704031" MODIFIED="1708744044277" TEXT="besser mit double rechnen"/>
<node CREATED="1712238325221" ID="ID_1357843091" MODIFIED="1712238338629" TEXT="zuf&#xe4;llige Me&#xdf;punkte w&#xe4;hlen">
<node CREATED="1712238351377" ID="ID_1764303448" MODIFIED="1712238374218" TEXT="random-double &#x27fc; Param"/>
<node CREATED="1712238382829" ID="ID_995719298" MODIFIED="1712238392912" TEXT="sicherstellen da&#xdf; Grenzpunkte mit dabei sind"/>
</node>
<node CREATED="1708744009942" ID="ID_1661435132" MODIFIED="1708744019908" TEXT="sicherstellen da&#xdf; die Grenzpunkte mit dabei sind"/>
</node>
<node CREATED="1712238397411" ID="ID_155768857" MODIFIED="1712238412957" TEXT="Ergebnisse: Daten-Tabelle &#x27fc; CSV">
<node CREATED="1712238423304" ID="ID_1813891417" MODIFIED="1712238450505" TEXT="Ergebnis-Spalten werden im Setup festgelegt">
<linktarget COLOR="#66a0bc" DESTINATION="ID_1813891417" ENDARROW="Default" ENDINCLINATION="221;-14;" ID="Arrow_ID_305160226" SOURCE="ID_1762169754" STARTARROW="None" STARTINCLINATION="246;-21;"/>
</node>
<node CREATED="1712238458491" ID="ID_112442438" MODIFIED="1712238472711" TEXT="darauf statistische Auswertungen / lineare Regression"/>
<node CREATED="1712238473499" ID="ID_109820250" MODIFIED="1712238539719" TEXT="Darstellung als Gnuplot">
<arrowlink COLOR="#4a8bb7" DESTINATION="ID_561451802" ENDARROW="Default" ENDINCLINATION="330;-389;" ID="Arrow_ID_787725069" STARTARROW="None" STARTINCLINATION="191;23;"/>
</node>
</node>
</node>
<node CREATED="1712239286828" ID="ID_24606608" MODIFIED="1712239292967" TEXT="Me&#xdf;-Anordnung">
<node CREATED="1712239307017" ID="ID_766419855" MODIFIED="1712239339117" TEXT="Scheduler einmalig beladen"/>
<node CREATED="1712239325075" ID="ID_1203654071" MODIFIED="1712239342970" TEXT="Abarbeitung dieser Last beobachtet"/>
<node CREATED="1712239349235" ID="ID_430565338" MODIFIED="1712239370596" TEXT="typischerweise: isolierte Nodes + &#xdc;berlast">
<icon BUILTIN="idea"/>
<node CREATED="1712239372216" ID="ID_291008354" MODIFIED="1712241669759" TEXT="ist aber flexibel"/>
<node CREATED="1712239376735" ID="ID_1372923577" MODIFIED="1712241693538" TEXT="tats&#xe4;hchlicher Kontroll-Parameter frei">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...und was dieser Kontroll-Parameter tats&#228;chlich ist, wird allein durch das Setup festgelegt &#8212; denn dies erzeugt sowohl <i>jedesmal </i>eine neue Topologie
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1712241515362" ID="ID_326943240" MODIFIED="1712241527541" TEXT="kann durchaus auch regul&#xe4;res Schedule sein"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710079791943" ID="ID_1402055509" MODIFIED="1710080437833" TEXT="Integration">
@ -114733,7 +114778,8 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<node COLOR="#338800" CREATED="1712184322989" ID="ID_577782644" MODIFIED="1712190768568" TEXT="Me&#xdf;daten-Erhebung per CONF parametrisieren">
<linktarget COLOR="#502c93" DESTINATION="ID_577782644" ENDARROW="Default" ENDINCLINATION="12;-53;" ID="Arrow_ID_682783" SOURCE="ID_829995870" STARTARROW="None" STARTINCLINATION="-133;13;"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1712184635916" ID="ID_1082061089" MODIFIED="1712184646838" TEXT="stellt Typen und Bindings bereit">
<node CREATED="1712184635916" ID="ID_1082061089" MODIFIED="1712238621299" TEXT="Setup-Klasse stellt Typen und Bindings bereit">
<arrowlink COLOR="#586fba" DESTINATION="ID_1762169754" ENDARROW="Default" ENDINCLINATION="470;43;" ID="Arrow_ID_117823155" STARTARROW="None" STARTINCLINATION="-465;30;"/>
<node CREATED="1712184647946" ID="ID_1912596603" MODIFIED="1712184652269" TEXT="Typ Table">
<node CREATED="1712184719760" ID="ID_1405042081" MODIFIED="1712184724092" TEXT="ist ein DataFile"/>
</node>
@ -114756,15 +114802,143 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1712190824923" ID="ID_1753510801" MODIFIED="1712190852825" TEXT="unklar: &#xbb;overhead&#xab;-Messung">
<icon BUILTIN="help"/>
<node CREATED="1712190864143" ID="ID_438624459" MODIFIED="1712190868082" TEXT="Aussagekraft unklar"/>
<node CREATED="1712190868742" ID="ID_1042265591" MODIFIED="1712190880728" TEXT="pa&#xdf;t nicht in das gleiche Koordinatensystem"/>
<node CREATED="1712235705069" ID="ID_1990935438" MODIFIED="1712235716317" TEXT="diverse Auswertungen m&#xf6;glich"/>
<node CREATED="1712190868742" ID="ID_1042265591" MODIFIED="1712235799414" TEXT="das Meiste pa&#xdf;t nicht in das gleiche Koordinatensystem">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<ul>
<li>
weil es gar keine Zeit w&#228;re, sondern ein Prozentsatz oder Faktor
</li>
<li>
und wenn es eine Zeit w&#228;re, weil es sich auf einer komplett anderen Skala bewegt
</li>
<li>
oder weil es einige dramatische Ausrei&#223;er gibt und kein Pattern erkennbar ist
</li>
</ul>
</body>
</html></richcontent>
</node>
<node CREATED="1712190889155" ID="ID_841914264" MODIFIED="1712190916249" TEXT="messe jetzt: durchschnittliche Single-Thread-Zeit pro Job">
<icon BUILTIN="info"/>
<node CREATED="1712235962435" ID="ID_169942944" MODIFIED="1712235968597" TEXT="nach einigem Knobeln...."/>
<node CREATED="1712235969257" ID="ID_269326004" MODIFIED="1712235980940" TEXT="ergibt das sinnvolle und weitgehend konstante Werte"/>
</node>
<node CREATED="1712235662399" ID="ID_1565221854" MODIFIED="1712235681102" TEXT="&#x201e;overhead&#x201c; ist nicht der richtige Begriff">
<node CREATED="1712235820166" ID="ID_1638446802" MODIFIED="1712235905469" TEXT="L&#xf6;sung sucht Problem">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
Das ist hier definitiv der Fall!
</p>
<p>
Ich habe weitere &#187;Slots&#171; im Diagramm &#8222;zu vergeben&#8220; und ich habe noch eine Menge Statistik-Daten sowie die Laufzeit instgesamt, die ich bisher gar nicht auswerte
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1712235907066" ID="ID_36914510" MODIFIED="1712235934650" TEXT="ein Effizienzma&#xdf; oder Indikator w&#xe4;re sch&#xf6;n"/>
<node CREATED="1712236342664" ID="ID_1525305097" MODIFIED="1712236350154" TEXT="&#xbb;hampered&#xab;"/>
<node CREATED="1712236356487" ID="ID_956970194" MODIFIED="1712236363729" TEXT="&#xbb;impeded&#xab;"/>
<node CREATED="1712236376307" ID="ID_1176586430" MODIFIED="1712236379110" TEXT="&#xbb;stale&#xab;"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1712236398534" ID="ID_1916803186" MODIFIED="1712363661962" TEXT="&#x27f9; sinnvoll">
<icon BUILTIN="yes"/>
<node CREATED="1712236415206" ID="ID_494152831" MODIFIED="1712236443530" TEXT="Namen flexibilisieren"/>
<node CREATED="1712236421664" ID="ID_1114332459" MODIFIED="1712236430361" TEXT="mehrere Felder erm&#xf6;glichen"/>
<node CREATED="1712236446082" ID="ID_502918899" MODIFIED="1712236504775" TEXT="Subclassing? / mehr Baukastenprinzip?"/>
</node>
</node>
</node>
<node COLOR="#435e98" CREATED="1712244192947" ID="ID_546617772" MODIFIED="1712363104586" TEXT="Adapted schedule oder nicht?">
<icon BUILTIN="help"/>
<node CREATED="1712244210284" ID="ID_1709008622" MODIFIED="1712244225652" TEXT="pro: dann geht die Load-Time-Base gleich mit ein"/>
<node CREATED="1712244228510" ID="ID_405856128" MODIFIED="1712244250903" TEXT="contra: Scheduler m&#xf6;glicherweise gar nicht ges&#xe4;ttigt"/>
<node CREATED="1712244571097" ID="ID_754567380" MODIFIED="1712244595568" TEXT="contra: eigentlich nicht ben&#xf6;tigte Komplexit&#xe4;t">
<node CREATED="1712244603603" ID="ID_1816166046" MODIFIED="1712244886282" TEXT="hier anders als beim bench::BreakingPoint">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
dort ist das Vorgeben eines Stress-Faktors f&#252;r jeden Einzel-Lauf die zentrale Steuergr&#246;&#223;e, hier dagegen gehe ich eigentlich von einer &#220;berlastung aus, und damit sollte das vorgefertigte Schedule nur zu dicht sein, ansonsten ist es egal
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1712244627456" ID="ID_395647441" MODIFIED="1712244791508" TEXT="aber auch nicht klar ... wegen Flexibilit&#xe4;t">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...kann mir im Moment aber keine Fall vorstellen, wo man tats&#228;chlich ein Schedule vorgeben und abarbeiten lassen m&#246;chte (weil dann die Messung nur einen kritischen Pfad durch das Schedule ermittelt, nicht den Scheduler selbst ausleuchtet ... anderenfalls w&#228;re man wieder bei der breaking-Point-Suche)
</p>
</body>
</html></richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1712245236731" ID="ID_886587086" MODIFIED="1712245242829" TEXT="Entscheidungs-Problem">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1712245244421" ID="ID_49304046" MODIFIED="1712245254559" TEXT="habe hier einen zus&#xe4;tzlichen Freiheitsgrad"/>
<node CREATED="1712245256664" ID="ID_777742373" MODIFIED="1712245265718" TEXT="dieser spielt aber nur bedingt eine Rolle"/>
<node CREATED="1712245266338" ID="ID_1445718490" MODIFIED="1712245278684" TEXT="und diese Bedingtheit selber ist komplex"/>
<node CREATED="1712245307628" ID="ID_411753256" MODIFIED="1712245319830" TEXT="Au&#xdf;erdem: kann nicht einfach konfigurierbar gemacht werden"/>
<node CREATED="1712245325610" ID="ID_1102989449" MODIFIED="1712245349282" TEXT="das wird alles schrecklich komplex und verworren &#x2014; wer soll das sp&#xe4;ter mal verstehen">
<icon BUILTIN="smily_bad"/>
</node>
</node>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#3a396c" CREATED="1712359770916" ID="ID_1195522789" MODIFIED="1712363122276" TEXT="L&#xf6;sung &#x27f9; entflechten">
<icon BUILTIN="yes"/>
<node CREATED="1712359802308" ID="ID_593662279" MODIFIED="1712359826243" TEXT="die Konfigurierbarkeit kann man in die Basis-Impl dr&#xfc;cken"/>
<node CREATED="1712359834080" ID="ID_820734795" MODIFIED="1712359857536" TEXT="SETUP::testSetup(testLoad)">
<node CREATED="1712359858645" ID="ID_73952237" MODIFIED="1712359873526" TEXT="wird in 90% der F&#xe4;lle unver&#xe4;ndert geerbt"/>
<node CREATED="1712359874050" ID="ID_766853266" MODIFIED="1712359900298" TEXT="stattdessen konfiguriert man dann per Zuweisung an die Konstanten"/>
<node CREATED="1712359980308" ID="ID_1958256594" MODIFIED="1712360020979">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
man <i>k&#246;nnte </i>aber hier auch noch selber eingreifen
</p>
</body>
</html></richcontent>
</node>
</node>
<node CREATED="1712360025941" ID="ID_865033764" MODIFIED="1712360044679" TEXT="damit h&#xe4;ngt es dann vom konkreten Tool ab, ob / und welches Schedule gebaut wird"/>
<node CREATED="1712360049539" ID="ID_319622291" MODIFIED="1712363139821">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
&#10233; f&#252;r das Tool &#187;ParameterRange&#171; wird per default <b>kein</b>&#160;(adapted) Schedule erstellt
</p>
</body>
</html></richcontent>
<node CREATED="1712360103291" ID="ID_1702061263" MODIFIED="1712360111566" TEXT="das enstpricht mehr dem Bedarf"/>
<node CREATED="1712361990261" ID="ID_6407935" MODIFIED="1712362003435" TEXT="setze LEVEL_STEP = 200&#xb5;s per Default">
<icon BUILTIN="idea"/>
<node CREATED="1712362009194" ID="ID_1460896586" MODIFIED="1712362198239" TEXT="greift nur wenn kein adapted Schedule">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...was nun relevant wird f&#252;r das Tool &#187;ParameterRange&#171; &#8212; der feste default-Wert im Chain-Load-Schedule-Ctx ist 1ms, und das erscheint f&#252;r diesen Zweck als zu hoch, weil damit die Gefahr besteht, den Worker-Pool gar nicht in die Voll-Auslastung zu bekommen
</p>
</body>
</html></richcontent>
</node>
</node>
<node CREATED="1712360112105" ID="ID_600182451" MODIFIED="1712360126185" TEXT="&#x27f9; i.d.R. sollte man mit default-Steps arbeiten"/>
<node CREATED="1712360127193" ID="ID_1780932375" MODIFIED="1712360141154" TEXT="&#x27f9; opitonal kann man aber auch ein Schedule definieren"/>
</node>
</node>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1712190783314" ID="ID_561451802" MODIFIED="1712190793652" TEXT="Gnuplot-Skript generieren">
<node COLOR="#338800" CREATED="1712190783314" ID="ID_561451802" MODIFIED="1712238531623" TEXT="Gnuplot-Skript generieren">
<linktarget COLOR="#4a8bb7" DESTINATION="ID_561451802" ENDARROW="Default" ENDINCLINATION="330;-389;" ID="Arrow_ID_787725069" SOURCE="ID_109820250" STARTARROW="None" STARTINCLINATION="191;23;"/>
<icon BUILTIN="button_ok"/>
</node>
</node>