Scheduler-test: adjust contention mitigation as result of testing

Investigate the behaviour over a wider range of job loads,
job count and worker pool sizes. Seemingly the processing
can not fully utilise the available worker pool capacity.

By inspection of trace-dumps, one impeding mechanism could
be identified: the »stickiness« of the contention mitigation.
Whenever a worker encounters repeated contention, it steps up
and adds more and more wait cycles to remove pressure from the
schedule coordination. As such this is fine and prevents further
degradation of performance by repeated atomic synchronisation.
However, this throttling was kept up needlessly after further
successful work-pulls. Since job times of several milliseconds
can be expected on average in media processing, such a long
retention would spread a performance degradation over a duration
of several frames. Thus, the scheme for step-down was changed
to decrease the throttling by a power series rather than just
documenting the level.
This commit is contained in:
Fischlurch 2024-04-10 03:29:44 +02:00
parent a6a9155cd9
commit 1316ee2c7f
11 changed files with 6325 additions and 37 deletions

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,169 @@
#
#
# GNUPLOT - data plot from Lumiera
#
set term wxt size 600,600
set datafile separator ",;"
####---------Data--------------------------------
$RunData << _End_of_Data_
"load size","result time","concurrency","avg jobtime","avg impeded"
157,46.554495,7.48728108853936,2220.16936305732,5.00084713375796
121,50.292037,5.33252293996364,2216.39207438017,98.5650165289256
41,17.16609,6.07957181862614,2545.42626829268,19.3487317073171
136,47.647478,6.35526132149114,2226.56010294118,17.3729779411765
49,20.584294,5.44682436035941,2288.14355102041,38.9046530612245
189,56.006029,7.37320239219245,2184.88776190476,0.771513227513227
187,59.645147,6.96034609488011,2220.05810695187,2.20291978609626
157,55.209898,6.03719403719964,2123.01189171975,37.0743630573248
61,27.400035,4.93882274237971,2218.42485245902,7.64193442622951
144,46.944119,6.66945282325993,2174.24713194444,11.4371458333333
176,54.16028,7.11431672805236,2189.28060227273,5.80461363636364
77,26.727591,6.39997349555371,2221.50485714286,4.55142857142857
47,23.835568,5.08421993551821,2578.41,32.0726595744681
161,53.806824,6.90029627097113,2306.10575776397,3.0222298136646
48,24.075089,4.98632615646821,2500.96345833333,153.631833333333
123,46.065361,6.04074328213775,2262.34975609756,30.5994390243902
48,19.493791,6.84829938927733,2781.23577083333,22.5110833333333
74,34.211108,4.9586167744114,2292.42937837838,54.5361486486486
125,38.459702,7.04485364967206,2167.543776,3.341488
87,41.065671,4.75102269727919,2242.57396551724,151.366091954023
123,43.067274,6.74489662382625,2361.66106504065,10.4976260162602
197,57.968187,7.62476801284125,2243.62425380711,3.16879187817259
186,54.641177,7.24991421762383,2129.80562365591,3.05421505376344
94,34.292914,6.61717834769014,2414.06731914894,5.99422340425532
83,30.439659,6.41262587731354,2351.78487951807,70.7724096385542
109,40.008459,6.38738712730725,2344.49097247706,7.56521100917431
59,29.033358,4.97959316314703,2450.41205084746,104.970728813559
40,19.635726,4.44165670268571,2180.37885,19.92975
62,22.712011,6.9283870107319,2538.02583870968,8.72167741935484
51,27.127065,4.54867118871872,2419.45292156863,67.0625490196078
136,48.226757,6.67485178404179,2366.95922794118,3.46152941176471
81,29.423654,6.26774414217894,2276.78932098765,12.4343703703704
99,30.381306,7.3978615336681,2270.26964646465,4.01015151515151
125,43.996299,6.55915273691544,2308.62756,4.578288
68,26.404795,5.94296914632361,2307.68944117647,1.91704411764706
56,24.513297,6.05979424146821,2652.59885714286,22.1650535714286
156,55.991977,6.11697006162151,2195.52081410256,19.6662179487179
181,56.97651,7.54696488079035,2375.68906077348,0.618259668508287
33,15.986522,5.1415193373518,2490.75793939394,12.9112121212121
198,59.500354,7.14364250673199,2146.71342424243,2.43373737373737
163,51.103658,7.15751062282078,2244.01825153374,6.80783435582822
121,39.859696,6.88613310046319,2268.42290909091,15.1302314049587
181,55.874614,7.49570459672437,2313.92044751381,7.49208839779005
68,25.322434,6.57913011047833,2449.99394117647,9.17791176470588
179,57.311142,6.88257079225537,2203.62006703911,3.28875977653631
32,16.349611,4.86687469200338,2486.609625,7.32503125
161,51.394423,7.13552826539175,2277.80346583851,6.49071428571429
176,60.008068,6.6547853032029,2268.98186931818,1.71989772727273
188,58.826985,7.35173932507335,2300.42903723404,2.80307446808511
55,22.664287,5.5486769118305,2286.48738181818,24.2084545454545
59,26.815392,4.83147003780515,2195.89428813559,13.0098813559322
97,37.460556,6.19002019083753,2390.53193814433,7.96409278350515
84,26.563322,6.43358820105407,2034.49375,11.4647380952381
69,27.823527,6.03438586344571,2433.30286956522,30.3107391304348
97,39.035368,5.51833693485354,2220.72487628866,16.4026701030928
115,41.256006,6.50182913973786,2332.51740869565,13.6992086956522
90,29.937511,6.80177340060101,2262.53517777778,9.98628888888889
33,22.91761,4.0258742076508,2795.86106060606,41.6706060606061
166,58.566848,7.22227735390506,2548.10855421687,5.82302409638554
159,55.436672,7.54835627578798,2631.79717610063,2.16196226415094
34,16.062211,4.7875236478963,2261.71220588235,13.4043529411765
185,63.36048,7.42693573344141,2543.64439459459,3.23899459459459
84,34.441246,5.62509698400575,2306.37320238095,50.2789761904762
185,54.992998,7.36138984457621,2188.24268648649,3.21179459459459
187,60.002963,6.69152031708834,2147.11789304813,3.68767914438503
87,34.14314,5.78903486908351,2271.90606896552,28.3448045977011
183,56.644245,7.29961391488226,2259.45966666667,3.22210382513661
150,46.269744,7.13931710968619,2202.22916666667,2.64142666666667
200,60.218589,7.20858394739206,2170.45377,5.500815
104,37.635813,6.88045049006913,2489.91680769231,7.87939423076923
_End_of_Data_
#
#---common-styles-for-plots-from-Lumiera---------
set style line 1 linetype 1 linewidth 2 linecolor rgb '#240CC3'
set style line 2 linetype 3 linewidth 2 linecolor rgb '#1149D6'
set style line 3 linetype 2 linewidth 2 linecolor rgb '#0B7FCC'
set style line 4 linetype 6 linewidth 2 linecolor rgb '#37999D'
set style line 5 linetype 7 linewidth 2 linecolor rgb '#248269'
set style line 6 linetype 13 linewidth 2 linecolor rgb '#00C443'
set style line 7 linetype 12 linewidth 2 linecolor rgb '#EBE83E'
set style line 8 linetype 5 linewidth 2 linecolor rgb '#762C14'
set style line 9 linetype 4 linewidth 2 linecolor rgb '#AA0519'
set style line 10 linetype 1 linewidth 1 linecolor rgb '#303030'
set style line 11 linetype 0 linewidth 1 linecolor rgb '#A0A0A0' dashtype 3
#---(End)styles----------------------------------
#
#---axis-and-grid-setup--------------------------
unset border
set tics nomirror
set grid back linestyle 11
set arrow 10 from graph 0,0 to graph 1.04,0 size screen 0.025,15,60 filled ls 10
set arrow 11 from graph 0,0 to graph 0,1.08 size screen 0.025,15,60 filled ls 10
set xlabel 'load size ⟶ number of jobs'
set ylabel 'active time ⟶ ms'
set key autotitle columnheader tmargin
#
stats $RunData using 1:2 nooutput
# regression line function derived from data
regLine(x) = STATS_slope * x + STATS_intercept
#
regLabel = sprintf("Model: %3.2f·p + %3.2f", STATS_slope, STATS_intercept)
set key horizontal width -4
set xtics 10
plots = STATS_columns - 1
# Adjust layout based on number of data sequences;
# additional sequences placed into secondary diagram
#
if (plots > 1) {
set multiplot layout 2,1 # 2 rows 1 column
set lmargin at screen 0.12 # fixed margins to align diagrams
set rmargin at screen 0.88
}
#
#
####---------Scatter-Regression-Plot-------------
plot $RunData using 1:2 with points linestyle 1, \
regLine(x) with line linestyle 9 title regLabel
if (plots > 1) {
# switch off decorations for secondary diagram
unset arrow 10
unset arrow 11
set border 2+8
set key bmargin vertical
unset xlabel
set format x ""
set ylabel 'concurrent threads ⟶'
if (plots <= 2) {
####---------------------------------
plot $RunData using 1:3 with impulses linestyle 3
} else {
# more than one additional data sequence
#
set y2tics
set y2label 'avg job time ⟶ µs' offset -1.5
####---------------------------------------------
plot $RunData using 1:3 with impulses linestyle 3, \
for [i=4:*] $RunData using 1:i with points linestyle 5+(i-4) axes x1y2
}
}

