Lumiera  0.pre.03
»edit your freedom«
SchedulerStress_test Class Reference

Description

Test:
Investigate and verify non-functional characteristics of the Scheduler.
Remarks
This test can require several seconds to run and might be brittle, due to reliance on achieving performance within certain limits, which may not be attainable on some systems; notably the platform is expected to provide at least four independent cores for multithreaded execution. The performance demonstrated here confirms that a typical load scenario can be handled — while also documenting various measurement setups usable for focused investigation.
See also
SchedulerActivity_test
SchedulerInvocation_test
SchedulerCommutator_test
stress-test-rig.hpp

Definition at line 64 of file scheduler-stress-test.cpp.

Private Types

using StressRig = StressTestRig< 16 >
 

Private Member Functions

void investigateWorkProcessing ()
 
virtual void run (Arg)
 
void search_breaking_point ()
 
void setup_systematicSchedule ()
 
void smokeTest ()
 
void verify_instrumentation ()
 
void watch_expenseFunction ()
 

Additional Inherited Members

- Public Member Functions inherited from Test
virtual void run (Arg arg)=0
 

Member Function Documentation

◆ smokeTest()

void smokeTest ( )
inlineprivate
Test:
demonstrate test setup for sustained operation under load

Definition at line 82 of file scheduler-stress-test.cpp.

References TestChainLoad< maxFan >::buildTopology(), TestChainLoad< maxFan >::computeGraphStatistics(), TestChainLoad< maxFan >::configureShape_chain_loadBursts(), MARK_TEST_FUN, vault::gear::test::STAT_FORK, vault::gear::test::STAT_JOIN, and vault::gear::test::STAT_NODE.

+ Here is the call graph for this function:

◆ setup_systematicSchedule()

void setup_systematicSchedule ( )
inlineprivate
Test:
build a scheme to adapt the schedule to expected runtime.
  • as in many other tests, use the massively forking load pattern
  • demonstrate how TestChainLoad computes an idealised level expense
  • verify how schedule times are derived from this expense sequence

Definition at line 141 of file scheduler-stress-test.cpp.

References TestChainLoad< maxFan >::buildTopology(), TestChainLoad< maxFan >::configureShape_chain_loadBursts(), ComputationalLoad::invoke(), and MARK_TEST_FUN.

+ Here is the call graph for this function:

◆ verify_instrumentation()

void verify_instrumentation ( )
inlineprivate
Test:
verify capability for instrumentation of job invocations
See also
IncidenceCount_test

Definition at line 279 of file scheduler-stress-test.cpp.

References Config::COMPUTATION_CAPACITY, and MARK_TEST_FUN.

◆ search_breaking_point()

void search_breaking_point ( )
inlineprivate
Test:
determine the breaking point towards scheduler overload
  • use the integrated StressRig
  • demonstrate how parameters can be tweaked
  • perform a run, leading to a binary search for the breaking point
Remarks
this stress-test setup uses instrumentation internally to deduce some systematic deviations from the theoretically established behaviour. For example, on my machine, the ComputationalLoad performs slower within the Scheduler environment compared to its calibration, which is done in a tight loop. This may be due to internals of the processor, which show up under increased contention combined with more frequent cache misses. In a similar vein, the actually observed concurrency turns out to be consistently lower than the value computed by accounting for the work units in isolation, without considering dependency constraints. These observed deviations are cast into an empirical »form factor«, which is then used to correct the applied stress factor. After applying these corrective steps, the observed stress factor at breaking point comes close to the theoretically expected value of 1.0
See also
stress-test-rig.hpp

Definition at line 337 of file scheduler-stress-test.cpp.

References MARK_TEST_FUN, and StressTestRig< maxFan >::testSetup().

+ Here is the call graph for this function:

◆ watch_expenseFunction()

void watch_expenseFunction ( )
inlineprivate
Test:
Investigate the relation of run time (expense) to input length.
  • again use the integrated StressRig
  • this time overload the scheduler with a peak of uncorrelated jobs and watch the time and load required to work through this challenge
  • conduct a series of runs with random number of jobs (within bounds)
  • collect the observed data (as CSV), calculate a linear regression model
  • optionally generate a Gnuplot script for visualisation
    See also
    vault::gear::bench::ParameterRange
    gnuplot-gen.hpp

Definition at line 376 of file scheduler-stress-test.cpp.

References MARK_TEST_FUN.

◆ investigateWorkProcessing()

void investigateWorkProcessing ( )
inlineprivate
Test:
use an extended load pattern to emulate a typical high work load
  • using 4-step linear chains, interleaved such that each level holds 4 nodes
  • the structure overall spans out to 66 levels, leading to ∅3.88 nodes/level
  • load on each node is 5ms, so the overall run would take ~330ms back to back
  • this structure is first performed on the bench::BreakingPoint
  • in the second part, a similar structure with 4-times the size is performed as a single run, but this time with planning and execution interleaved.
  • this demonstrates the Scheduler can sustain stable high load performance

Definition at line 431 of file scheduler-stress-test.cpp.

References TestChainLoad< maxFan >::buildTopology(), Config::COMPUTATION_CAPACITY, TestChainLoad< maxFan >::getHash(), MARK_TEST_FUN, StressTestRig< maxFan >::testSetup(), and TRANSIENTLY.

+ Here is the call graph for this function:
+ Inheritance diagram for SchedulerStress_test:
+ Collaboration diagram for SchedulerStress_test:

The documentation for this class was generated from the following file: