1*f0efd29aSFrederic Weisbecker.. SPDX-License-Identifier: GPL-2.0 2*f0efd29aSFrederic Weisbecker 3*f0efd29aSFrederic Weisbecker============= 4*f0efd29aSFrederic WeisbeckerCPU Isolation 5*f0efd29aSFrederic Weisbecker============= 6*f0efd29aSFrederic Weisbecker 7*f0efd29aSFrederic WeisbeckerIntroduction 8*f0efd29aSFrederic Weisbecker============ 9*f0efd29aSFrederic Weisbecker 10*f0efd29aSFrederic Weisbecker"CPU Isolation" means leaving a CPU exclusive to a given workload 11*f0efd29aSFrederic Weisbeckerwithout any undesired code interference from the kernel. 12*f0efd29aSFrederic Weisbecker 13*f0efd29aSFrederic WeisbeckerThose interferences, commonly pointed out as "noise", can be triggered 14*f0efd29aSFrederic Weisbeckerby asynchronous events (interrupts, timers, scheduler preemption by 15*f0efd29aSFrederic Weisbeckerworkqueues and kthreads, ...) or synchronous events (syscalls and page 16*f0efd29aSFrederic Weisbeckerfaults). 17*f0efd29aSFrederic Weisbecker 18*f0efd29aSFrederic WeisbeckerSuch noise usually goes unnoticed. After all, synchronous events are a 19*f0efd29aSFrederic Weisbeckercomponent of the requested kernel service. And asynchronous events are 20*f0efd29aSFrederic Weisbeckereither sufficiently well-distributed by the scheduler when executed 21*f0efd29aSFrederic Weisbeckeras tasks or reasonably fast when executed as interrupt. The timer 22*f0efd29aSFrederic Weisbeckerinterrupt can even execute 1024 times per seconds without a significant 23*f0efd29aSFrederic Weisbeckerand measurable impact most of the time. 24*f0efd29aSFrederic Weisbecker 25*f0efd29aSFrederic WeisbeckerHowever some rare and extreme workloads can be quite sensitive to 26*f0efd29aSFrederic Weisbeckerthose kinds of noise. This is the case, for example, with high 27*f0efd29aSFrederic Weisbeckerbandwidth network processing that can't afford losing a single packet 28*f0efd29aSFrederic Weisbeckeror very low latency network processing. Typically those use cases 29*f0efd29aSFrederic Weisbeckerinvolve DPDK, bypassing the kernel networking stack and performing 30*f0efd29aSFrederic Weisbeckerdirect access to the networking device from userspace. 31*f0efd29aSFrederic Weisbecker 32*f0efd29aSFrederic WeisbeckerIn order to run a CPU without or with limited kernel noise, the 33*f0efd29aSFrederic Weisbeckerrelated housekeeping work needs to be either shut down, migrated or 34*f0efd29aSFrederic Weisbeckeroffloaded. 35*f0efd29aSFrederic Weisbecker 36*f0efd29aSFrederic WeisbeckerHousekeeping 37*f0efd29aSFrederic Weisbecker============ 38*f0efd29aSFrederic Weisbecker 39*f0efd29aSFrederic WeisbeckerIn the CPU isolation terminology, housekeeping is the work, often 40*f0efd29aSFrederic Weisbeckerasynchronous, that the kernel needs to process in order to maintain 41*f0efd29aSFrederic Weisbeckerall its services. It matches the noises and disturbances enumerated 42*f0efd29aSFrederic Weisbeckerabove except when at least one CPU is isolated. Then housekeeping may 43*f0efd29aSFrederic Weisbeckermake use of further coping mechanisms if CPU-tied work must be 44*f0efd29aSFrederic Weisbeckeroffloaded. 45*f0efd29aSFrederic Weisbecker 46*f0efd29aSFrederic WeisbeckerHousekeeping CPUs are the non-isolated CPUs where the kernel noise 47*f0efd29aSFrederic Weisbeckeris moved away from isolated CPUs. 48*f0efd29aSFrederic Weisbecker 49*f0efd29aSFrederic WeisbeckerThe isolation can be implemented in several ways depending on the 50*f0efd29aSFrederic Weisbeckernature of the noise: 51*f0efd29aSFrederic Weisbecker 52*f0efd29aSFrederic Weisbecker- Unbound work, where "unbound" means not tied to any CPU, can be 53*f0efd29aSFrederic Weisbecker simply migrated away from isolated CPUs to housekeeping CPUs. 54*f0efd29aSFrederic Weisbecker This is the case of unbound workqueues, kthreads and timers. 55*f0efd29aSFrederic Weisbecker 56*f0efd29aSFrederic Weisbecker- Bound work, where "bound" means tied to a specific CPU, usually 57*f0efd29aSFrederic Weisbecker can't be moved away as-is by nature. Either: 58*f0efd29aSFrederic Weisbecker 59*f0efd29aSFrederic Weisbecker - The work must switch to a locked implementation. E.g.: 60*f0efd29aSFrederic Weisbecker This is the case of RCU with CONFIG_RCU_NOCB_CPU. 61*f0efd29aSFrederic Weisbecker 62*f0efd29aSFrederic Weisbecker - The related feature must be shut down and considered 63*f0efd29aSFrederic Weisbecker incompatible with isolated CPUs. E.g.: Lockup watchdog, 64*f0efd29aSFrederic Weisbecker unreliable clocksources, etc... 65*f0efd29aSFrederic Weisbecker 66*f0efd29aSFrederic Weisbecker - An elaborate and heavyweight coping mechanism stands as a 67*f0efd29aSFrederic Weisbecker replacement. E.g.: the timer tick is shut down on nohz_full 68*f0efd29aSFrederic Weisbecker CPUs but with the constraint of running a single task on 69*f0efd29aSFrederic Weisbecker them. A significant cost penalty is added on kernel entry/exit 70*f0efd29aSFrederic Weisbecker and a residual 1Hz scheduler tick is offloaded to housekeeping 71*f0efd29aSFrederic Weisbecker CPUs. 72*f0efd29aSFrederic Weisbecker 73*f0efd29aSFrederic WeisbeckerIn any case, housekeeping work has to be handled, which is why there 74*f0efd29aSFrederic Weisbeckermust be at least one housekeeping CPU in the system, preferably more 75*f0efd29aSFrederic Weisbeckerif the machine runs a lot of CPUs. For example one per node on NUMA 76*f0efd29aSFrederic Weisbeckersystems. 77*f0efd29aSFrederic Weisbecker 78*f0efd29aSFrederic WeisbeckerAlso CPU isolation often means a tradeoff between noise-free isolated 79*f0efd29aSFrederic WeisbeckerCPUs and added overhead on housekeeping CPUs, sometimes even on 80*f0efd29aSFrederic Weisbeckerisolated CPUs entering the kernel. 81*f0efd29aSFrederic Weisbecker 82*f0efd29aSFrederic WeisbeckerIsolation features 83*f0efd29aSFrederic Weisbecker================== 84*f0efd29aSFrederic Weisbecker 85*f0efd29aSFrederic WeisbeckerDifferent levels of isolation can be configured in the kernel, each of 86*f0efd29aSFrederic Weisbeckerwhich has its own drawbacks and tradeoffs. 87*f0efd29aSFrederic Weisbecker 88*f0efd29aSFrederic WeisbeckerScheduler domain isolation 89*f0efd29aSFrederic Weisbecker-------------------------- 90*f0efd29aSFrederic Weisbecker 91*f0efd29aSFrederic WeisbeckerThis feature isolates a CPU from the scheduler topology. As a result, 92*f0efd29aSFrederic Weisbeckerthe target isn't part of the load balancing. Tasks won't migrate 93*f0efd29aSFrederic Weisbeckereither from or to it unless affined explicitly. 94*f0efd29aSFrederic Weisbecker 95*f0efd29aSFrederic WeisbeckerAs a side effect the CPU is also isolated from unbound workqueues and 96*f0efd29aSFrederic Weisbeckerunbound kthreads. 97*f0efd29aSFrederic Weisbecker 98*f0efd29aSFrederic WeisbeckerRequirements 99*f0efd29aSFrederic Weisbecker~~~~~~~~~~~~ 100*f0efd29aSFrederic Weisbecker 101*f0efd29aSFrederic Weisbecker- CONFIG_CPUSETS=y for the cpusets-based interface 102*f0efd29aSFrederic Weisbecker 103*f0efd29aSFrederic WeisbeckerTradeoffs 104*f0efd29aSFrederic Weisbecker~~~~~~~~~ 105*f0efd29aSFrederic Weisbecker 106*f0efd29aSFrederic WeisbeckerBy nature, the system load is overall less distributed since some CPUs 107*f0efd29aSFrederic Weisbeckerare extracted from the global load balancing. 108*f0efd29aSFrederic Weisbecker 109*f0efd29aSFrederic WeisbeckerInterfaces 110*f0efd29aSFrederic Weisbecker~~~~~~~~~~ 111*f0efd29aSFrederic Weisbecker 112*f0efd29aSFrederic Weisbecker- Documentation/admin-guide/cgroup-v2.rst cpuset isolated partitions are recommended 113*f0efd29aSFrederic Weisbecker because they are tunable at runtime. 114*f0efd29aSFrederic Weisbecker 115*f0efd29aSFrederic Weisbecker- The 'isolcpus=' kernel boot parameter with the 'domain' flag is a 116*f0efd29aSFrederic Weisbecker less flexible alternative that doesn't allow for runtime 117*f0efd29aSFrederic Weisbecker reconfiguration. 118*f0efd29aSFrederic Weisbecker 119*f0efd29aSFrederic WeisbeckerIRQs isolation 120*f0efd29aSFrederic Weisbecker-------------- 121*f0efd29aSFrederic Weisbecker 122*f0efd29aSFrederic WeisbeckerIsolate the IRQs whenever possible, so that they don't fire on the 123*f0efd29aSFrederic Weisbeckertarget CPUs. 124*f0efd29aSFrederic Weisbecker 125*f0efd29aSFrederic WeisbeckerInterfaces 126*f0efd29aSFrederic Weisbecker~~~~~~~~~~ 127*f0efd29aSFrederic Weisbecker 128*f0efd29aSFrederic Weisbecker- The file /proc/irq/\*/smp_affinity as explained in detail in 129*f0efd29aSFrederic Weisbecker Documentation/core-api/irq/irq-affinity.rst page. 130*f0efd29aSFrederic Weisbecker 131*f0efd29aSFrederic Weisbecker- The "irqaffinity=" kernel boot parameter for a default setting. 132*f0efd29aSFrederic Weisbecker 133*f0efd29aSFrederic Weisbecker- The "managed_irq" flag in the "isolcpus=" kernel boot parameter 134*f0efd29aSFrederic Weisbecker tries a best effort affinity override for managed IRQs. 135*f0efd29aSFrederic Weisbecker 136*f0efd29aSFrederic WeisbeckerFull Dynticks (aka nohz_full) 137*f0efd29aSFrederic Weisbecker----------------------------- 138*f0efd29aSFrederic Weisbecker 139*f0efd29aSFrederic WeisbeckerFull dynticks extends the dynticks idle mode, which stops the tick when 140*f0efd29aSFrederic Weisbeckerthe CPU is idle, to CPUs running a single task in userspace. That is, 141*f0efd29aSFrederic Weisbeckerthe timer tick is stopped if the environment allows it. 142*f0efd29aSFrederic Weisbecker 143*f0efd29aSFrederic WeisbeckerGlobal timer callbacks are also isolated from the nohz_full CPUs. 144*f0efd29aSFrederic Weisbecker 145*f0efd29aSFrederic WeisbeckerRequirements 146*f0efd29aSFrederic Weisbecker~~~~~~~~~~~~ 147*f0efd29aSFrederic Weisbecker 148*f0efd29aSFrederic Weisbecker- CONFIG_NO_HZ_FULL=y 149*f0efd29aSFrederic Weisbecker 150*f0efd29aSFrederic WeisbeckerConstraints 151*f0efd29aSFrederic Weisbecker~~~~~~~~~~~ 152*f0efd29aSFrederic Weisbecker 153*f0efd29aSFrederic Weisbecker- The isolated CPUs must run a single task only. Multitask requires 154*f0efd29aSFrederic Weisbecker the tick to maintain preemption. This is usually fine since the 155*f0efd29aSFrederic Weisbecker workload usually can't stand the latency of random context switches. 156*f0efd29aSFrederic Weisbecker 157*f0efd29aSFrederic Weisbecker- No call to the kernel from isolated CPUs, at the risk of triggering 158*f0efd29aSFrederic Weisbecker random noise. 159*f0efd29aSFrederic Weisbecker 160*f0efd29aSFrederic Weisbecker- No use of POSIX CPU timers on isolated CPUs. 161*f0efd29aSFrederic Weisbecker 162*f0efd29aSFrederic Weisbecker- Architecture must have a stable and reliable clocksource (no 163*f0efd29aSFrederic Weisbecker unreliable TSC that requires the watchdog). 164*f0efd29aSFrederic Weisbecker 165*f0efd29aSFrederic Weisbecker 166*f0efd29aSFrederic WeisbeckerTradeoffs 167*f0efd29aSFrederic Weisbecker~~~~~~~~~ 168*f0efd29aSFrederic Weisbecker 169*f0efd29aSFrederic WeisbeckerIn terms of cost, this is the most invasive isolation feature. It is 170*f0efd29aSFrederic Weisbeckerassumed to be used when the workload spends most of its time in 171*f0efd29aSFrederic Weisbeckeruserspace and doesn't rely on the kernel except for preparatory 172*f0efd29aSFrederic Weisbeckerwork because: 173*f0efd29aSFrederic Weisbecker 174*f0efd29aSFrederic Weisbecker- RCU adds more overhead due to the locked, offloaded and threaded 175*f0efd29aSFrederic Weisbecker callbacks processing (the same that would be obtained with "rcu_nocbs" 176*f0efd29aSFrederic Weisbecker boot parameter). 177*f0efd29aSFrederic Weisbecker 178*f0efd29aSFrederic Weisbecker- Kernel entry/exit through syscalls, exceptions and IRQs are more 179*f0efd29aSFrederic Weisbecker costly due to fully ordered RmW operations that maintain userspace 180*f0efd29aSFrederic Weisbecker as RCU extended quiescent state. Also the CPU time is accounted on 181*f0efd29aSFrederic Weisbecker kernel boundaries instead of periodically from the tick. 182*f0efd29aSFrederic Weisbecker 183*f0efd29aSFrederic Weisbecker- Housekeeping CPUs must run a 1Hz residual remote scheduler tick 184*f0efd29aSFrederic Weisbecker on behalf of the isolated CPUs. 185*f0efd29aSFrederic Weisbecker 186*f0efd29aSFrederic WeisbeckerChecklist 187*f0efd29aSFrederic Weisbecker========= 188*f0efd29aSFrederic Weisbecker 189*f0efd29aSFrederic WeisbeckerYou have set up each of the above isolation features but you still 190*f0efd29aSFrederic Weisbeckerobserve jitters that trash your workload? Make sure to check a few 191*f0efd29aSFrederic Weisbeckerelements before proceeding. 192*f0efd29aSFrederic Weisbecker 193*f0efd29aSFrederic WeisbeckerSome of these checklist items are similar to those of real-time 194*f0efd29aSFrederic Weisbeckerworkloads: 195*f0efd29aSFrederic Weisbecker 196*f0efd29aSFrederic Weisbecker- Use mlock() to prevent your pages from being swapped away. Page 197*f0efd29aSFrederic Weisbecker faults are usually not compatible with jitter sensitive workloads. 198*f0efd29aSFrederic Weisbecker 199*f0efd29aSFrederic Weisbecker- Avoid SMT to prevent your hardware thread from being "preempted" 200*f0efd29aSFrederic Weisbecker by another one. 201*f0efd29aSFrederic Weisbecker 202*f0efd29aSFrederic Weisbecker- CPU frequency changes may induce subtle sorts of jitter in a 203*f0efd29aSFrederic Weisbecker workload. Cpufreq should be used and tuned with caution. 204*f0efd29aSFrederic Weisbecker 205*f0efd29aSFrederic Weisbecker- Deep C-states may result in latency issues upon wake-up. If this 206*f0efd29aSFrederic Weisbecker happens to be a problem, C-states can be limited via kernel boot 207*f0efd29aSFrederic Weisbecker parameters such as processor.max_cstate or intel_idle.max_cstate. 208*f0efd29aSFrederic Weisbecker More finegrained tunings are described in 209*f0efd29aSFrederic Weisbecker Documentation/admin-guide/pm/cpuidle.rst page 210*f0efd29aSFrederic Weisbecker 211*f0efd29aSFrederic Weisbecker- Your system may be subject to firmware-originating interrupts - x86 has 212*f0efd29aSFrederic Weisbecker System Management Interrupts (SMIs) for example. Check your system BIOS 213*f0efd29aSFrederic Weisbecker to disable such interference, and with some luck your vendor will have 214*f0efd29aSFrederic Weisbecker a BIOS tuning guidance for low-latency operations. 215*f0efd29aSFrederic Weisbecker 216*f0efd29aSFrederic Weisbecker 217*f0efd29aSFrederic WeisbeckerFull isolation example 218*f0efd29aSFrederic Weisbecker====================== 219*f0efd29aSFrederic Weisbecker 220*f0efd29aSFrederic WeisbeckerIn this example, the system has 8 CPUs and the 8th is to be fully 221*f0efd29aSFrederic Weisbeckerisolated. Since CPUs start from 0, the 8th CPU is CPU 7. 222*f0efd29aSFrederic Weisbecker 223*f0efd29aSFrederic WeisbeckerKernel parameters 224*f0efd29aSFrederic Weisbecker----------------- 225*f0efd29aSFrederic Weisbecker 226*f0efd29aSFrederic WeisbeckerSet the following kernel boot parameters to disable SMT and setup tick 227*f0efd29aSFrederic Weisbeckerand IRQ isolation: 228*f0efd29aSFrederic Weisbecker 229*f0efd29aSFrederic Weisbecker- Full dynticks: nohz_full=7 230*f0efd29aSFrederic Weisbecker 231*f0efd29aSFrederic Weisbecker- IRQs isolation: irqaffinity=0-6 232*f0efd29aSFrederic Weisbecker 233*f0efd29aSFrederic Weisbecker- Managed IRQs isolation: isolcpus=managed_irq,7 234*f0efd29aSFrederic Weisbecker 235*f0efd29aSFrederic Weisbecker- Prevent SMT: nosmt 236*f0efd29aSFrederic Weisbecker 237*f0efd29aSFrederic WeisbeckerThe full command line is then: 238*f0efd29aSFrederic Weisbecker 239*f0efd29aSFrederic Weisbecker nohz_full=7 irqaffinity=0-6 isolcpus=managed_irq,7 nosmt 240*f0efd29aSFrederic Weisbecker 241*f0efd29aSFrederic WeisbeckerCPUSET configuration (cgroup v2) 242*f0efd29aSFrederic Weisbecker-------------------------------- 243*f0efd29aSFrederic Weisbecker 244*f0efd29aSFrederic WeisbeckerAssuming cgroup v2 is mounted to /sys/fs/cgroup, the following script 245*f0efd29aSFrederic Weisbeckerisolates CPU 7 from scheduler domains. 246*f0efd29aSFrederic Weisbecker 247*f0efd29aSFrederic Weisbecker:: 248*f0efd29aSFrederic Weisbecker 249*f0efd29aSFrederic Weisbecker cd /sys/fs/cgroup 250*f0efd29aSFrederic Weisbecker # Activate the cpuset subsystem 251*f0efd29aSFrederic Weisbecker echo +cpuset > cgroup.subtree_control 252*f0efd29aSFrederic Weisbecker # Create partition to be isolated 253*f0efd29aSFrederic Weisbecker mkdir test 254*f0efd29aSFrederic Weisbecker cd test 255*f0efd29aSFrederic Weisbecker echo +cpuset > cgroup.subtree_control 256*f0efd29aSFrederic Weisbecker # Isolate CPU 7 257*f0efd29aSFrederic Weisbecker echo 7 > cpuset.cpus 258*f0efd29aSFrederic Weisbecker echo "isolated" > cpuset.cpus.partition 259*f0efd29aSFrederic Weisbecker 260*f0efd29aSFrederic WeisbeckerThe userspace workload 261*f0efd29aSFrederic Weisbecker---------------------- 262*f0efd29aSFrederic Weisbecker 263*f0efd29aSFrederic WeisbeckerFake a pure userspace workload, the program below runs a dummy 264*f0efd29aSFrederic Weisbeckeruserspace loop on the isolated CPU 7. 265*f0efd29aSFrederic Weisbecker 266*f0efd29aSFrederic Weisbecker:: 267*f0efd29aSFrederic Weisbecker 268*f0efd29aSFrederic Weisbecker #include <stdio.h> 269*f0efd29aSFrederic Weisbecker #include <fcntl.h> 270*f0efd29aSFrederic Weisbecker #include <unistd.h> 271*f0efd29aSFrederic Weisbecker #include <errno.h> 272*f0efd29aSFrederic Weisbecker int main(void) 273*f0efd29aSFrederic Weisbecker { 274*f0efd29aSFrederic Weisbecker // Move the current task to the isolated cpuset (bind to CPU 7) 275*f0efd29aSFrederic Weisbecker int fd = open("/sys/fs/cgroup/test/cgroup.procs", O_WRONLY); 276*f0efd29aSFrederic Weisbecker if (fd < 0) { 277*f0efd29aSFrederic Weisbecker perror("Can't open cpuset file...\n"); 278*f0efd29aSFrederic Weisbecker return 0; 279*f0efd29aSFrederic Weisbecker } 280*f0efd29aSFrederic Weisbecker 281*f0efd29aSFrederic Weisbecker write(fd, "0\n", 2); 282*f0efd29aSFrederic Weisbecker close(fd); 283*f0efd29aSFrederic Weisbecker 284*f0efd29aSFrederic Weisbecker // Run an endless dummy loop until the launcher kills us 285*f0efd29aSFrederic Weisbecker while (1) 286*f0efd29aSFrederic Weisbecker ; 287*f0efd29aSFrederic Weisbecker 288*f0efd29aSFrederic Weisbecker return 0; 289*f0efd29aSFrederic Weisbecker } 290*f0efd29aSFrederic Weisbecker 291*f0efd29aSFrederic WeisbeckerBuild it and save for later step: 292*f0efd29aSFrederic Weisbecker 293*f0efd29aSFrederic Weisbecker:: 294*f0efd29aSFrederic Weisbecker 295*f0efd29aSFrederic Weisbecker # gcc user_loop.c -o user_loop 296*f0efd29aSFrederic Weisbecker 297*f0efd29aSFrederic WeisbeckerThe launcher 298*f0efd29aSFrederic Weisbecker------------ 299*f0efd29aSFrederic Weisbecker 300*f0efd29aSFrederic WeisbeckerThe below launcher runs the above program for 10 seconds and traces 301*f0efd29aSFrederic Weisbeckerthe noise resulting from preempting tasks and IRQs. 302*f0efd29aSFrederic Weisbecker 303*f0efd29aSFrederic Weisbecker:: 304*f0efd29aSFrederic Weisbecker 305*f0efd29aSFrederic Weisbecker TRACING=/sys/kernel/tracing/ 306*f0efd29aSFrederic Weisbecker # Make sure tracing is off for now 307*f0efd29aSFrederic Weisbecker echo 0 > $TRACING/tracing_on 308*f0efd29aSFrederic Weisbecker # Flush previous traces 309*f0efd29aSFrederic Weisbecker echo > $TRACING/trace 310*f0efd29aSFrederic Weisbecker # Record disturbance from other tasks 311*f0efd29aSFrederic Weisbecker echo 1 > $TRACING/events/sched/sched_switch/enable 312*f0efd29aSFrederic Weisbecker # Record disturbance from interrupts 313*f0efd29aSFrederic Weisbecker echo 1 > $TRACING/events/irq_vectors/enable 314*f0efd29aSFrederic Weisbecker # Now we can start tracing 315*f0efd29aSFrederic Weisbecker echo 1 > $TRACING/tracing_on 316*f0efd29aSFrederic Weisbecker # Run the dummy user_loop for 10 seconds on CPU 7 317*f0efd29aSFrederic Weisbecker ./user_loop & 318*f0efd29aSFrederic Weisbecker USER_LOOP_PID=$! 319*f0efd29aSFrederic Weisbecker sleep 10 320*f0efd29aSFrederic Weisbecker kill $USER_LOOP_PID 321*f0efd29aSFrederic Weisbecker # Disable tracing and save traces from CPU 7 in a file 322*f0efd29aSFrederic Weisbecker echo 0 > $TRACING/tracing_on 323*f0efd29aSFrederic Weisbecker cat $TRACING/per_cpu/cpu7/trace > trace.7 324*f0efd29aSFrederic Weisbecker 325*f0efd29aSFrederic WeisbeckerIf no specific problem arose, the output of trace.7 should look like 326*f0efd29aSFrederic Weisbeckerthe following: 327*f0efd29aSFrederic Weisbecker 328*f0efd29aSFrederic Weisbecker:: 329*f0efd29aSFrederic Weisbecker 330*f0efd29aSFrederic Weisbecker <idle>-0 [007] d..2. 1980.976624: sched_switch: prev_comm=swapper/7 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=user_loop next_pid=1553 next_prio=120 331*f0efd29aSFrederic Weisbecker user_loop-1553 [007] d.h.. 1990.946593: reschedule_entry: vector=253 332*f0efd29aSFrederic Weisbecker user_loop-1553 [007] d.h.. 1990.946593: reschedule_exit: vector=253 333*f0efd29aSFrederic Weisbecker 334*f0efd29aSFrederic WeisbeckerThat is, no specific noise triggered between the first trace and the 335*f0efd29aSFrederic Weisbeckersecond during 10 seconds when user_loop was running. 336*f0efd29aSFrederic Weisbecker 337*f0efd29aSFrederic WeisbeckerDebugging 338*f0efd29aSFrederic Weisbecker========= 339*f0efd29aSFrederic Weisbecker 340*f0efd29aSFrederic WeisbeckerOf course things are never so easy, especially on this matter. 341*f0efd29aSFrederic WeisbeckerChances are that actual noise will be observed in the aforementioned 342*f0efd29aSFrederic Weisbeckertrace.7 file. 343*f0efd29aSFrederic Weisbecker 344*f0efd29aSFrederic WeisbeckerThe best way to investigate further is to enable finer grained 345*f0efd29aSFrederic Weisbeckertracepoints such as those of subsystems producing asynchronous 346*f0efd29aSFrederic Weisbeckerevents: workqueue, timer, irq_vector, etc... It also can be 347*f0efd29aSFrederic Weisbeckerinteresting to enable the tick_stop event to diagnose why the tick is 348*f0efd29aSFrederic Weisbeckerretained when that happens. 349*f0efd29aSFrederic Weisbecker 350*f0efd29aSFrederic WeisbeckerSome tools may also be useful for higher level analysis: 351*f0efd29aSFrederic Weisbecker 352*f0efd29aSFrederic Weisbecker- Documentation/tools/rtla/rtla.rst provides a suite of tools to analyze 353*f0efd29aSFrederic Weisbecker latency and noise in the system. For example Documentation/tools/rtla/rtla-osnoise.rst 354*f0efd29aSFrederic Weisbecker runs a kernel tracer that analyzes and output a summary of the noises. 355*f0efd29aSFrederic Weisbecker 356*f0efd29aSFrederic Weisbecker- dynticks-testing does something similar to rtla-osnoise but in userspace. It is available 357*f0efd29aSFrederic Weisbecker at git://git.kernel.org/pub/scm/linux/kernel/git/frederic/dynticks-testing.git 358