View file

@ -0,0 +1,179 @@
#
#
# GNUPLOT - data plot from Lumiera
#
set term wxt size 600,600
set datafile separator ",;"
####---------Data--------------------------------
$RunData << _End_of_Data_
"load size","result time","concurrency","avg jobtime","avg impeded"
153,170.946512,7.78687575678642,8700.25653594771,5.00798039215686
44,62.23816,6.27163995529431,8871.25752272727,12.1919318181818
183,203.423327,7.75858338016465,8624.4636284153,13.1594808743169
42,56.112058,6.78149748134349,9060.09,44.8326904761905
90,100.047863,7.59502188467534,8442.95232222222,7.94103333333333
135,154.629696,7.63453155207652,8744.6318,9.55625185185185
158,178.711938,7.6224815322634,8621.69903164558,19.8237848101266
107,123.18375,7.45052793895299,8577.42028971962,4.03854205607477
184,210.967189,7.53411515569845,8638.32117391305,21.1774891304348
166,187.874357,7.6084824657577,8611.07681325302,7.85254819277108
117,140.797535,7.3004006568723,8785.28561538462,63.0558461538462
178,202.060661,7.63797121301113,8670.41298876405,7.93822471910112
134,154.345701,7.52624548966219,8668.98235820895,7.90755970149254
192,211.836526,7.87293083724381,8686.32457291667,4.667359375
175,200.123106,7.57198753950981,8659.02665714286,11.2267371428571
41,48.978404,7.01731289569991,8382.84843902439,6.01575609756098
45,58.274311,6.83578161910829,8852.23253333333,76.9384888888889
151,172.980433,7.58952424983235,8694.2992781457,4.47547682119205
132,153.026385,7.55264709415962,8755.71425757576,7.99570454545455
158,178.018003,7.71592079931377,8693.49881012659,8.37062025316456
69,92.36753,6.56372200274274,8786.59114492753,68.7861014492754
124,143.783357,7.45693382997032,8646.63692741935,14.2164193548387
82,105.241708,7.11045134311199,9125.80541463415,33.7637926829268
182,201.71038,7.80215036529107,8647.11381868131,11.6857802197802
142,161.895882,7.64046158999893,8710.98076056338,17.8816971830986
180,205.45594,7.53362558415201,8599.04514444444,4.43985
92,123.926265,6.51652633120187,8777.92140217391,174.256630434783
125,145.977467,7.69331672949223,8984.407112,7.557792
148,167.747099,7.65965778043053,8681.65791891893,14.4133716216216
148,171.986958,7.59045817299705,8820.67439864864,16.6693513513514
75,102.291856,7.14353657831763,9743.0082,34.5084
102,135.271044,7.37042686681712,9774.56212745098,5.23352941176471
162,184.31177,7.60523132082123,8652.67682716049,3.55493827160494
58,72.810445,6.92005793948931,8687.11203448276,7.53760344827586
114,128.121482,7.53414729467459,8467.42207894737,14.7899736842105
52,64.053725,7.24216978793973,8920.92215384616,24.6449038461538
163,183.382431,7.67686917619715,8636.82780368098,4.41739877300614
72,84.678058,7.18322151412589,8448.07288888889,44.6918888888889
129,147.917639,7.55477410642013,8662.66937209302,2.45032558139535
146,168.145135,7.61967169612133,8775.41593150685,29.6997534246575
38,51.818695,6.66403374303425,9087.4087368421,59.5343947368421
46,58.756216,7.18251839090523,9174.29569565217,19.0596304347826
124,154.073539,7.48495967889723,9300.27602419355,21.2015
142,183.827489,7.71538247470703,9988.02385211267,4.56102816901408
38,56.228229,6.82857845300445,10104.1808684211,25.8802894736842
99,119.6339,7.33980391845455,8869.58957575758,2.46583838383838
153,174.549751,7.75248096458184,8844.40275816994,7.52324836601307
53,68.231081,6.97641758013477,8981.29269811321,23.7217924528302
50,67.754534,6.86505280960238,9302.76908,17.53768
85,108.94381,7.09744277348112,9096.73478823529,10.4850823529412
181,202.123233,7.78004533996347,8687.99954143647,8.87863535911602
89,104.348229,7.44979666113931,8734.52907865169,5.81651685393259
179,203.595589,7.701035870674,8759.20074860335,4.36360893854749
63,78.600133,7.0536965503608,8800.34106349207,26.3423492063492
72,88.062773,7.19550271259343,8800.77669444444,18.2799722222222
121,141.65176,7.5069013473606,8788.14700826446,11.9957024793388
42,54.373882,7.26977586408121,9411.56988095238,27.6116904761905
133,153.982931,7.60265251737545,8802.09562406016,1.32300751879699
46,55.878697,7.22372087523802,8775.04586956521,30.4320434782609
161,183.281008,7.6095385835067,8662.63293167702,8.46380124223603
82,101.811279,6.97652248332918,8662.05703658537,51.9063658536585
91,110.203893,7.23693537759142,8764.15881318681,34.950032967033
62,78.678888,6.95584745681713,8827.0700483871,4.51682258064516
44,59.766715,6.99746832329667,9504.90215909091,17.1681590909091
119,138.043866,7.48610716248703,8684.12751260504,1.31360504201681
146,163.142201,7.69377247766812,8597.11627397261,16.3477876712329
65,80.939635,7.10862072703935,8851.83333846153,2.93209230769231
82,99.235561,7.24491740415515,8767.72491463414,2.91723170731707
188,213.363011,7.70100523656371,8739.94502659574,3.68948404255319
164,185.166253,7.76932021192868,8772.04824390244,5.72121341463415
198,223.197176,7.71031646923704,8691.51950505051,1.21380303030303
196,220.192503,7.69108110824282,8640.4,0.430612244897959
180,206.330767,7.6558709685793,8775.78738333333,10.3256
123,144.721694,7.31167694872339,8602.91279674797,16.6400650406504
138,160.709094,7.55113937733978,8793.74469565217,25.4078550724638
188,209.142032,7.85878765393271,8742.56818617022,1.85203191489362
192,219.726544,7.6175970892256,8717.64730208333,8.65040625
91,106.028299,7.41373312043797,8638.08254945055,10.6057692307692
200,228.362229,7.53655624897583,8605.32391999999,55.18684
30,44.530553,6.37356549333667,9460.6132,39.0685333333333
_End_of_Data_
#
#---common-styles-for-plots-from-Lumiera---------
set style line 1 linetype 1 linewidth 2 linecolor rgb '#240CC3'
set style line 2 linetype 3 linewidth 2 linecolor rgb '#1149D6'
set style line 3 linetype 2 linewidth 2 linecolor rgb '#0B7FCC'
set style line 4 linetype 6 linewidth 2 linecolor rgb '#37999D'
set style line 5 linetype 7 linewidth 2 linecolor rgb '#248269'
set style line 6 linetype 13 linewidth 2 linecolor rgb '#00C443'
set style line 7 linetype 12 linewidth 2 linecolor rgb '#EBE83E'
set style line 8 linetype 5 linewidth 2 linecolor rgb '#762C14'
set style line 9 linetype 4 linewidth 2 linecolor rgb '#AA0519'
set style line 10 linetype 1 linewidth 1 linecolor rgb '#303030'
set style line 11 linetype 0 linewidth 1 linecolor rgb '#A0A0A0' dashtype 3
#---(End)styles----------------------------------
#
#---axis-and-grid-setup--------------------------
unset border
set tics nomirror
set grid back linestyle 11
set arrow 10 from graph 0,0 to graph 1.04,0 size screen 0.025,15,60 filled ls 10
set arrow 11 from graph 0,0 to graph 0,1.08 size screen 0.025,15,60 filled ls 10
set xlabel 'load size ⟶ number of jobs'
set ylabel 'active time ⟶ ms'
set key autotitle columnheader tmargin
#
stats $RunData using 1:2 nooutput
# regression line function derived from data
regLine(x) = STATS_slope * x + STATS_intercept
#
regLabel = sprintf("Model: %3.2f·p + %3.2f", STATS_slope, STATS_intercept)
set key horizontal width -4
set xtics 10
plots = STATS_columns - 1
# Adjust layout based on number of data sequences;
# additional sequences placed into secondary diagram
#
if (plots > 1) {
set multiplot layout 2,1 # 2 rows 1 column
set lmargin at screen 0.12 # fixed margins to align diagrams
set rmargin at screen 0.88
}
#
#
####---------Scatter-Regression-Plot-------------
plot $RunData using 1:2 with points linestyle 1, \
regLine(x) with line linestyle 9 title regLabel
if (plots > 1) {
# switch off decorations for secondary diagram
unset arrow 10
unset arrow 11
set border 2+8
set key bmargin vertical
unset xlabel
set format x ""
set ylabel 'concurrent threads ⟶'
if (plots <= 2) {
####---------------------------------
plot $RunData using 1:3 with impulses linestyle 3
} else {
# more than one additional data sequence
#
set y2tics
set y2label 'avg job time ⟶ µs' offset -2.2
####---------------------------------------------
plot $RunData using 1:3 with impulses linestyle 3, \
for [i=4:*] $RunData using 1:i with points linestyle 5+(i-4) axes x1y2
}
}

