xref: /linux/Documentation/admin-guide/cpu-isolation.rst (revision 5181afcdf99527dd92a88f80fc4d0d8013e1b510)
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