Core Isolation Impact on Cyclictest Latencies

Headline (most important finding for the customer goal):

What is being compared

"isolate CPUs" rows in the test table use a kernel configuration that removes one or more cores from the default scheduler domain.

Note: the SDK test header switches the stress-ng command between the two isolation states (isolated: taskset -c 0,1 stress-ng -c 4; non-isolated: stress-ng -c 4 across all cores). The customer test uses the same stress-ng command in both states. So the SDK isolation pairs change two things at once (kernel isolation AND stress-ng placement); the customer pairs are a cleaner isolation A/B.

SDK test pairs (8)

Aggregate Δmax (B − A) where A=no-iso, B=isolated, so negative = isolation better:
Core0: mean Δmax0 = +7.0 µs  |  isolation better in 3/8 pairs, worse in 4, tied in 1.
Core1: mean Δmax1 = -13.2 µs  |  isolation better in 7/8 pairs, worse in 1, tied in 0.
condition (fixed)no-iso filemax0max1iso filemax0max1Δmax0Δmax1plot
col=SDK test, fs=base, optee=oob, iso=n, ddr=n260522_251122260530_1108102+57-20histograms ↓
col=SDK test, fs=base, optee=oob, iso=n, ddr=Y260524_17285260524_39384+21-1histograms ↓
col=SDK test, fs=base, optee=prng, iso=n, ddr=n260522_45463260531_16237+8-26histograms ↓
col=SDK test, fs=base, optee=prng, iso=n, ddr=Y260523_35483260527_16737+13-46histograms ↓
col=SDK test, fs=default, optee=oob, iso=n, ddr=n260518_112666260530_4101111-25+45histograms ↓
col=SDK test, fs=default, optee=oob, iso=n, ddr=Y260526_4104107260526_2104990-8histograms ↓
col=SDK test, fs=default, optee=prng, iso=n, ddr=n260519_16255260530_26136-1-19histograms ↓
col=SDK test, fs=default, optee=prng, iso=n, ddr=Y260531_48168260524_26437-17-31histograms ↓

Customer test (-i1000) pairs (8)

Aggregate Δmax (B − A) where A=no-iso, B=isolated, so negative = isolation better:
Core0: mean Δmax0 = -1.1 µs  |  isolation better in 5/8 pairs, worse in 3, tied in 0.
Core1: mean Δmax1 = +89.5 µs  |  isolation better in 0/8 pairs, worse in 8, tied in 0.
condition (fixed)no-iso filemax0max1iso filemax0max1Δmax0Δmax1plot
col=Customer -i1000, fs=base, optee=oob, iso=n, ddr=n260529_146072260529_4250180-210+108histograms ↓
col=Customer -i1000, fs=base, optee=oob, iso=n, ddr=Y260528_320369260525_1240113+37+44histograms ↓
col=Customer -i1000, fs=base, optee=prng, iso=n, ddr=n260531_319873260530_3175149-23+76histograms ↓
col=Customer -i1000, fs=base, optee=prng, iso=n, ddr=Y260528_28349260526_172116-11+67histograms ↓
col=Customer -i1000, fs=default, optee=oob, iso=n, ddr=n260529_226978260522_3475266+206+188histograms ↓
col=Customer -i1000, fs=default, optee=oob, iso=n, ddr=Y260528_425159260525_2226133-25+74histograms ↓
col=Customer -i1000, fs=default, optee=prng, iso=n, ddr=n260531_225272260529_3251159-1+87histograms ↓
col=Customer -i1000, fs=default, optee=prng, iso=n, ddr=Y260528_18363260523_2101135+18+72histograms ↓

Aggregate trends across multiple conditions

Sorting the 16 customer-test Core1 maxima (-i1000 column) by isolation state, without controlling for any other factor:

The two distributions do not overlap. The isolation state alone explains the customer-test Core1 max distribution better than any combination of FS, OPTEE, or DDR within the isolated half.