View file

@ -0,0 +1,179 @@
#
#
# GNUPLOT - data plot from Lumiera
#
set term wxt size 600,600
set datafile separator ",;"
####---------Data--------------------------------
$RunData << _End_of_Data_
"load size","result time","concurrency","avg jobtime","avg impeded"
43,8.636836,5.47468089008521,1099.62606976744,2.52183720930233
93,26.908743,2.56734578794706,742.839225806452,188.25976344086
75,15.820093,3.30725609514432,697.614653333333,52.9558666666667
131,26.428591,3.616400511098,729.590610687023,1.24181679389313
119,24.15819,3.85807815072239,783.228445378151,2.23156302521008
185,37.591041,3.7520257286836,762.392178378379,29.0166054054054
41,6.880802,4.31080868189493,723.459048780488,27.0829268292683
98,19.653472,3.64645290155348,731.280204081633,5.27408163265306
121,24.051169,3.5910388804802,713.790768595042,32.4789090909091
139,28.090693,3.47401917069116,702.069107913669,34.8621798561151
64,13.393712,4.0976385784613,857.540484375,10.0011875
184,37.108684,3.53275616025618,712.477891304348,2.09190760869565
78,18.921565,2.71536968532994,658.705692307693,82.1700512820513
118,26.658957,2.83160387707591,639.725474576271,108.319347457627
166,33.589537,3.22544252396215,652.657355421687,32.881078313253
135,27.235694,3.53119927841751,712.404911111111,26.3981333333333
58,7.141216,5.60710528851109,690.371551724138,17.0463448275862
136,27.387405,3.72205658038795,749.540227941176,80.8050441176471
53,17.931685,1.92801167319189,652.311283018868,24.3333018867925
72,14.636963,4.3122036313134,876.632847222222,13.7587361111111
60,18.188159,2.13008424876866,645.705183333333,100.166383333333
192,38.780127,3.53985385349563,714.979072916667,1.82634375
152,31.034915,3.69955271345193,755.363842105263,11.4056710526316
181,36.4724,3.84462777332997,774.711613259669,26.8866022099448
85,17.383982,3.39731926781793,694.811023529412,2.29705882352941
118,20.375271,4.46922075294115,771.708338983051,5.79375423728814
142,28.870534,3.34539156774862,680.163669014084,63.9251056338028
149,30.09014,3.61821895810388,730.689362416107,1.92344295302013
196,39.41001,3.78412900681832,760.880418367347,25.665056122449
183,36.975648,3.72883104036473,753.420459016394,2.47966666666667
182,36.757653,3.57614184452963,722.25593956044,56.2165054945055
40,12.165464,2.62321659083451,797.816175,32.148575
75,12.948139,3.63023265351106,626.730093333333,10.9645066666667
56,11.446777,4.72160076150693,965.126982142858,5.38482142857143
140,28.516713,3.45315636483069,703.376207142857,27.5876285714286
165,33.291917,3.51991547978448,710.210509090909,14.2399454545455
41,10.196795,3.60956967360823,897.708341463415,137.913902439024
151,30.432115,3.23020841633912,651.007112582781,53.5216357615894
62,11.787079,4.40271325915437,837.018209677419,1.32517741935484
132,27.058347,3.77599067674016,774.030803030303,27.7883484848485
90,18.457616,4.15023099407854,851.148555555556,4.60322222222222
96,15.160173,4.7719223256885,753.574666666667,11.3016770833333
116,23.435105,3.15719029208531,637.836948275862,99.4875517241379
138,27.810283,3.2704919615525,659.081934782609,78.9682753623188
184,37.170721,3.68864480729335,745.160798913043,7.12672826086957
83,17.028773,3.6115818209568,740.973578313253,4.92331325301205
73,15.594583,2.87202639531945,613.53498630137,5.09360273972603
43,12.828224,2.76669319151271,825.38976744186,23.1223953488372
188,38.143029,3.56482559368843,723.26194680851,1.19660638297872
96,19.626924,3.76855441025807,770.470114583333,5.41494791666667
85,11.552879,5.82613104491097,791.865729411765,3.60017647058824
48,12.221377,2.2205017486982,565.3664375,186.669604166667
88,13.987957,4.06567985589318,646.256306818182,2.51251136363636
37,17.710473,1.13015185986281,540.960108108108,410.624621621622
199,40.006723,3.38209727899983,679.932809045226,8.41501005025126
142,28.564952,3.65154217658058,734.550190140845,19.7686830985915
125,25.277989,3.84072846934145,776.687136,14.180904
141,28.547534,3.41566154190411,691.551163120567,6.5322695035461
92,16.575694,3.96867232225691,715.03802173913,1.50796739130435
122,22.726996,3.91264745239538,728.874778688524,45.1266967213115
124,25.088678,2.54309585383494,514.539620967742,109.820387096774
73,14.871936,3.58092019761247,729.523506849315,44.2219589041096
131,26.332903,3.00676347761582,604.40313740458,94.4729465648855
169,34.140142,3.78017944389335,763.644159763314,51.814550295858
100,20.192983,3.63811691417757,734.64433,54.45321
71,13.325791,4.26514230937586,800.512605633803,17.5440845070423
134,27.094559,3.54328210324442,716.445268656716,67.796723880597
111,24.377955,3.41665890350524,750.370783783784,118.771900900901
192,38.680898,3.43369608430497,691.76275,4.71284375
166,33.711279,3.69578917489307,750.540843373494,50.0127228915663
43,9.119694,4.39974411422138,933.123720930233,3.01481395348837
82,18.804953,3.54320130446484,812.557731707317,27.7167926829268
62,12.592702,3.06591008029889,622.711161290323,9.63659677419355
130,26.137617,4.0830164050533,820.925530769231,28.3186615384615
190,38.367218,3.58517813306141,723.964794736842,1.98525789473684
47,13.325866,3.74684279430695,1062.33882978723,154.121382978723
182,37.015108,3.5805424368882,728.209697802198,1.67770879120879
63,12.794701,3.39708977958922,689.916634920635,62.6871428571429
200,40.321327,3.48643151055024,702.887725,1.57428
30,5.780155,4.24835493165841,818.538333333333,91.5525666666667
_End_of_Data_
#
#---common-styles-for-plots-from-Lumiera---------
set style line 1 linetype 1 linewidth 2 linecolor rgb '#240CC3'
set style line 2 linetype 3 linewidth 2 linecolor rgb '#1149D6'
set style line 3 linetype 2 linewidth 2 linecolor rgb '#0B7FCC'
set style line 4 linetype 6 linewidth 2 linecolor rgb '#37999D'
set style line 5 linetype 7 linewidth 2 linecolor rgb '#248269'
set style line 6 linetype 13 linewidth 2 linecolor rgb '#00C443'
set style line 7 linetype 12 linewidth 2 linecolor rgb '#EBE83E'
set style line 8 linetype 5 linewidth 2 linecolor rgb '#762C14'
set style line 9 linetype 4 linewidth 2 linecolor rgb '#AA0519'
set style line 10 linetype 1 linewidth 1 linecolor rgb '#303030'
set style line 11 linetype 0 linewidth 1 linecolor rgb '#A0A0A0' dashtype 3
#---(End)styles----------------------------------
#
#---axis-and-grid-setup--------------------------
unset border
set tics nomirror
set grid back linestyle 11
set arrow 10 from graph 0,0 to graph 1.04,0 size screen 0.025,15,60 filled ls 10
set arrow 11 from graph 0,0 to graph 0,1.08 size screen 0.025,15,60 filled ls 10
set xlabel 'load size ⟶ number of jobs'
set ylabel 'active time ⟶ ms'
set key autotitle columnheader tmargin
#
stats $RunData using 1:2 nooutput
# regression line function derived from data
regLine(x) = STATS_slope * x + STATS_intercept
#
regLabel = sprintf("Model: %3.2f·p + %3.2f", STATS_slope, STATS_intercept)
set key horizontal width -4
set xtics 10
plots = STATS_columns - 1
# Adjust layout based on number of data sequences;
# additional sequences placed into secondary diagram
#
if (plots > 1) {
set multiplot layout 2,1 # 2 rows 1 column
set lmargin at screen 0.12 # fixed margins to align diagrams
set rmargin at screen 0.88
}
#
#
####---------Scatter-Regression-Plot-------------
plot $RunData using 1:2 with points linestyle 1, \
regLine(x) with line linestyle 9 title regLabel
if (plots > 1) {
# switch off decorations for secondary diagram
unset arrow 10
unset arrow 11
set border 2+8
set key bmargin vertical
unset xlabel
set format x ""
set ylabel 'concurrent threads ⟶'
if (plots <= 2) {
####---------------------------------
plot $RunData using 1:3 with impulses linestyle 3
} else {
# more than one additional data sequence
#
set y2tics
set y2label 'avg job time ⟶ µs' offset -1.5
####---------------------------------------------
plot $RunData using 1:3 with impulses linestyle 3, \
for [i=4:*] $RunData using 1:i with points linestyle 5+(i-4) axes x1y2
}
}

