Scheduler-test: identify and fix bug in allocator

...well — more of a logical contradiction, not so much a bug.
The underlying problematic situation arises when meanwhile the
Extent storage has been expanded, and especially the active slots
are in »wrapped state«. In this case, the newly allocated extents
must be rotated in, which invalidates existing index numbers.

This problem was amended by exploting a chaching mechanism, allowing
to re-attach and validate an index position still stored in an old
iterator; especially this can happen when attempting to attach a
follow-up dependency onto a job planned earlier, but not yet scheduled.

The problem here was an assertion failure, which was triggered with a
high probability; the fix for the problem detailed above used the yield()
function, while it actually was only interested in retrieving the
Extent's address to probe if the extent matches an known storage location.

The solution is to provide a dedicated function for this check, which
can then skip the sanity check (because in this case we do not want
to use the Extent, and thus can touch obsoleted/inactive Extents
without problem)
This commit is contained in:
Fischlurch 2024-04-16 17:12:41 +02:00
parent 7c2b9a8ba5
commit 55842a8d4f
3 changed files with 484 additions and 23 deletions

View file

@ -54,6 +54,8 @@
** obsolete goals is pointless and can be just side stepped. Once the scheduling has
** passed a defined deadline (and no further pending IO operations are around), the
** Epoch can be abandoned as a whole and the storage extent can be re-used.
** @warning this implies any access after the deadline is _undefined behaviour,_
** spanning also further use of the AllocatorHandle obtained for a deadline.
**
** Dynamic adjustments are necessary to keep this scheme running efficiently.
** Ideally, the temporal stepping between subsequent Epochs should be chosen such
@ -516,6 +518,8 @@ namespace gear {
/**
* initiate allocations for activities to happen until some deadline
* @return opaque handle allowing to perform several allocations.
* @warning should not be used after the deadline has passed,
* since memory will then be re-used and overwritten.
*/
AllocatorHandle
until (Time deadline)

View file

@ -185,12 +185,12 @@ namespace mem {
void
validatePos (Extent* knownTarget)
{
if (knownTarget == & yield())
if (exFam->matchPos (index,knownTarget))
return;
size_t prevIdx = index;
do{
iterNext();
if (knownTarget == & yield())
if (exFam->matchPos (index,knownTarget))
return;
}
while (index != prevIdx);
@ -350,6 +350,13 @@ namespace mem {
: (start_ <= idx and idx < after_);
}
bool
matchPos (size_t idx, void* address)
{
REQUIRE (idx < slotCnt());
return address == extents_[idx].get();
}
Extent&
access (size_t idx) const
{

View file

@ -86672,6 +86672,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#338800" CREATED="1703437483570" FOLDED="true" ID="ID_1892931558" MODIFIED="1703724909995" TEXT="verbleibendes technisches Problem: Invalidierung durch Epochen-&#xdc;berlauf">
<icon BUILTIN="button_ok"/>
<node CREATED="1703437521285" ID="ID_775703939" MODIFIED="1703440908947" TEXT="eine sehr seltene und spezielle Situation &#x2014; und sehr t&#xfc;ckisch">
<linktarget COLOR="#c73b6c" DESTINATION="ID_775703939" ENDARROW="Default" ENDINCLINATION="-1012;1337;" ID="Arrow_ID_501409702" SOURCE="ID_1556816113" STARTARROW="None" STARTINCLINATION="-1727;92;"/>
<node CREATED="1703437588221" ID="ID_607223766" MODIFIED="1703438380011" TEXT="folgt aus der Struktur mit einem Deadline-gebundenen AllocatorHandle">
<richcontent TYPE="NOTE"><html>
<head/>
@ -87693,6 +87694,33 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1703724370425" ID="ID_933611212" MODIFIED="1703724803251" TEXT="deshalb ist der Allocator nun im Microbenchmark sogar minimal schneller">
<arrowlink COLOR="#2b72c5" DESTINATION="ID_576453194" ENDARROW="Default" ENDINCLINATION="357;24;" ID="Arrow_ID_1759861140" STARTARROW="None" STARTINCLINATION="573;22;"/>
</node>
<node COLOR="#338800" CREATED="1713279448677" ID="ID_1699330405" LINK="#ID_1493818454" MODIFIED="1713279611750" TEXT="sp&#xe4;ter: noch ein Folge-Fehler &#x2014; nach Fix korrektes Verhalten verifiziert">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...ich hatte diesen Fix nur oberfl&#228;chlich getestet, und dabei &#252;bersehen, da&#223; eine Assertion ansprechen kann (sogar sehr wahrscheinlich einmal ansprechen wird, sobald der Reparatur-Mechanismus eine gr&#246;&#223;tere Strecke zur&#252;cklegt). Das ist aber kein Bug im eigentlichen Reparatur-/reLink-Mechanismus; dieser funktioniert pr&#228;zise, wie ich nochmals im einzelnen mit dem Debugger nachvollziehen konnte.
</p>
</body>
</html>
</richcontent>
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#435e98" CREATED="1713279615787" ID="ID_307598630" MODIFIED="1713279730132" TEXT="Deadlines sind ein separates Thema">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
wenn eine Deadline &#252;berfahren wurde, ist ein weiterer Zugriff auf den Extend als _undefined behaviour_ zu betrachten. Das gilt auch f&#252;r das AllocatorHandle, das man fr&#252;her mal f&#252;r eine bestimmte Deadline bekommen hat; dieses kann man sehr wohl weiterhin verwenden (solange die Deadline noch in der Zukunft liegt). Konkreter Fall: sp&#228;ter noch eine Dependency anh&#228;ngen. Wenn der Anker dieser Dependecy zu dem Zeitpunkt bereits ausgef&#252;hrt oder invalidiert wurde, ist man selber schuld!
</p>
</body>
</html></richcontent>
<icon BUILTIN="yes"/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1703601256942" HGAP="0" ID="ID_607541044" MODIFIED="1703601370098" TEXT="Verbesserung im Test deutlich sichtbar" VSHIFT="3">
@ -96194,11 +96222,15 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</html></richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697733236455" ID="ID_698621499" MODIFIED="1697733269203" TEXT="Realtime Full-Load Test">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697733236455" ID="ID_698621499" MODIFIED="1713110634092" TEXT="Realistic Full-Load Test">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1697733438012" ID="ID_18653531" MODIFIED="1697733448582" TEXT="Ziel: Vollast unter Zeitbeschr&#xe4;nkung"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1704765993176" ID="ID_549174207" MODIFIED="1704766137597" TEXT="Zwischenziel: hohe Auslastung im Test erreichen">
<arrowlink COLOR="#3832ae" DESTINATION="ID_161148852" ENDARROW="Default" ENDINCLINATION="-712;-56;" ID="Arrow_ID_1703930922" STARTARROW="None" STARTINCLINATION="289;17;"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1704765993176" ID="ID_549174207" MODIFIED="1713110710552" TEXT="Zwischenziel: hohe Auslastung im Test erreichen">
<arrowlink COLOR="#3832ae" DESTINATION="ID_161148852" ENDARROW="Default" ENDINCLINATION="-712;-56;" ID="Arrow_ID_1703930922" STARTARROW="None" STARTINCLINATION="333;19;"/>
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1704765993176" ID="ID_1479474389" MODIFIED="1713110700090" TEXT="Ziel: Auslastung kontrolliert aufrechterhalten">
<arrowlink COLOR="#3832ae" DESTINATION="ID_1350821310" ENDARROW="Default" ENDINCLINATION="-712;-56;" ID="Arrow_ID_320251207" STARTARROW="None" STARTINCLINATION="289;17;"/>
<icon BUILTIN="yes"/>
</node>
</node>
@ -110731,7 +110763,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</html></richcontent>
<icon BUILTIN="list"/>
<node CREATED="1703377546048" ID="ID_550271885" MODIFIED="1703377564481" TEXT="der Haupt-Job wurde dispatched aber scheitert an der Deadline"/>
<node CREATED="1703377729957" ID="ID_1005606488" MODIFIED="1703377743867" TEXT="es laufen zwe &#xbb;Tick&#xab; innerhalb kurzer Zeit"/>
<node CREATED="1703377729957" ID="ID_1005606488" MODIFIED="1703377743867" TEXT="es laufen zwei &#xbb;Tick&#xab; innerhalb kurzer Zeit"/>
<node CREATED="1703377744688" ID="ID_582267925" MODIFIED="1703377779491" TEXT="Grund: Queue ist bereits empty &#x27f9; n&#xe4;chster Job &#x27fc; ignite()"/>
</node>
</node>
@ -111019,7 +111051,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1704288897590" ID="ID_1251840457" MODIFIED="1704288911094" TEXT="Parameter + Grenzen f&#xfc;r eine Standard-Last herausfinden"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1704766027439" ID="ID_161148852" MODIFIED="1704919268932" TEXT="Untersuchung-1: hohe Auslastung">
<linktarget COLOR="#3832ae" DESTINATION="ID_161148852" ENDARROW="Default" ENDINCLINATION="-712;-56;" ID="Arrow_ID_1703930922" SOURCE="ID_549174207" STARTARROW="None" STARTINCLINATION="289;17;"/>
<linktarget COLOR="#3832ae" DESTINATION="ID_161148852" ENDARROW="Default" ENDINCLINATION="-712;-56;" ID="Arrow_ID_1703930922" SOURCE="ID_549174207" STARTARROW="None" STARTINCLINATION="333;19;"/>
<icon BUILTIN="pencil"/>
<node CREATED="1704766160781" ID="ID_1879705815" MODIFIED="1704766424803" TEXT="bisher ging es um Dependency-Management &#x2014; nun geht es um &#xbb;Last&#xab;">
<richcontent TYPE="NOTE"><html>
@ -111032,8 +111064,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</html></richcontent>
</node>
<node CREATED="1704766425859" ID="ID_819162648" MODIFIED="1704766437260" TEXT="geeignetes Last-Pattern aufbauen">
<node COLOR="#435e98" CREATED="1704766438235" FOLDED="true" ID="ID_49179977" MODIFIED="1712595247094" TEXT="Idee: &#xfc;bers&#xe4;ttigte Seeds + Breiten-Limitierung">
<node COLOR="#435e98" CREATED="1704766438235" FOLDED="true" ID="ID_49179977" MODIFIED="1713111210424" TEXT="Idee: repetitive Pattern + Breiten-Limitierung">
<linktarget COLOR="#4c5ab8" DESTINATION="ID_49179977" ENDARROW="Default" ENDINCLINATION="-515;1146;" ID="Arrow_ID_640223049" SOURCE="ID_1751068516" STARTARROW="None" STARTINCLINATION="-64;-3;"/>
<linktarget COLOR="#4c5ab8" DESTINATION="ID_49179977" ENDARROW="Default" ENDINCLINATION="-549;1037;" ID="Arrow_ID_1912342428" SOURCE="ID_128782461" STARTARROW="None" STARTINCLINATION="-322;0;"/>
<icon BUILTIN="idea"/>
<node CREATED="1704849761430" ID="ID_973472982" MODIFIED="1705011573250" TEXT="Graph-1: massiv-vernetzt">
<node CREATED="1704849789603" ID="ID_1248796850" MODIFIED="1704850126462" STYLE="bubble">
@ -111125,10 +111158,18 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1704850649695" ID="ID_204505064" MODIFIED="1704850663456" TEXT="sofort bis zum Anschlag parallel"/>
<node CREATED="1704850664900" ID="ID_1637288846" MODIFIED="1704850693948" TEXT="jeweils 4 Einzelketten, dann eine Zusammenhangskette mit 2 gestuften Joins"/>
<node CREATED="1704849868616" ID="ID_1616250866" MODIFIED="1704849883546" TEXT="&#x2205;pL = 5.8"/>
<node CREATED="1713111281419" ID="ID_1398808375" MODIFIED="1713111308931" TEXT="&#x2205;pL = 7.53 f&#xfc;r 256 Nodes + Breitenbeschr&#xe4;nkung auf 8"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1704915286895" ID="ID_263249206" MODIFIED="1704915298866" TEXT="beobachten wie sich diese Varianten verhalten">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#5b280f" CREATED="1704915286895" ID="ID_263249206" MODIFIED="1713110849611" TEXT="beobachten wie sich diese Varianten verhalten">
<icon BUILTIN="button_cancel"/>
<node CREATED="1713110853723" ID="ID_1285288868" MODIFIED="1713110861442" TEXT="Nein! das ist zu fr&#xfc;h">
<icon BUILTIN="stop-sign"/>
</node>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1713110862394" ID="ID_1913007758" MODIFIED="1713110929573" TEXT="erst mu&#xdf; ich mit einer m&#xf6;glichst einfachen Last die Grenzen austesten">
<arrowlink COLOR="#5590d5" DESTINATION="ID_430565338" ENDARROW="Default" ENDINCLINATION="20;-51;" ID="Arrow_ID_1521128110" STARTARROW="None" STARTINCLINATION="362;14;"/>
<icon BUILTIN="yes"/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1707665157695" ID="ID_816908094" MODIFIED="1707665443782" TEXT="Reflexion zur Me&#xdf;methode">
<linktarget COLOR="#e92743" DESTINATION="ID_816908094" ENDARROW="Default" ENDINCLINATION="385;463;" ID="Arrow_ID_1403296989" SOURCE="ID_909181249" STARTARROW="None" STARTINCLINATION="-756;36;"/>
@ -115153,6 +115194,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<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="1712595553285" TEXT="typischerweise: isolierte Nodes + &#xdc;berlast">
<linktarget COLOR="#5590d5" DESTINATION="ID_430565338" ENDARROW="Default" ENDINCLINATION="20;-51;" ID="Arrow_ID_1521128110" SOURCE="ID_1913007758" STARTARROW="None" STARTINCLINATION="362;14;"/>
<linktarget COLOR="#4861c1" DESTINATION="ID_430565338" ENDARROW="Default" ENDINCLINATION="-805;54;" ID="Arrow_ID_1774826239" SOURCE="ID_1917510294" STARTARROW="None" STARTINCLINATION="373;-26;"/>
<icon BUILTIN="idea"/>
<node CREATED="1712239372216" ID="ID_291008354" MODIFIED="1712241669759" TEXT="ist aber flexibel"/>
@ -116210,6 +116252,420 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1704766027439" ID="ID_1350821310" MODIFIED="1713110695900" TEXT="Untersuchung-2: steady work state">
<linktarget COLOR="#3832ae" DESTINATION="ID_1350821310" ENDARROW="Default" ENDINCLINATION="-712;-56;" ID="Arrow_ID_320251207" SOURCE="ID_1479474389" STARTARROW="None" STARTINCLINATION="289;17;"/>
<icon BUILTIN="pencil"/>
<node CREATED="1713110807801" ID="ID_11893474" MODIFIED="1713110819844" TEXT="Aufgabe weiterhin: geeignete Last aufbauen">
<node CREATED="1712595181747" ID="ID_128782461" MODIFIED="1713110946545" TEXT="gehe wieder von den &#xbb;kleine Graphen&#xab; aus">
<arrowlink COLOR="#4c5ab8" DESTINATION="ID_49179977" ENDARROW="Default" ENDINCLINATION="-549;1037;" ID="Arrow_ID_1912342428" STARTARROW="None" STARTINCLINATION="-322;0;"/>
<node CREATED="1713111325229" ID="ID_1211516688" MODIFIED="1713111338663" TEXT="1. Ansatz: Breitenbeschr&#xe4;nkung nutzen">
<node CREATED="1713111339939" ID="ID_908498578" MODIFIED="1713111348070" TEXT="verwende Graph-3: massiv-parallel"/>
<node CREATED="1713111348923" ID="ID_640317274" MODIFIED="1713111360772" TEXT="Chain-Load ist auf 8 Nodes beschr&#xe4;nkt"/>
<node CREATED="1713111370079" ID="ID_1165922148" MODIFIED="1713111383009" TEXT="es ergeben sich 7.53 Nodes / Level"/>
<node CREATED="1713111361384" ID="ID_1183485948" MODIFIED="1713111367309" TEXT="rechne mit 8 Kernen"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1713110964437" ID="ID_1985468535" MODIFIED="1713110974268" TEXT="Beobachtung wieder im Stress-Test-Rig">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1713111196126" ID="ID_850536834" MODIFIED="1713138669660" TEXT="6.Test">
<icon BUILTIN="pencil"/>
<node CREATED="1713111392612" ID="ID_248623434" LINK="#ID_1699065000" MODIFIED="1713111422512" TEXT="Graph-3 mit 8-Nodes Breite und 8 Kernen">
<node CREATED="1713111480488" ID="ID_1948015468" MODIFIED="1713111524014" TEXT="63% Seed, 31% Exit, 12% Join, 8% inner Nodes"/>
<node CREATED="1713111537808" ID="ID_1390128414" MODIFIED="1713111552841" TEXT="&#x2205; 4.74 Seeds / Level"/>
<node CREATED="1713111566349" ID="ID_1541990956" MODIFIED="1713111576447" TEXT="&#x2205; 0.91 Join / Level"/>
</node>
<node COLOR="#5b280f" CREATED="1713112014301" ID="ID_535829988" MODIFIED="1713112701480" TEXT="mit einer BaseExpense = 200&#xb5;s ergibt sich eine sonderbare Abweichung">
<icon BUILTIN="button_cancel"/>
<node CREATED="1713112705699" ID="ID_1707549417" MODIFIED="1713112710131" TEXT="N&#xe4;mlich ein Stress-Faktor ~3"/>
<node CREATED="1713112053159" ID="ID_641736993" MODIFIED="1713112060978" TEXT="das ist dann wohl eine Stellschraube zu viel"/>
<node CREATED="1713112247291" ID="ID_284639344" MODIFIED="1713112265000" TEXT="verstehe aber dennoch nicht, warum dann so viel &#xbb;Luft&#xab; entsteht"/>
<node CREATED="1713112304323" ID="ID_1867863120" MODIFIED="1713112419494" TEXT="doch! klingt plausibel">
<node CREATED="1713112420626" ID="ID_1140249216" MODIFIED="1713112451332" TEXT="durch die hohe nominelle Concurrency werden nur 500&#xb5;s f&#xfc;r 8 Nodes alloziert"/>
<node CREATED="1713112452182" ID="ID_840252908" MODIFIED="1713112476377" TEXT="aber der BaseExpense ist pro Node, also + 8*200&#xb5;s"/>
<node CREATED="1713112477227" ID="ID_714621864" MODIFIED="1713112497310" TEXT="das ist eine zus&#xe4;tzliche Spreizung um Faktor 3.2"/>
</node>
<node COLOR="#435e98" CREATED="1713112728045" FOLDED="true" ID="ID_317332327" MODIFIED="1713138662011" TEXT="wo bleibt dann aber die tats&#xe4;chliche BaseExpense?">
<icon BUILTIN="help"/>
<node CREATED="1713113053955" ID="ID_1665688338" MODIFIED="1713113079288" TEXT="sollte ja au&#xdf;erhalb der gemessenen Job-Zeiten liegen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
und damit nicht &#252;ber eine Abweichung der Job-Zeiten in den Formfaktor eingehen
</p>
</body>
</html></richcontent>
</node>
<node COLOR="#435e98" CREATED="1713113092429" ID="ID_674076723" MODIFIED="1713131827112" TEXT="&#x27f9; die tats&#xe4;chliche Concurrency ausgeben">
<node CREATED="1713131159383" ID="ID_1723960817" MODIFIED="1713131190568">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
naja... die ist <i>unterirdisch</i>
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1713131550668" ID="ID_1108435309" MODIFIED="1713138652526" TEXT="bewegt sich um 2 &#x2014; Tendenz fallend">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
zur Erinnerung: in einer Serie machen wir ja eine Art Konvergenz auf einen effektiven Form-Faktor hin. Mit den Ergebnissen eines Laufes wird f&#252;r den n&#228;chsten Lauf nachjustiert; der von au&#223;en vorgegebene (nominelle) Stre&#223;-Faktor bleibt, aber die tats&#228;chliche Dichte wird so optimiert, da&#223; die dann effektiv diesem Faktor entspricht. Im Zuge dieser Anpassung wird anscheinend das Schedule jeweils etwas verdichtet, und die erreichte Concurency f&#228;llt (von etwas &#252;ber 2 auf 1.6 zuletzt)
</p>
</body>
</html></richcontent>
<linktarget COLOR="#a32248" DESTINATION="ID_1108435309" ENDARROW="Default" ENDINCLINATION="-451;33;" ID="Arrow_ID_1455964137" SOURCE="ID_1397026936" STARTARROW="None" STARTINCLINATION="748;-44;"/>
</node>
<node CREATED="1713131782234" ID="ID_68565346" MODIFIED="1713131814392" TEXT="das ist aber bei einer Last = 500&#xb5;s auch nicht &#xfc;berraschend">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
zumindest nach den inzwischen vorliegenden Beobachtungen aus dem Param-Range-Setup
</p>
</body>
</html></richcontent>
</node>
</node>
<node CREATED="1713131850473" ID="ID_1125776266" MODIFIED="1713131889256" TEXT="die Verarbeitung ist ohnehin sehr ineffizient"/>
<node CREATED="1713131889852" ID="ID_1549644913" MODIFIED="1713131914117" TEXT="und der Admin-Overhead geht da irgendwo mit ein"/>
<node CREATED="1713131914870" ID="ID_1307381427" MODIFIED="1713131934784" TEXT="das alles wird aber vom Form-Faktor (per Abweichung Concurrency) abgefangen"/>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1713138604028" ID="ID_1397026936" MODIFIED="1713138661033" TEXT="Concurrency ist niedrig">
<arrowlink COLOR="#a32248" DESTINATION="ID_1108435309" ENDARROW="Default" ENDINCLINATION="-451;33;" ID="Arrow_ID_1455964137" STARTARROW="None" STARTINCLINATION="748;-44;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1713132789379" ID="ID_340707211" MODIFIED="1713279753842" TEXT="mal mit l&#xe4;ngerer Job-Load (5ms) versuchen">
<icon BUILTIN="pencil"/>
</node>
<node COLOR="#435e98" CREATED="1713132381066" FOLDED="true" ID="ID_651763651" MODIFIED="1713279739989" TEXT="Fehlzugriff aus dem Allocator (isValidPos (idx))">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
extent-family.hpp:356
</p>
</body>
</html></richcontent>
<icon BUILTIN="broken-line"/>
<node CREATED="1713132457217" ID="ID_1257716735" LINK="#ID_917615827" MODIFIED="1713132548204" TEXT="die gleiche Assertion hat schon fr&#xfc;her angesprochen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...damals allerdings aus einem ganz anderen Kontext, der inzwischen durch einen Umbau im Scheduler behoben ist/sein sollte.
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1713132773293" ID="ID_818906770" MODIFIED="1713132783368" TEXT="aufgetreten nach wenigen L&#xe4;ufen der 1.Serie">
<node CREATED="1713132811175" ID="ID_1384338907" MODIFIED="1713132859169">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
<font color="#114cbf">&#187;investigateWorkProcessing&#171;</font>
</p>
<p>
&#8709;conc:7.29344
</p>
<p>
&#8709;conc:6.53128
</p>
<p>
&#8709;conc:6.24495
</p>
<p>
&#8709;conc:6.082
</p>
<p>
<font face="Monospaced" color="#fe0d0d">PRECONDITION: extent-family.hpp:356: thread_9: access: (isValidPos (idx)) </font>
</p>
</body>
</html></richcontent>
</node>
</node>
<node CREATED="1713132874202" ID="ID_222679060" MODIFIED="1713190676385" TEXT="Stacktrace">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
<font face="Monospaced" size="2">0000000609: PRECONDITION: extent-family.hpp:356: thread_9: access: (isValidPos (idx)) </font>
</p>
<p>
<font face="Monospaced" size="2">vault::mem::ExtentFamily&lt;vault::gear::Activity, 500ul&gt;::access(unsigned long) const+0xdd </font>
</p>
<p>
<font face="Monospaced" size="2">vault::mem::ExtentFamily&lt;vault::gear::Activity, 500ul&gt;::IdxLink::yield() const+0x26 </font>
</p>
<p>
<font face="Monospaced" size="2">vault::mem::ExtentFamily&lt;vault::gear::Activity, 500ul&gt;::IdxLink::validatePos(vault::mem::ExtentFamily&lt;vault::gear::Activity, 500ul&gt;::Extent*)+0x52 </font>
</p>
<p>
<font face="Monospaced" size="2">vault::gear::BlockFlow&lt;vault::gear::blockFlow::RenderConfig&gt;::</font><font face="Monospaced" size="2" color="#761602">StorageAdaptor::iterNext()</font><font face="Monospaced" size="2">+0x23 </font>
</p>
<p>
<font face="Monospaced" size="2">lib::IterableDecorator&lt;vault::gear::blockFlow::Epoch&lt;vault::mem::ExtentFamily&lt;vault::gear::Activity, 500ul&gt; &gt;, vault::gear::BlockFlow&lt;vault::gear::blockFlow::RenderConfig&gt;::StorageAdaptor&gt;::</font><font face="Monospaced" size="2" color="#8e2207">operator++()</font><font face="Monospaced" size="2">+0x20 </font>
</p>
<p>
<font face="Monospaced" size="2">vault::gear::BlockFlow&lt;vault::gear::blockFlow::RenderConfig&gt;::AllocatorHandle::</font><font face="Monospaced" size="2" color="#673e04">claimSlot()</font><font face="Monospaced" size="2">+0x228 </font>
</p>
<p>
<font face="Monospaced" size="2">vault::gear::Activity&amp; vault::gear::BlockFlow&lt;vault::gear::blockFlow::RenderConfig&gt;::AllocatorHandle::create&lt;vault::gear::Activity::Verb&gt;(vault::gear::Activity::Verb&amp;&amp;)+0x2e </font>
</p>
<p>
<font face="Monospaced" size="2">vault::gear::activity::Term::appendNotificationTo(vault::gear::activity::Term&amp;, bool)+0x2f </font>
</p>
<p>
<font face="Monospaced" size="2">vault::gear::ScheduleSpec::</font><font color="#c50955" face="Monospaced" size="2">linkToPredecessor</font><font face="Monospaced" size="2">(vault::gear::ScheduleSpec&amp;, bool)+0x68 </font>
</p>
<p>
<font face="Monospaced" size="2">vault::gear::test::TestChainLoad&lt;8ul&gt;::</font><font color="#c80202" face="Monospaced" size="2">ScheduleCtx::<b>continuation</b></font><font face="Monospaced" size="2">(unsigned long, unsigned long, unsigned long, bool)+0x2ef </font>
</p>
<p>
<font face="Monospaced" size="2">vault::gear::test::TestChainLoad&lt;8ul&gt;::ScheduleCtx::performRun()::{lambda(unsigned long, unsigned long, unsigned long, bool)#3}::operator()(unsigned long, unsigned long, unsigned long, bool) const+0x40 </font>
</p>
<p>
<font face="Monospaced" size="2">std::_Function_handler&lt;void (unsigned long, unsigned long, unsigned long, bool), vault::gear::test::TestChainLoad&lt;8ul&gt;::ScheduleCtx::performRun()::{lambda(unsigned long, unsigned long, unsigned long, bool)#3}&gt;::_M_invoke(std::_Any_data const&amp;, unsigned long&amp;&amp;, std::_Any_data const&amp;, std::_Any_data const&amp;, bool&amp;&amp;)+0x86 </font>
</p>
<p>
<font face="Monospaced" size="2">std::function&lt;void (unsigned long, unsigned long, unsigned long, bool)&gt;::operator()(unsigned long, unsigned long, unsigned long, bool) const+0x90 </font>
</p>
<p>
<font face="Monospaced" size="2">vault::gear::test::</font><font color="#5401bd" face="Monospaced" size="2">RandomChainPlanFunctor</font><font face="Monospaced" size="2">&lt;8ul&gt;::invokeJobOperation(lumiera_jobParameter_struct const&amp;)+0x2ca </font>
</p>
<p>
<font face="Monospaced" size="2">vault::gear::Activity::invokeFunktor(lib::time::Time)+0x740 </font>
</p>
<p>
<font face="Monospaced" size="2">vault::gear::activity::Proc vault::gear::Activity::activate&lt;vault::gear::Scheduler::ExecutionCtx&gt;(lib::time::Time, vault::gear::Scheduler::ExecutionCtx&amp;)+0x70 </font>
</p>
<p>
<font face="Monospaced" size="2">vault::gear::activity::Proc vault::gear::ActivityLang::activateChain&lt;vault::gear::Scheduler::ExecutionCtx&gt;(vault::gear::Activity*, vault::gear::Scheduler::ExecutionCtx&amp;)+0x4e </font>
</p>
<p>
<font face="Monospaced" size="2">vault::gear::activity::Proc vault::gear::ActivityLang::dispatchChain&lt;vault::gear::Scheduler::ExecutionCtx&gt;(vault::gear::Activity*, vault::gear::Scheduler::ExecutionCtx&amp;)+0x68 </font>
</p>
<p>
<font face="Monospaced" size="2">vault::gear::Scheduler::doWork()::{lambda(vault::gear::ActivationEvent)#1}::operator()(vault::gear::ActivationEvent) const+0x4d </font>
</p>
<p>
<font face="Monospaced" size="2">vault::gear::SchedulerCommutator::dispatchCapacity&lt;vault::gear::Scheduler::doWork()::{lambda(vault::gear::ActivationEvent)#1}, vault::gear::Scheduler::doWork()::{lambda()#2}&gt;(vault::gear::SchedulerInvocation&amp;, vault::gear::LoadController&amp;, vault::gear::Scheduler::doWork()::{lambda(vault::gear::ActivationEvent)#1}, vault::gear::Scheduler::doWork()::{lambda()#2})::{lambda()#2}::operator()() const+0x8f </font>
</p>
<p>
<font face="Monospaced" size="2">vault::gear::SchedulerCommutator::WorkerInstruction vault::gear::SchedulerCommutator::WorkerInstruction::performStep&lt;vault::gear::SchedulerCommutator::dispatchCapacity&lt;vault::gear::Scheduler::doWork()::{lambda(vault::gear::ActivationEvent)#1}, vault::gear::Scheduler::doWork()::{lambda()#2}&gt;(vault::gear::SchedulerInvocation&amp;, vault::gear::LoadController&amp;, vault::gear::Scheduler::doWork()::{lambda(vault::gear::ActivationEvent)#1}, vault::gear::Scheduler::doWork()::{lambda()#2})::{lambda()#2}&gt;(vault::gear::LoadController)+0x1f </font>
</p>
<p>
<font face="Monospaced" size="2">vault::gear::activity::Proc vault::gear::SchedulerCommutator::dispatchCapacity&lt;vault::gear::Scheduler::doWork()::{lambda(vault::gear::ActivationEvent)#1}, vault::gear::Scheduler::doWork()::{lambda()#2}&gt;(vault::gear::SchedulerInvocation&amp;, vault::gear::LoadController&amp;, vault::gear::Scheduler::doWork()::{lambda(vault::gear::ActivationEvent)#1}, vault::gear::Scheduler::doWork()::{lambda()#2})+0xc5 </font>
</p>
<p>
<font face="Monospaced" size="2">vault::gear::Scheduler::doWork()+0x3d </font>
</p>
<p>
<font face="Monospaced" size="2">vault::gear::Scheduler::Setup::doWork()+0x1c </font>
</p>
<p>
<font face="Monospaced" size="2">vault::gear::work::Worker&lt;vault::gear::Scheduler::Setup&gt;::</font><font color="#840404" face="Monospaced" size="2">pullWork()</font><font face="Monospaced" size="2">+0x26 </font>
</p>
</body>
</html></richcontent>
<icon BUILTIN="list"/>
<node CREATED="1713133485192" ID="ID_947110182" MODIFIED="1713133504295" TEXT="in einem Worker &#x2014; pullWork()"/>
<node CREATED="1713133509060" ID="ID_1843358766" MODIFIED="1713133518742" TEXT="f&#xfc;hrt Job-Planung aus"/>
<node CREATED="1713133529198" ID="ID_977652732" MODIFIED="1713133539508" TEXT="ist im else-Zweig der &#xbb;continuation&#xab;">
<node CREATED="1713133544399" ID="ID_294329345" MODIFIED="1713133557385" TEXT="work_left &#x2261; false"/>
</node>
<node CREATED="1713133619529" ID="ID_82008393" MODIFIED="1713133626170">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
<font color="#c50955" face="Monospaced" size="2">linkToPredecessor()</font>
</p>
</body>
</html></richcontent>
</node>
</node>
<node CREATED="1713133698201" ID="ID_703173235" MODIFIED="1713133914947" TEXT="Feststellungen">
<icon BUILTIN="forward"/>
<node CREATED="1713133680251" ID="ID_1272458001" MODIFIED="1713133692053" TEXT="es ist also wieder der bekannte problematische Aufruf"/>
<node CREATED="1713133704391" ID="ID_1458097512" MODIFIED="1713133762755" TEXT="hier aber beim Verdrahten des wake-up-Job"/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1713133892253" ID="ID_1626209382" MODIFIED="1713133909974" TEXT="kann das Problem noch nicht sehen">
<font NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1713133918034" ID="ID_836115954" MODIFIED="1713133942722" TEXT="genau deshalb hatte ich doch die Dependencies auf den aktuellen Chunk beschr&#xe4;nkt"/>
<node CREATED="1713133943318" ID="ID_1392041972" MODIFIED="1713133959336" TEXT="da wir aus der Planung kommen, kann auch kein &#xbb;Tick&#xab; dazwischengefunkt haben"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1713134829893" ID="ID_169525701" MODIFIED="1713134851513">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
tritt <b>reproduzierbar</b>&#160;auf ab Load=4ms
</p>
</body>
</html></richcontent>
<icon BUILTIN="forward"/>
<node CREATED="1713134858753" ID="ID_123414665" MODIFIED="1713134871171" TEXT="und zwar immer nach 4 L&#xe4;ufen"/>
<node CREATED="1713134946150" ID="ID_1065135099" MODIFIED="1713134957552" TEXT="nach 16 L&#xe4;ufen f&#xfc;r nur 64 Nodes"/>
<node CREATED="1713134998585" ID="ID_658130040" MODIFIED="1713135006343" TEXT="nach 8 L&#xe4;ufen f&#xfc;r 128 Nodes"/>
<node CREATED="1713135206679" ID="ID_1775229427" MODIFIED="1713135398059" TEXT="Aber: mit 512 Nodes tritt das Problem nicht auf">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1713135274627" ID="ID_474427976" MODIFIED="1713135278870" TEXT="f&#xfc;r 4ms"/>
<node CREATED="1713135279578" ID="ID_1655783173" MODIFIED="1713135290933" TEXT="f&#xfc;r 5ms l&#xf6;sen wir eine SchedulerEmergency aus"/>
<node CREATED="1713135383258" ID="ID_1427209469" MODIFIED="1713135395155" TEXT="wenn man daf&#xfc;r die Schwelle anhebt : dann l&#xe4;uft er durch"/>
</node>
<node CREATED="1713135778518" ID="ID_1026046718" MODIFIED="1713135806670" TEXT="exakt ist diese Anzahl zyklen nicht: es sind dann schon mal 6 statt 4"/>
</node>
</node>
<node COLOR="#338800" CREATED="1713135816592" ID="ID_592388147" MODIFIED="1713279355629" TEXT="Untersuchung">
<icon BUILTIN="button_ok"/>
<node CREATED="1713189769528" ID="ID_1640489443" MODIFIED="1713189787209" TEXT="Stacktrace &#x27f9; operator ++">
<node CREATED="1713189804219" ID="ID_282173894" MODIFIED="1713189819428" TEXT="d.h. es kam in claimSlot() zu einem Block-&#xdc;berlauf"/>
<node CREATED="1713189946440" ID="ID_1348653516" MODIFIED="1713189967557" TEXT="es wurde aber der bestehnde Pool verwendet (keine Erweiterung der Allokation)"/>
<node CREATED="1713190750074" ID="ID_1669596264" MODIFIED="1713190781618" TEXT="es kommt aber gar nicht zur Iteration RawIter::iterNext()"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1713190785949" ID="ID_1791183032" MODIFIED="1713190807614" TEXT="die Validierung der aktuellen Position scheitert">
<icon BUILTIN="broken-line"/>
</node>
</node>
<node CREATED="1713190363888" ID="ID_1032034712" MODIFIED="1713190386538">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
alloziert wurde auf dem <i>predecessor-Term</i>
</p>
</body>
</html></richcontent>
<node CREATED="1713190497629" ID="ID_1118247685" MODIFIED="1713190503792" TEXT="dieser hat ein Allocator-Handle"/>
<node CREATED="1713192060574" ID="ID_1556816113" MODIFIED="1713192191503" TEXT="in dieser Konstellation sind einige Probleme denkbar">
<arrowlink COLOR="#c73b6c" DESTINATION="ID_775703939" ENDARROW="Default" ENDINCLINATION="-1012;1337;" ID="Arrow_ID_501409702" STARTARROW="None" STARTINCLINATION="-1727;92;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1713210855468" ID="ID_554850522" MODIFIED="1713210893567" TEXT="Stacktrace &#x27f9; IdxLink::validatePos() im call-Graph">
<icon BUILTIN="forward"/>
<node CREATED="1713210896741" ID="ID_1428283332" LINK="#ID_369981064" MODIFIED="1713211030888" TEXT="&#x27f9; der k&#xfc;rzlich eingebaute Reparatur-Mechanismus hat hier gegriffen"/>
<node CREATED="1713211056973" ID="ID_1006526481" MODIFIED="1713211085415" TEXT="dieser Mechanismus wurde nur oberfl&#xe4;chlich gestestet">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1713211741301" ID="ID_131088163" MODIFIED="1713211763310" TEXT="ein gr&#xfc;ndlicher Test der Grenzf&#xe4;lle w&#xfc;rde mich Wochen kosten"/>
<node CREATED="1713211763857" ID="ID_1965258471" MODIFIED="1713211784987" TEXT="das gilt f&#xfc;r den Allocator insgesamt &#x2014; nur der positive Pfad ist abgedeckt"/>
</node>
<node BACKGROUND_COLOR="#d7cb6b" COLOR="#913c2c" CREATED="1713211103814" ID="ID_38656557" MODIFIED="1713279395056" TEXT="die Implementierung enth&#xe4;lt einen ziemlich offensichtlichen Denkfehler">
<icon BUILTIN="broken-line"/>
<node CREATED="1713211131566" ID="ID_597601333" MODIFIED="1713211163073" TEXT="die Assertion wird mit hoher Wahrscheinlichkeit bei der Reparatur triggern"/>
<node CREATED="1713211180858" ID="ID_552338679" MODIFIED="1713211294831" TEXT="denn wir laufen einmal &#xfc;ber alle Extents um die Addresse wiederzufinden"/>
<node CREATED="1713211223700" ID="ID_1527516549" MODIFIED="1713211300325" TEXT="und dabei sind nahezu sicher auch solche au&#xdf;erhalb der aktiven Zone"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#981d77" CREATED="1713212015289" ID="ID_5077199" MODIFIED="1713212350495" TEXT="best&#xe4;tigt per Debugger">
<icon BUILTIN="forward"/>
<node CREATED="1713212022935" ID="ID_297079686" MODIFIED="1713212050920" TEXT="der Reparatur-Code wird zum ersten Mal nach dem 5.Durchgang aufgerufen"/>
<node CREATED="1713212052508" ID="ID_839082587" MODIFIED="1713212074781" TEXT="zu dem Zeitpunkt ist die ExtentFamily eindeutig in &#xbb;wrapped state&#xab;">
<node CREATED="1713212081392" ID="ID_1411278354" MODIFIED="1713212102856" TEXT="start &#x2261; 42"/>
<node CREATED="1713212103445" ID="ID_639166794" MODIFIED="1713212114471" TEXT="after &#x2261; 37"/>
<node CREATED="1713212131881" ID="ID_479213056" MODIFIED="1713212181985" TEXT="fraglicher Index &#x2261; 20"/>
</node>
<node CREATED="1713212270055" ID="ID_481372004" MODIFIED="1713212306410" TEXT="wenn die Iteration 37 erreicht &#x27f6; &#xd83d;&#xddf1;"/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1713275005051" ID="ID_17370134" MODIFIED="1713278893420" TEXT="Fix">
<icon BUILTIN="button_ok"/>
<node CREATED="1713275014742" ID="ID_1261730499" MODIFIED="1713278884631" TEXT="nicht yield() f&#xfc;r den Check verwenden">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...das ist ohnehin <i>etwas kreativ</i>
</p>
</body>
</html>
</richcontent>
<icon BUILTIN="yes"/>
</node>
<node COLOR="#338800" CREATED="1713275064894" ID="ID_18075325" MODIFIED="1713278877792" TEXT="stattdessen eine (dedizierte) sichere Pr&#xfc;f-Funktion schaffen">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1713278871499" ID="ID_1493818454" MODIFIED="1713278874840" TEXT="&#xdc;berpr&#xfc;fung/Test: einen re-link-Zyklus explizit im Debugger beobachtet">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#435e98" CREATED="1713278922710" ID="ID_1345315613" MODIFIED="1713279328774" TEXT="sicherer Gebrauch?">
<node CREATED="1713278934306" ID="ID_1396168333" MODIFIED="1713278957520">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
dieser h&#228;ngt an der <i>Deadline</i>
</p>
</body>
</html>
</richcontent>
<font NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="idea"/>
</node>
<node CREATED="1713278960231" ID="ID_758113376" MODIFIED="1713279346057" TEXT="man kann auch ein Allocator-Handle problemlos weiterverwenden">
<icon BUILTIN="forward"/>
<node CREATED="1713278985251" ID="ID_1944860606" MODIFIED="1713279002077" TEXT="solange die Deadline in der Zukunft liegt"/>
<node CREATED="1713279002569" ID="ID_914456498" MODIFIED="1713279030864" TEXT="sollte der Extent bereits voll sein, erfolgt transparent Overflow"/>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1713279054034" ID="ID_1468104613" MODIFIED="1713279340076" TEXT="vor der Deadline wird auch der gespeicherte Index garantiert im aktiven Bereich liegen">
<icon BUILTIN="idea"/>
</node>
</node>
<node CREATED="1713279085734" ID="ID_701792778" MODIFIED="1713279202169" TEXT="Deadline wird im Allocator nicht gepr&#xfc;ft &#x2014; absichtlich">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
Der Allokator in sich ist robust; die Deadline beschreibt nur einen Nutzungs-Kontrakt; sie ist zwar im Gate des Blocks gespeichert, aber f&#252;r den Allokator nur ma&#223;geblich zur Suche des passenden Blocks. Das weitere Nutzungs-Muster mu&#223; auf einer h&#246;heren Ebene gew&#228;hrleistet sein.
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1713279203766" ID="ID_1759355521" MODIFIED="1713279234766" TEXT="Das Belegungs/Nutzungsmuster ist an den Nutzungs-Kontext gebunden"/>
<node CREATED="1713279235549" ID="ID_380603990" MODIFIED="1713279288738" TEXT="konkret: selber schuld, wenn man eine Dependency auf eine abgelaufene Activity setzt">
<icon BUILTIN="yes"/>
<node CREATED="1713279292850" ID="ID_1962749953" MODIFIED="1713279304562" TEXT="hier im Test ist das eine Frage der Test-Parametrisierung"/>
<node CREATED="1713279305162" ID="ID_1870807056" MODIFIED="1713279319675" TEXT="im tats&#xe4;chlichen Gebrauch obliegt das dem Planungs-Job"/>
</node>
</node>
</node>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1712878607523" ID="ID_61094750" MODIFIED="1712878636653" TEXT="Ergebnisse">
<icon BUILTIN="forward"/>
<node CREATED="1712878620561" ID="ID_1169608980" MODIFIED="1712878630380" TEXT="keine dramatsichen Bugs mehr gefinden"/>
@ -116227,8 +116683,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
Und zwar unabh&#228;ngig davon, ob die Kalibrierung mit kurzen oder langen Zeiten und single- oder multithreaded erfolgte. Die Abweichtung tritt nur im realen Last-Kontext auf, und ist (visuell. den Diagrammen nach zu urteilen) korreliert mit dem Grad an contention und irregularit&#228;t im Ablauf. Tendentiell nimmt sie f&#252;r l&#228;ngere Testl&#228;ufe ab, konvergiert aber &#8212; auch f&#252;r ganz gro&#223;e Lasten und sehr lange L&#228;ufe &#8212; typischerweise zu einem Offset von ~ +1ms
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1712878761558" ID="ID_398679192" MODIFIED="1712879104846" TEXT="es gibt eine relativ stabile Abweichung der effektiven Concurrency gg&#xfc; der Heuristik">
<richcontent TYPE="NOTE"><html>
@ -116240,8 +116695,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
Und das ist schon aus rein-logischen Gr&#252;nden so zu erwarten. Bewu&#223;t habe ich beim Aufstellen der Heuristig f&#252;r das Test-Schedule auf jedwede <i>optimale Anordnung der Rechenwege</i>&#160;verzichtet (kein Box-stacking problem l&#246;sen!). Hinzu kommen die tats&#228;chlichen Beschr&#228;nkungen des Worker-Pools. Daraus ergibt sich eine charakteristische Abweichung zwischen einem theoretisch berechneten concurrency-speed-up (wie er in's Schedule eingerechnet ist) und der <b>empirisch</b>&#160;beobachteten durchschnittlichen concurrency. Das wird als <b>Form-Faktor</b>&#160;gedeutet.
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
<node CREATED="1712879109979" ID="ID_492630552" MODIFIED="1712879132252" TEXT="&#x27f9; Zeit und Ablauf-Steuerung arbeitet effizient"/>
@ -116257,8 +116711,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
zwischen Load-Size und Laufzeit zum kompletten Abarbeiten der erzeugten Lastspitze
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1712879196455" ID="ID_1128294894" MODIFIED="1712879210685" TEXT="best&#xe4;gitt &#xfc;ber einen weiten Parameter-Bereich"/>
<node CREATED="1712879211454" ID="ID_686196534" MODIFIED="1712879234055" TEXT="f&#xfc;r gr&#xf6;&#xdf;ere Test-L&#xe4;ngen: sehr hohe Korrelationen"/>
@ -116272,8 +116725,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
Gradient <b>sehr nah</b>&#160;am zu erwartenden Wert
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<richcontent TYPE="NOTE"><html>
<head>
@ -116283,8 +116735,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
wenn man die empirisch beobachtete, effektive Concurrency und reale durchschnittliche Job-Zeit ansetzt
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1712879303773" ID="ID_1548672424" MODIFIED="1712879504409" TEXT="Sockel-Offset: 5ms + spin-up/down-Effekt">
<richcontent TYPE="NOTE"><html>
@ -116296,8 +116747,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
das bedeutet: der tats&#228;chlich beobachtete Sockel h&#228;ngt von der L&#228;nge der Job-Last und der Concurrency ab: Grunds&#228;tzlich mu&#223; man einmal die ganze Worker-Pool-size zu Beginn und am Ende aufschlagen &#8212; mit reduzierter Concurrency. Das ergibt sich bereits aus einer rein logischen &#220;berlegung: &#187;Voll-Last&#171; kann erst konstituiert werden, wenn <i>der erste Worker sich den zweiten Job holt. </i>Analog beginnt der spin-down, wenn der erste worker <i>idle f&#228;llt.</i>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1712879511487" ID="ID_630980319" MODIFIED="1712879529007" TEXT="drastische Performance-Degradierung f&#xfc;r Jobs &lt; 1ms">
<icon BUILTIN="messagebox_warning"/>
@ -124818,7 +125268,7 @@ unsigned int ThreadIdAsInt = *static_cast&lt;unsigned int*&gt;(static_cast&lt;vo
size="10!"<br/>
ratio="expand"
</p>
<p>Beachte das Ausrufezeichen; auch <tt>expand</tt> ist wichtig, um die Apsect-Ratio zu erhalten. Wenn man stark verkleinert, sollte man ein generisches node-Template hinzufügen mit <tt>node[fontsize="16"]</tt>... dann Rendern mit -Tsvg</p>
<p>Beachte das Ausrufezeichen; auch <tt>expand</tt> ist wichtig, um die Apsect-Ratio zu erhalten. Wenn man stark verkleinert, sollte man ein generisches node-Template hinzuf&#xfc;gen mit <tt>node[fontsize="16"]</tt>... dann Rendern mit -Tsvg</p>
</body>
</html></richcontent>
</node>