Conclusions

  1. For the customer test: turn off core isolation. This is the only factor in the data set that, by itself, gates whether customer-test Core1 max stays under 100 µs.
  2. For the SDK test: isolation is beneficial (combined with OPTEE-PRNG it gets Core1 max under 40 µs). The SDK and customer tests have opposite isolation behavior, so a single platform configuration cannot optimize both.

Caveats

Appendix — per-pair histogram overlays

Reading the plots: filled circles are the baseline (A) run, "x" markers are the changed (B) run. The top panel is Core 0, the bottom panel is Core 1, both on a log-y count axis. A bump in the A curve that vanishes in the B curve is direct visual evidence that the factor under test produced or removed a latency cluster.

SDK test

fs=base, OPTEE=oob, iso=n, DDR=n  |  no-iso=260522_2 (max0=51, max1=122) vs iso=260530_1 (max0=108, max1=102)   ↑ back to top
fs=base, OPTEE=oob, iso=n, DDR=Y  |  no-iso=260524_1 (max0=72, max1=85) vs iso=260524_3 (max0=93, max1=84)   ↑ back to top
fs=base, OPTEE=prng, iso=n, DDR=n  |  no-iso=260522_4 (max0=54, max1=63) vs iso=260531_1 (max0=62, max1=37)   ↑ back to top
fs=base, OPTEE=prng, iso=n, DDR=Y  |  no-iso=260523_3 (max0=54, max1=83) vs iso=260527_1 (max0=67, max1=37)   ↑ back to top
fs=default, OPTEE=oob, iso=n, DDR=n  |  no-iso=260518_1 (max0=126, max1=66) vs iso=260530_4 (max0=101, max1=111)   ↑ back to top
fs=default, OPTEE=oob, iso=n, DDR=Y  |  no-iso=260526_4 (max0=104, max1=107) vs iso=260526_2 (max0=104, max1=99)   ↑ back to top
fs=default, OPTEE=prng, iso=n, DDR=n  |  no-iso=260519_1 (max0=62, max1=55) vs iso=260530_2 (max0=61, max1=36)   ↑ back to top
fs=default, OPTEE=prng, iso=n, DDR=Y  |  no-iso=260531_4 (max0=81, max1=68) vs iso=260524_2 (max0=64, max1=37)   ↑ back to top

Customer test (-i1000)

fs=base, OPTEE=oob, iso=n, DDR=n  |  no-iso=260529_1 (max0=460, max1=72) vs iso=260529_4 (max0=250, max1=180)   ↑ back to top
fs=base, OPTEE=oob, iso=n, DDR=Y  |  no-iso=260528_3 (max0=203, max1=69) vs iso=260525_1 (max0=240, max1=113)   ↑ back to top
fs=base, OPTEE=prng, iso=n, DDR=n  |  no-iso=260531_3 (max0=198, max1=73) vs iso=260530_3 (max0=175, max1=149)   ↑ back to top
fs=base, OPTEE=prng, iso=n, DDR=Y  |  no-iso=260528_2 (max0=83, max1=49) vs iso=260526_1 (max0=72, max1=116)   ↑ back to top
fs=default, OPTEE=oob, iso=n, DDR=n  |  no-iso=260529_2 (max0=269, max1=78) vs iso=260522_3 (max0=475, max1=266)   ↑ back to top
fs=default, OPTEE=oob, iso=n, DDR=Y  |  no-iso=260528_4 (max0=251, max1=59) vs iso=260525_2 (max0=226, max1=133)   ↑ back to top
fs=default, OPTEE=prng, iso=n, DDR=n  |  no-iso=260531_2 (max0=252, max1=72) vs iso=260529_3 (max0=251, max1=159)   ↑ back to top
fs=default, OPTEE=prng, iso=n, DDR=Y  |  no-iso=260528_1 (max0=83, max1=63) vs iso=260523_2 (max0=101, max1=135)   ↑ back to top