View file

@ -0,0 +1,180 @@
#
#
# GNUPLOT - data plot from Lumiera
#
set term wxt size 600,600
set datafile separator ",;"
####---------Data--------------------------------
$RunData << _End_of_Data_
"load size","result time","concurrency","avg jobtime","avg impeded"
179,35.63124,1.79985243286509,358.273597765363,105.151083798883
177,35.333096,1.84486881647733,368.276423728813,68.0845141242937
59,11.826895,2.1317825177276,427.328271186441,125.632440677966
139,27.656609,1.69648524155655,337.546971223022,93.1134460431655
69,7.592238,3.84578236351389,423.160797101449,15.62
76,15.253411,1.56144366660021,313.386078947368,93.5487631578947
139,27.697876,1.64504964207364,327.801302158273,73.7196402877698
162,32.371138,1.72661112500895,345.014611111111,60.4682901234568
119,23.779756,1.75157289250571,350.016605042017,148.353
148,29.496382,1.78577796422626,355.905331081081,111.492858108108
156,31.151338,1.6940306063258,338.277692307692,109.569416666667
39,7.804463,2.27069703578581,454.399256410256,22.2919743589744
158,31.64639,1.64517557926828,329.518151898734,91.2047848101266
125,24.638671,1.81110016039421,356.984808,57.763192
80,8.89486,3.31325776909361,368.38705,23.6623875
41,3.246095,3.96197523485912,313.681658536585,5.52668292682927
86,12.878812,2.63628617297931,394.793418604651,55.0483953488372
69,15.889,1.00159663918434,230.643028985507,222.759507246377
61,12.498178,2.15249630786183,441.021016393443,114.346213114754
199,39.870461,1.82091468668998,364.82767839196,50.0526582914573
142,28.522807,1.74354817181913,350.217521126761,60.3965422535211
156,31.253045,1.79720718413198,360.052544871795,56.4501730769231
119,23.819071,1.85057036859246,370.410647058824,46.6504537815126
162,32.279941,1.67515166771835,333.78887037037,71.3886975308642
157,31.518053,1.97087783309457,395.65752866242,95.0335286624204
25,8.924809,0.964483161488386,344.31312,356.99236
181,36.250303,1.781842347635,356.863674033149,56.5681712707182
184,36.75795,1.69997083624087,339.605668478261,108.827619565217
16,1.685641,3.52622355531219,371.4966875,46.988875
79,15.651189,1.63294660872091,323.513367088607,70.1948987341772
20,2.156301,2.13973512974302,230.69565,36.92085
191,38.367116,1.94760476654018,391.225015706806,36.3046230366492
55,7.196328,2.82408125366159,369.509363636364,36.3265636363636
75,14.963745,1.31130422230531,261.62696,137.272213333333
130,25.941701,1.61283537266889,321.843792307692,80.9860692307692
120,21.701709,1.8366870093042,332.160391666667,83.3058583333333
147,29.460911,1.72671754787216,346.058993197279,72.4423809523809
70,7.844502,2.89830176600121,324.7962,40.4968
82,15.553826,1.55505089230135,294.963304878049,164.758268292683
65,7.127141,4.72273300051171,517.839753846154,4.49523076923077
18,3.341583,1.8750475448313,348.090388888889,23.1966111111111
38,3.918406,3.34534731725094,344.958657894737,24.6373684210526
100,20.205017,1.74584866718994,352.74902,63.26982
172,34.398834,1.67980103627931,335.948819767442,90.5519593023256
159,31.833826,1.90874169507617,382.154408805031,91.7036666666667
176,35.29628,1.61548984765533,323.981715909091,121.156585227273
13,3.022598,1.8098172499287,420.796153846154,97.3303076923077
45,7.57213,2.18830553622296,368.2252,38.1020444444444
45,9.667158,1.49805103009592,321.819911111111,171.646822222222
70,13.978447,1.41961027573378,283.484957142857,122.369428571429
44,6.995391,1.7957738173606,285.503181818182,31.7503409090909
183,36.697165,1.62957740741008,326.780715846994,87.2222677595628
26,4.485739,2.88331220340729,497.453307692308,46.1854230769231
159,31.623796,1.71386158069069,340.873012578616,66.8181823899371
145,29.027672,1.77185642031507,354.709427586207,96.5250965517241
179,35.790229,1.74933599893982,349.771709497207,60.8866592178771
180,36.0188,1.74721054005131,349.624594444444,69.2989166666667
126,25.17708,1.89118313164195,377.892611111111,137.614285714286
163,32.608486,1.53913907563816,307.907944785276,118.752975460123
192,38.643666,1.7102021583563,344.210838541667,62.0867760416667
4,0.907267,2.19658490830153,498.22225,52.75375
179,35.906926,1.68108564904721,337.221329608939,100.840290502793
183,36.508054,1.57717162903287,314.641896174863,121.484327868853
56,12.837901,1.76890599171936,405.518571428571,51.546875
53,11.64554,1.53189530069022,336.599018867925,171.561660377358
113,22.543634,1.6258490534401,324.358814159292,82.5855398230088
172,34.462216,1.9703688816761,394.7865,57.0161802325581
196,39.243665,1.69912741330352,340.204015306122,69.6907602040817
179,35.903897,1.72076719137201,345.152223463687,81.7715195530726
54,7.078423,2.57057694913118,336.95612962963,87.4055740740741
61,12.715775,0.967899793760113,201.763868852459,208.455327868853
193,38.714267,1.80170227683763,361.407165803109,59.2353730569948
88,10.61802,3.25951815875276,393.291238636364,25.2093863636364
157,31.433111,1.6798099939901,336.316267515924,107.236203821656
165,32.836242,1.62567391238011,323.521345454545,79.4364363636363
47,4.921991,3.77766497338171,395.609212765957,51.0604680851064
134,26.475937,1.58844844660266,313.84821641791,137.973470149254
174,34.912692,1.83480391600854,368.149103448276,59.1995862068966
200,40.095864,1.63798313461957,328.381745,117.2451
174,34.836438,1.9257432978653,385.551936781609,47.0866149425287
_End_of_Data_
#
#---common-styles-for-plots-from-Lumiera---------
set style line 1 linetype 1 linewidth 2 linecolor rgb '#240CC3'
set style line 2 linetype 3 linewidth 2 linecolor rgb '#1149D6'
set style line 3 linetype 2 linewidth 2 linecolor rgb '#0B7FCC'
set style line 4 linetype 6 linewidth 2 linecolor rgb '#37999D'
set style line 5 linetype 7 linewidth 2 linecolor rgb '#248269'
set style line 6 linetype 13 linewidth 2 linecolor rgb '#00C443'
set style line 7 linetype 12 linewidth 2 linecolor rgb '#EBE83E'
set style line 8 linetype 5 linewidth 2 linecolor rgb '#762C14'
set style line 9 linetype 4 linewidth 2 linecolor rgb '#AA0519'
set style line 10 linetype 1 linewidth 1 linecolor rgb '#303030'
set style line 11 linetype 0 linewidth 1 linecolor rgb '#A0A0A0' dashtype 3
#---(End)styles----------------------------------
#
#---axis-and-grid-setup--------------------------
unset border
set tics nomirror
set grid back linestyle 11
set arrow 10 from graph 0,0 to graph 1.04,0 size screen 0.025,15,60 filled ls 10
set arrow 11 from graph 0,0 to graph 0,1.08 size screen 0.025,15,60 filled ls 10
set xlabel 'load size ⟶ number of jobs'
set ylabel 'active time ⟶ ms'
set key autotitle columnheader tmargin
#
stats $RunData using 1:2 nooutput
# regression line function derived from data
regLine(x) = STATS_slope * x + STATS_intercept
#
regLabel = sprintf("Model: %3.2f·p + %3.2f", STATS_slope, STATS_intercept)
set key horizontal width -4
set xtics 10
set yrange [0:*]
plots = STATS_columns - 1
# Adjust layout based on number of data sequences;
# additional sequences placed into secondary diagram
#
if (plots > 1) {
set multiplot layout 2,1 # 2 rows 1 column
set lmargin at screen 0.12 # fixed margins to align diagrams
set rmargin at screen 0.88
}
#
#
####---------Scatter-Regression-Plot-------------
plot $RunData using 1:2 with points linestyle 1, \
regLine(x) with line linestyle 9 title regLabel
if (plots > 1) {
# switch off decorations for secondary diagram
unset arrow 10
unset arrow 11
set border 2+8
set key bmargin vertical
unset xlabel
set format x ""
set ylabel 'concurrent threads ⟶'
if (plots <= 2) {
####---------------------------------
plot $RunData using 1:3 with impulses linestyle 3
} else {
# more than one additional data sequence
#
set y2tics
set y2label 'avg job time ⟶ µs' offset -1.5
####---------------------------------------------
plot $RunData using 1:3 with impulses linestyle 3, \
for [i=4:*] $RunData using 1:i with points linestyle 5+(i-4) axes x1y2
}
}

View file

@ -8,7 +8,7 @@ implementation. During that time, from December to April, several bugs and probl
were identified, improving the maturity of design and code. In the first phase,
the goal was to subject the implementation to increasingly challenging load patterns.
In the second phase, several instrumentation- and measurement methods were developed,
to establish characteristic traits and boudary conditions quantitatively.
to establish characteristic traits and boundary conditions quantitatively.
This directory holds a loose collection of material related to these testing efforts.
Trace-dumps were produced by adding print statements at relevant locations; over time,
@ -16,7 +16,7 @@ a change set with a suitable setup of such diagnostic print statements was assem
which can be applied by `git cherry-pick`. Moreover, load patterns generated by the
`TestChainLoad` tooling can be visualised as _graphviz diagram_ and the collection
of tools in the `StressTestRig` generate report output and data visualisation as
_Gnuplot_ script. Raw measurment data is stored as CSV (see 'csv.hpp').
_Gnuplot_ script. Raw measurement data is stored as CSV (see 'csv.hpp').
Load Peak Testing
@ -25,7 +25,7 @@ Load Peak Testing
Dump-10::
Example of a typical clean run working through a homogenous load peak.
With load patterns in this category, contention is not an issue and, after the
initial ramp-up, all workers are fully loaded and immediately comence with the
initial ramp-up, all workers are fully loaded and immediately commence with the
next job in row, typically requiring ~70µs for the administrative work between
processing jobs (Note: all those measurements were done with *debug builds*,
without compiler optimisation). As an artefact of the measurement setup, a
@ -47,8 +47,8 @@ Graph-10::
+
Notably the concurrency approaches the theoretic limit with increasing peak length,
yet some headroom remains. However, by logical reasoning it becomes clear that there
_must be a startup and shutdown phase_ in each run, and this phase must be calculated
with one Job length each (in this case 2ms startup and 2ms shutdown); startup counts
_must be a start-up and shutdown phase_ in each run, and this phase must be calculated
with one Job length each (in this case 2ms start-up and 2ms shutdown); start-up counts
as _one Job completed,_ while shutdown counts as _N-1 Jobs completed._ Taking these
considerations into account, 4ms of the socket indicated by the linear model can be
explained, so there remains a further socket of 5ms. Various observations seem to
@ -58,3 +58,70 @@ The actual job times are always slightly above the calibrated value (the load op
is calibrated before each test on the specific hardware; it could be shown that this
calibration also holds under multithreaded performance, but the behaviour degrades
when contention, lock coordination and cache misses come into play)
Graph-11::
There seem to be limitations on the achievable degree of concurrency however.
Using the same basic setup, again a job load of 2ms, but this time a 8 worker pool
(the maximum possible on this machine), even in an extended range up to 200 jobs
the average concurrency barely surpasses 7 workers. Moreover, in similar runs,
a small number of excessive outliers was observed, hinting at some pattern
which prevents full usage of available capacity.
Dump-11::
One example trace with 200 Jobs, Job load 2ms and 8-worker pool (all instrumented
runs investigated did take notably longer than the corresponding runs in the Graph,
which can be due to overheads created by the print statements). Some observations
+
- planning expense is significant, which causes the planning to surpass the start
of the first »tick« job. At this point, the complete workforce shows up as expected,
and goes into contention wait subsequently. _This seems to have further ramifications._
- almost 10ms pass until more workers return back from sleep states; this is the expected
behaviour, given that there was a pause of 10ms after all planning work was complete.
- on surface level, the following processing pattern looks completely regular
- yet always when a worker happens to hit contention, it immediately retracts for
an extended period of several milliseconds.
Dump-12::
Based on that observation, the _stickiness_ of the contention-encounter was reduced;
the step-down is not by a power series and thus it takes far less successful work-pulls
to erase the memory of an contention event. The effect can be seen clearly; there are
now longer strikes of contention in the middle of the processing, and workers encountering
contention return faster to regular work.
+
Yet some further irregularities remain: sometimes an assumed pause of 2ms takes 6 or 10ms,
without obvious reason. Presumably these are effects of hardware and OS scheduling -- which
effectively prevent the processing to reach full load on all 8 cores.
Graph-13::
Increasing the load per job again by an factor 4, setting the nominal job computation load
to 8ms, further supports the observed tendency: with increasing number of jobs in row, the
concurrency converges even closer to the theoretical limit, but misses it by a narrow margin.
Interestingly, also the distribution of timings around the regression line is tighter here,
and, again, the linear model matches up close to the expectation (8ms with 8 cores => ∅ 1ms)
Graph-14::
Going into the opposite direction, with only a small job computation load of 500µs, the
parallelisation remains even below 4 workers on average, due to throttling of worker's
pull cycles when encountering repeated contention on the »Grooming Token«
Graph-15::
As an extreme example, here the job computation load was set to 200µs, which is barely
above the known base overhead of 100µs required to schedule a single job (with debug build).
Notably, a breach of patterns appears here: below 90 jobs, in some cases a higher concurrency
is achieved, thus distinguishing two separate sub-populations with different behaviour patterns.
Above 90 jobs, all cases are handled by two workers, and the behaviour is much more uniform.
From watching individual runs with trace-dump, it can be hypothesised that the amount of
contention at the beginning of the work phase is determinant for the emerging work pattern.
If, by chance, workers show up interleaved and evenly spaced, a higher number of workers is
able to pick a job and remain in duty also for follow-up jobs, since workers returning from
active work get precedence in picking the next job.
+
Another surprising observation is the drift of the actual in-job times; even while the work load
was pre-calibrated for this hardware, the actual computation in the context of the scheduler is
reproducibly slower (at least on my machine). Below 90 jobs, also the spread of this observation
value is larger, as is the spread of time in _impeded state,_ which is defined as less than two
workers processing active job content at a given time.

View file

@ -173,7 +173,7 @@ namespace gear {
res = contentionWait();
else
if (kickLevel_)
--kickLevel_;
kickLevel_ /= 2;
if (res == activity::WAIT)
res = idleWait();
else

View file

@ -390,7 +390,8 @@ namespace test {
cpuLoad.calibrate();
//////////////////////////////////////////////////////////////////TODO for development only
MARK_TEST_FUN
TestChainLoad testLoad{50};
/*
TestChainLoad testLoad{200};
testLoad.configure_isolated_nodes()
.buildTopology()
// .printTopologyDOT()
@ -404,7 +405,7 @@ namespace test {
auto set1 = testLoad.setupSchedule(scheduler)
.withLevelDuration(200us)
.withJobDeadline(100ms)
.withJobDeadline(500ms)
.withUpfrontPlanning()
.withLoadTimeBase(2ms)
.withInstrumentation();
@ -417,12 +418,12 @@ cout << "time="<<runTime/1000
}
return;
*/
struct Setup
: StressRig, bench::LoadPeak_ParamRange_Evaluation
{
uint CONCURRENCY = 4;
uint REPETITIONS = 40;
uint CONCURRENCY = 8;
uint REPETITIONS = 80;
auto testLoad(Param nodes)
{
@ -438,14 +439,15 @@ cout << "time="<<runTime/1000
};
auto results = StressRig::with<Setup>()
.perform<bench::ParameterRange> (10,100);
.perform<bench::ParameterRange> (20,200);
cout << "───═══───═══───═══───═══───═══───═══───═══───═══───═══───═══───"<<endl;
cout << Setup::renderGnuplot (results);
cout << "───═══───═══───═══───═══───═══───═══───═══───═══───═══───═══───"<<endl;
auto [socket,gradient,v1,v2,corr,maxDelta,stdev] = bench::linearRegression (results.param, results.time);
cout << _Fmt{"Model: %3.2f·p + %3.2f corr=%4.2f Δmax=%4.2f σ=%4.2f"}
% gradient % socket % corr % maxDelta % stdev
double avgConc = Setup::avgConcurrency (results);
cout << _Fmt{"Model: %3.2f·p + %3.2f corr=%4.2f Δmax=%4.2f σ=%4.2f ∅concurrency: %3.1f"}
% gradient % socket % corr % maxDelta % stdev % avgConc
<< endl;
}

View file

@ -68,9 +68,9 @@
** The implementation code is arranged as a »sandwich« structure...
** - StressTestRig, which is also the framework class, acts as _bottom layer_ to
** provide an anchor point, some common definitions implying an invocation scheme
** ** first a TestChainLoad topology is constructed, based on test parameters
** ** this is used to create a TestChainLoad::SchedulerCtx, which is then
** outfitted specifically for each test run
** + first a TestChainLoad topology is constructed, based on test parameters
** + this is used to create a TestChainLoad::SchedulerCtx, which is then
** outfitted specifically for each test run
** - the _middle layer_ is a custom `Setup` class, which inherits from the bottom
** layer and fills in the actual topology and configuration for the desired test
** - the test performance is then initiated by layering a specific _test tool_ on
@ -240,7 +240,7 @@ namespace test {
{
return testLoad.setupSchedule(scheduler)
.withLevelDuration(200us)
.withJobDeadline(100ms)
.withJobDeadline(500ms)
.withUpfrontPlanning();
}
@ -527,6 +527,7 @@ namespace test {
using lib::stat::Column;
using lib::stat::DataTable;
using lib::stat::DataSpan;
using lib::stat::CSVData;
using IncidenceStat = lib::IncidenceCount::Statistic;
@ -535,7 +536,7 @@ namespace test {
* @return a tuple `(socket,gradient,Vector(predicted),Vector(deltas),correlation,maxDelta,stdev)`
*/
template<typename F, typename G>
auto
inline auto
linearRegression (Column<F> const& x, Column<G> const& y)
{
lib::stat::RegressionData points;
@ -592,6 +593,12 @@ namespace test {
}
static double
avgConcurrency (Table const& results)
{
return lib::stat::average (DataSpan<double> (results.conc.data));
}
static string
renderGnuplot (Table const& results)
{

View file

@ -115719,8 +115719,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
Im Schnitt sind 3 Worker losgelaufen, wenn der erste Worker nach 500&#181;s + X wieder zur&#252;ckkehrt. Da ein zur&#252;ckkehrender Worker vorrangig behandelt wird, kommen die restlichen Worker kaum zum Zug und regeln sich herunter
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1712623556019" ID="ID_1359823747" MODIFIED="1712623567438" TEXT="insofern &#xbb;works as designed&#xab;">
<icon BUILTIN="idea"/>
@ -115750,8 +115749,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
Einzelbeobachtung &#10233; <b>keinerlei auff&#228;lliges Verhalten</b>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<node CREATED="1712624058565" ID="ID_19403295" MODIFIED="1712624079993" TEXT="Planung und Dependency-Setup sind zu Beginn abgeschlossen"/>
<node CREATED="1712623971169" ID="ID_738756991" MODIFIED="1712623992258" TEXT="Hochlauf zur Vollauslastung: 2ms"/>
<node CREATED="1712624086127" ID="ID_1559594499" MODIFIED="1712624098707" TEXT="regelm&#xe4;&#xdf;iges, gleichverteiltes Arbeiten"/>
@ -115770,8 +115768,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
sie werden per Instrumentation erfa&#223;t, und nicht aus anderen Beobachtungen errechnet
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1712625101236" ID="ID_465653239" MODIFIED="1712625201546" TEXT="die &#x2205; 3.7 Threads sind erkl&#xe4;rbar durch 4ms mit 1.5 + Rest mit Vollast"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1712625078878" ID="ID_1920144642" MODIFIED="1712625253483" TEXT="ich verstehe nicht ganz woher der Sockel kommt">
@ -115808,8 +115805,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</li>
</ul>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
<node CREATED="1712666509334" ID="ID_70230671" MODIFIED="1712666648236" TEXT="2470&#xb5;s + 1437&#xb5;s = 3907&#xb5;s"/>
@ -115829,8 +115825,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
4,649/46&#160;&#160;( 46= 50 -4)
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="button_cancel"/>
<node CREATED="1712672235394" ID="ID_1423460333" MODIFIED="1712672276018">
<richcontent TYPE="NODE"><html>
@ -115850,8 +115845,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
...rein zuf&#228;llig habe ich hier grade 46 Jobs in der Aktiven Phase, aber das Modell deckt Parameter im Bereich 10...100 Jobs ab
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="stop-sign"/>
</node>
</node>
@ -115863,8 +115857,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
bessere Deutung: es sind ca 5ms &#8212; das enstspricht dem <font face="Monospaced" size="4" color="#6c1010">WORK_HORIZON</font>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
<node CREATED="1712672779497" ID="ID_1561617455" MODIFIED="1712672797914" TEXT="Einsicht: auch in der Arbeitsphase steckt ein Overhead">
@ -115880,6 +115873,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1712673109278" ID="ID_72527128" MODIFIED="1712673119027" TEXT="Fazit">
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="forward"/>
@ -115891,8 +115885,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
sehr sch&#246;ner <i>steady state </i>ohne offensichtliche Inkonsistenzen
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1712673183634" ID="ID_200427956" MODIFIED="1712673219481" TEXT="rein logisch ergibt sich eine Anlauf/Auslauf-Phase, die einen Overhead von 2*JobTime erzeugt"/>
<node CREATED="1712673245754" ID="ID_742162652" MODIFIED="1712673259044" TEXT="der verbleibende Sockel-Overhead sind 5ms">
@ -115906,8 +115899,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
man kann ihn also deuten als generische <b>Scheduler-Latenz</b>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
<node CREATED="1712673418442" ID="ID_29307844" MODIFIED="1712673442307" TEXT="Dokumentation">
@ -115917,6 +115909,227 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1712698751005" ID="ID_1003770326" MODIFIED="1712704713746" TEXT="4.Test">
<icon BUILTIN="smiley-neutral"/>
<node CREATED="1712698757922" ID="ID_125540685" LINK="#ID_217903920" MODIFIED="1712698800389" TEXT="analog aber 8 Kerne, Last 2ms"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1712698802885" ID="ID_201705801" MODIFIED="1712698833976" TEXT="stelle fest: selbst bei 200 Jobs bleibt &#x2205;conc ~ 7">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1712698908815" ID="ID_656303246" MODIFIED="1712698919553" TEXT="Modell: 0.26&#xb7;p + 10"/>
<node CREATED="1712698920525" ID="ID_1447324007" MODIFIED="1712698936423" TEXT="also der Expense-Faktor pa&#xdf;t sehr gut"/>
<node CREATED="1712698939008" ID="ID_104123529" MODIFIED="1712698951469" TEXT="sehe aber auch immer wieder einzelne, extreme &#xbb;outlier&#xab;"/>
<node CREATED="1712698979246" ID="ID_1668142891" MODIFIED="1712699006491" TEXT="unter 100 Jobs bleibet &#x2205;conc &lt; 6">
<icon BUILTIN="clanbomber"/>
</node>
<node CREATED="1712699034814" ID="ID_1036647495" MODIFIED="1712699037994" TEXT="siehe Graph-11">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1712699045928" ID="ID_701769112" MODIFIED="1712699146046" TEXT="aus diesem wurden einige Outlier bereinigt">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
Begr&#252;ndung: mir kommt es auf das Modell an, und die Regressionslinie war durch die Outlier ersichtlich nach oben verschoben; Model war 0.25&#183;p + 13
</p>
</body>
</html></richcontent>
<font NAME="SansSerif" SIZE="11"/>
</node>
</node>
</node>
<node CREATED="1712698852926" ID="ID_968074250" MODIFIED="1712698859964" TEXT="Einzelbeobachtung">
<icon BUILTIN="list"/>
<node CREATED="1712699753065" ID="ID_1445371638" MODIFIED="1712699755061" TEXT="Dump-11"/>
<node CREATED="1712699755673" ID="ID_210589716" MODIFIED="1712699782331" TEXT="Planungsphase &#xfc;berf&#xe4;hrt den ersten geplanten &#xbb;Tick&#xab; - Job"/>
<node CREATED="1712699782809" ID="ID_691493413" MODIFIED="1712699792656" TEXT="infolgedessen geht die ganze Workforce in contention-wait"/>
<node CREATED="1712699794476" ID="ID_904180227" MODIFIED="1712699907336" TEXT="es dauert 10ms bis wieder mehr Worker auftauchen (das w&#xe4;re aber OK)">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...hat wohl nichts mit der Contention zu tun, sondern damit, da&#223; eine l&#228;ngere Pause war nach dem Ende der Planung. Alle Worker, die irgendwann auftauchen, wurden daraufhin weiter in die Zukunft geschoben. Dieses Muster habe ich bewu&#223;t so gew&#228;hlt, um eine bessere strategische Verteilung der Kapazit&#228;t zu erzielen
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1712699912963" ID="ID_252158235" MODIFIED="1712699932277" TEXT="weitere Verarbeitung sieht &#x2014; oberfl&#xe4;chlich betrachtet &#x2014; sauber aus"/>
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1712699932985" ID="ID_1648223947" MODIFIED="1712699958382" TEXT="ABER: einzelne Contention-Events schicken Worker gleich mehrere ms lang weg">
<icon BUILTIN="broken-line"/>
<node CREATED="1712700929019" ID="ID_1548815337" MODIFIED="1712701199664" TEXT="das liegt an der &#xbb;stickyness&#xab;">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
Ein Worker merkt sich, wenn er in Contention gelaufen ist; jedesmal wenn er wieder erfolgreich zum Zuge kommt, wird sein contention-Level nur reduziert (aber die Erinnerung nicht gel&#246;scht). Das habe ich so eingebaut, um die Drosselung mit einer gewissen Tr&#228;gheit zu erhalten; denn selbst unter starker Contention kommt ein Worker ab und zu doch mal im richtigen Moment, und w&#252;rde dann sofort wieder den Contention-Druck erh&#246;hen. Mein Ziel war, im Falle von andauernder Contention erst mal sehr effektiv &#187;Druck rauszunehmen&#171;
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1712701201623" ID="ID_1167106861" MODIFIED="1712701220016" TEXT="Zeiten: auf Maximal-Level 1.6 ... 3.2ms">
<node CREATED="1712701221884" ID="ID_1442502178" MODIFIED="1712701262800" TEXT="abh&#xe4;ngig von einem Zufallsfaktor">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...der nicht gleichverteilt ist, sondern die Thread-ID verwendet. Es kann also passieren, da&#223; die ganze WorkForce auf Extrem getrimmt ist
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1712701269813" ID="ID_690297260" MODIFIED="1712701295902" TEXT="das pa&#xdf;t mit den Beobachtungen im Dump zusammen"/>
<node CREATED="1712701312176" ID="ID_1806050715" MODIFIED="1712701344447" TEXT="Kick-Level 3...8 &#x27f9; exponentielle Steierung bis Faktor 16"/>
<node CREATED="1712701347667" ID="ID_278643686" MODIFIED="1712701356693" TEXT="dar&#xfc;ber gibt es noch 4 S&#xe4;ttigungs-Level"/>
</node>
<node CREATED="1712701360625" ID="ID_1106806787" MODIFIED="1712701610339" TEXT="das bedeutet: aus S&#xe4;ttigung braucht es 12 erfolgreiche Zuteilungen"/>
<node CREATED="1712701615455" ID="ID_114229524" MODIFIED="1712701645454" TEXT="im Beispiel 2ms / Job dauert es also &gt; 20ms bis ein Worker &#x201e;vergessen hat&#x201c;"/>
<node CREATED="1712701710445" ID="ID_725574726" MODIFIED="1712704509547" TEXT="das erscheint mit etwas zu brachial">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
im Realbetrieb erwarte ich durchaus Job-Zeiten im Millisekunden-Bereich &#8212;ein zuf&#228;lliges Contention-Event, das (wie im Beispiel hier) nicht notwendig problematisch ist, w&#252;rde dennoch f&#252;r eine Dauer von etlichen Frames die &#8222;Bremsen anziehen&#8220;
</p>
</body>
</html></richcontent>
<arrowlink COLOR="#4666c4" DESTINATION="ID_1763982757" ENDARROW="Default" ENDINCLINATION="185;10;" ID="Arrow_ID_892274680" STARTARROW="None" STARTINCLINATION="-108;8;"/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1712701995339" ID="ID_1763982757" MODIFIED="1712704509547" TEXT="Anpassung der Steuerlogik: schneller zur&#xfc;ckfahren">
<arrowlink COLOR="#3b3479" DESTINATION="ID_1390873701" ENDARROW="Default" ENDINCLINATION="189;-13;" ID="Arrow_ID_691473565" STARTARROW="None" STARTINCLINATION="-448;24;"/>
<linktarget COLOR="#4666c4" DESTINATION="ID_1763982757" ENDARROW="Default" ENDINCLINATION="185;10;" ID="Arrow_ID_892274680" SOURCE="ID_725574726" STARTARROW="None" STARTINCLINATION="-108;8;"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1712704514857" HGAP="44" ID="ID_14366808" MODIFIED="1712704697306" TEXT="Effekt im Einzel-Dump ersichtlich" VSHIFT="28">
<linktarget COLOR="#438cbd" DESTINATION="ID_14366808" ENDARROW="Default" ENDINCLINATION="271;23;" ID="Arrow_ID_1881409256" SOURCE="ID_554599062" STARTARROW="None" STARTINCLINATION="305;18;"/>
<icon BUILTIN="idea"/>
</node>
<node COLOR="#5b280f" CREATED="1712704536837" HGAP="41" ID="ID_1992523438" MODIFIED="1712704561461" TEXT="aber leider keine Steigerung der Concurrency" VSHIFT="-1">
<icon BUILTIN="smily_bad"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1712704590131" ID="ID_302274255" MODIFIED="1712704702472" TEXT="Fazit">
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
<node CREATED="1712704594574" ID="ID_908855219" MODIFIED="1712704606448" TEXT="Vollauslastung wird nicht erreicht"/>
<node CREATED="1712704607036" ID="ID_554599062" MODIFIED="1712704697306" TEXT="ein Effekt konnte identifiziert und behoben werden">
<arrowlink COLOR="#438cbd" DESTINATION="ID_14366808" ENDARROW="Default" ENDINCLINATION="271;23;" ID="Arrow_ID_1881409256" STARTARROW="None" STARTINCLINATION="305;18;"/>
</node>
<node CREATED="1712704631074" ID="ID_1854463156" MODIFIED="1712704650387" TEXT="aber weitere Effekte bleiben unerkl&#xe4;rlich"/>
<node CREATED="1712704657102" ID="ID_642785886" MODIFIED="1712704668448" TEXT="abgesehen davon: Ausf&#xfc;hrung ohne ersichtilche Fehlfunktion"/>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1712707225417" ID="ID_483926503" MODIFIED="1712707234332" TEXT="5.Test">
<icon BUILTIN="pencil"/>
<node CREATED="1712707236795" ID="ID_1193438894" MODIFIED="1712707253972" TEXT="8 Kerne, Last 8ms"/>
<node COLOR="#435e98" CREATED="1712707259464" ID="ID_1079397067" MODIFIED="1712707277190" TEXT="bleibt h&#xe4;ngen">
<icon BUILTIN="broken-line"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1712707278278" HGAP="33" ID="ID_441113188" MODIFIED="1712707422922" TEXT="klar &#x27f6; Job-Deadline 100ms wird nun &#xfc;berfahren" VSHIFT="2">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
200 * 8ms = 1600ms / 8 Worker = 200ms, aber der letzte Job wird auf 200*0.2 = 40ms geplant
</p>
</body>
</html></richcontent>
</node>
<node COLOR="#338800" CREATED="1712707325216" ID="ID_407215716" MODIFIED="1712707328134" TEXT="withJobDeadline(500ms)">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1712707425495" ID="ID_923192890" MODIFIED="1712707436497" STYLE="fork" TEXT="bleibt beim 2.Lauf h&#xe4;ngen">
<font NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="broken-line"/>
<node CREATED="1712707454214" ID="ID_614749757" MODIFIED="1712707464397" TEXT="izt werd&apos;s interessant...">
<icon BUILTIN="smiley-oh"/>
</node>
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1712707465445" ID="ID_1436192915" MODIFIED="1712707496042" TEXT="Deadline f&#xfc;r den Tick wurde &#xfc;berfahren">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1712707500045" ID="ID_154552576" MODIFIED="1712707511038">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
und zwar<i>&#160;ganz regul&#228;r</i>
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1712707512094" ID="ID_1670959788" MODIFIED="1712707519425" TEXT="die Lastspitze ist einfach zu gro&#xdf;">
<node CREATED="1712707567303" ID="ID_1273482137" MODIFIED="1712707578721" TEXT="wir hatten 200 Jobs + 200 Follow-ups"/>
<node CREATED="1712707579296" ID="ID_1961322078" MODIFIED="1712707592063" TEXT="alle mit Zeiten &lt; 40ms"/>
<node CREATED="1712707601066" ID="ID_575482041" MODIFIED="1712707609994" TEXT="der Tick war auf ~50ms geplant"/>
<node CREATED="1712707610685" ID="ID_1408583654" MODIFIED="1712707632554" TEXT="wir sind mit den Jobs (incl Wake-Up) aber fertig um ~ 200ms"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1712707656787" ID="ID_724311228" MODIFIED="1712707722866" TEXT="Tick wird nicht ausgef&#xfc;hrt &#x2014; der n&#xe4;chste Planer-Job kommt nicht zum Zug">
<icon BUILTIN="clanbomber"/>
</node>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1712707736176" ID="ID_421830106" MODIFIED="1712707752031" TEXT="was passiert hier genau?">
<icon BUILTIN="help"/>
<node CREATED="1712707753382" ID="ID_1683091808" MODIFIED="1712707767961" TEXT="h&#xe4;tte das nicht eine &#xbb;Scheduler-Emergency&#xab; ausl&#xf6;sen sollen?"/>
<node CREATED="1712707769420" ID="ID_836418133" MODIFIED="1712707781294" TEXT="h&#xe4;tte nicht einfach der Tick-Job verworfen werden sollen?"/>
<node COLOR="#5b280f" CREATED="1712708333504" ID="ID_1111150113" MODIFIED="1712709487030" TEXT="(Bauchgef&#xfc;hl) &#x27f6; irgendwas mit dem Grooming-Token ist faul">
<icon BUILTIN="button_cancel"/>
<node CREATED="1712708472718" ID="ID_55805674" MODIFIED="1712708477913" TEXT="ScopedGroomingGuard">
<node CREATED="1712708480671" ID="ID_599948104" MODIFIED="1712708494615" TEXT="macht nichts wenn der Thread das Token bereits h&#xe4;lt"/>
<node CREATED="1712708660270" ID="ID_1855081310" MODIFIED="1712708664816" TEXT="nur verwendet von...">
<node CREATED="1712708672851" ID="ID_1257905726" MODIFIED="1712708701876" TEXT="seedCalcStream (Eingang zum Planning-Job)"/>
<node CREATED="1712708688114" ID="ID_129027253" MODIFIED="1712708692133" TEXT="handleDutyCycle (der Tick)"/>
</node>
</node>
<node CREATED="1712709107576" ID="ID_1671437251" MODIFIED="1712709134657" TEXT="aber: jeder Job-Ausgang != Activity::PASS droppt das Grooming-Token"/>
<node CREATED="1712709339970" ID="ID_503292469" MODIFIED="1712709345348" TEXT="der Wake-up-Job...">
<node CREATED="1712709346456" ID="ID_665320770" MODIFIED="1712709355652" TEXT="wird als normaler Job gescheduled"/>
<node CREATED="1712709376266" ID="ID_160425716" MODIFIED="1712709395366" TEXT="&#x27f9; es wird ein kompletter Term gebaut"/>
<node CREATED="1712709426806" ID="ID_396019281" MODIFIED="1712709439288" TEXT="der sollte also das Grooming-Token sogar regul&#xe4;r droppen"/>
</node>
</node>
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1712709488734" ID="ID_1622321499" MODIFIED="1712709738428" TEXT="Entscheidungslogik im work-Pull zweifelhaft">
<icon BUILTIN="broken-line"/>
<node CREATED="1712709767218" ID="ID_634325363" MODIFIED="1712709778474" TEXT="Commutator::findWork()">
<node CREATED="1712709783870" ID="ID_664714267" MODIFIED="1712709793464" TEXT="hat einen fallback-Leer-Ausgang"/>
<node CREATED="1712709794076" ID="ID_1248917668" MODIFIED="1712709817749" TEXT="dieser wird vom Worker als Contention-Kick gedeutet"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1712709831231" ID="ID_1502538432" MODIFIED="1712709849386" TEXT="tats&#xe4;chlich gibt es aber einen weiteren Pfad dorthin">
<icon BUILTIN="idea"/>
<node CREATED="1712709851885" ID="ID_1894325652" MODIFIED="1712709880413">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
und zwar <font face="Monospaced" color="#d70330">if layer1.isOutOfTime(now)</font>
</p>
</body>
</html>
</richcontent>
</node>
<node COLOR="#ad006c" CREATED="1712709996385" ID="ID_851225832" MODIFIED="1712710021393" TEXT="genau das ist hier der Fall">
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="forward"/>
</node>
<node COLOR="#b009b2" CREATED="1712710157659" ID="ID_614822816" MODIFIED="1712710204032" TEXT="&#xd83d;&#xddf1; der Job bleibt in der Queue"/>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1712710253302" ID="ID_116406334" MODIFIED="1712710292628" TEXT="&#x21af; Emergency soll aber nur im Tick getriggert werden">
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1712710297041" ID="ID_860306486" MODIFIED="1712710545023" TEXT="der Tick ist hier aber selbst der Trigger">
<icon BUILTIN="messagebox_warning"/>
</node>
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1712710547319" ID="ID_1932392128" MODIFIED="1712710556804" TEXT="Catch-22">
<icon BUILTIN="broken-line"/>
</node>
</node>
</node>
</node>
</node>
</node>
<node CREATED="1712715257580" ID="ID_1655798622" MODIFIED="1712715485004" TEXT="ansonsten (wenn man das umschifft)...">
<icon BUILTIN="list"/>
<node CREATED="1712715273016" ID="ID_203587208" MODIFIED="1712715285762" TEXT="Verhalten im Einklang mit den anderen Beispielen"/>
<node CREATED="1712715286445" ID="ID_1232642164" MODIFIED="1712715303655" TEXT="siehe Graph-13"/>
<node CREATED="1712715317273" ID="ID_862871082" MODIFIED="1712715340474" TEXT="konvergiert noch n&#xe4;her an concurrency &#x2261; 8"/>
<node CREATED="1712715341390" ID="ID_1454215812" MODIFIED="1712715357408" TEXT="aber ein overhead bleibt">
<node CREATED="1712715359444" ID="ID_1500987358" MODIFIED="1712715370510" TEXT="der Sockel-Wert ist insgesamt h&#xf6;her"/>
<node CREATED="1712715371098" ID="ID_1895482443" MODIFIED="1712715441759" TEXT="es bleibt auch eine Anlauf/Auslauf-Phase"/>
</node>
<node CREATED="1712715472324" ID="ID_607480259" MODIFIED="1712715480392" TEXT="die Streuung ist insgesamt geringer">
<icon BUILTIN="idea"/>
</node>
</node>
</node>
</node>
</node>
@ -116004,6 +116217,18 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</node>
</node>
</node>
<node CREATED="1712702077001" ID="ID_314927060" MODIFIED="1712702080372" TEXT="Steuer-Logik">
<node COLOR="#435e98" CREATED="1712702083622" ID="ID_1390873701" MODIFIED="1712704490342" TEXT="Contention-Zustand ist zu &#xbb;sticky&#xab;">
<linktarget COLOR="#3b3479" DESTINATION="ID_1390873701" ENDARROW="Default" ENDINCLINATION="189;-13;" ID="Arrow_ID_691473565" SOURCE="ID_1763982757" STARTARROW="None" STARTINCLINATION="-448;24;"/>
<icon BUILTIN="yes"/>
<node CREATED="1712702188498" ID="ID_1542108518" MODIFIED="1712702221649" TEXT="sporatische Contention-Situation &#x27f9; l&#xe4;ngerfristige Leistungs-Bremse"/>
<node CREATED="1712702226285" ID="ID_559746023" MODIFIED="1712702278842" TEXT="Jobs im ms-Bereich erwartet &#x27f9; Wirkung &#xfc;ber mehrere Frames bef&#xfc;rchtet"/>
<node CREATED="1712702289661" ID="ID_1097877530" MODIFIED="1712702306062" TEXT="es braucht 12 Stufen, um die Erinnerung an Contention zu l&#xf6;schen"/>
<node COLOR="#338800" CREATED="1712702309425" ID="ID_1491619143" MODIFIED="1712704466471" TEXT="Anpassung: f&#xfc;r R&#xfc;ckschritte die Stufen halbieren, statt dekrementieren">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
</node>
<node CREATED="1702954431054" ID="ID_669378388" MODIFIED="1702954436305" TEXT="offen/aufzukl&#xe4;ren">
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1702954476683" ID="ID_1030796415" MODIFIED="1702954846789" TEXT="Verhalten von Workern unter concurrency">