€•ú³Œsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ-/translations/zh_CN/admin-guide/cpu-isolation”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ-/translations/zh_TW/admin-guide/cpu-isolation”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ-/translations/it_IT/admin-guide/cpu-isolation”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ-/translations/ja_JP/admin-guide/cpu-isolation”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ-/translations/ko_KR/admin-guide/cpu-isolation”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ-/translations/pt_BR/admin-guide/cpu-isolation”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ-/translations/sp_SP/admin-guide/cpu-isolation”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)”}”(hŒ SPDX-License-Identifier: GPL-2.0”h]”hŒ SPDX-License-Identifier: GPL-2.0”…””}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³ŒG/var/lib/git/docbuild/linux/Documentation/admin-guide/cpu-isolation.rst”h´KubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒ CPU Isolation”h]”hŒ CPU Isolation”…””}”(hhÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÊh²hh³hÇh´KubhÉ)”}”(hhh]”(hÎ)”}”(hŒ Introduction”h]”hŒ Introduction”…””}”(hhàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÝh²hh³hÇh´KubhŒ paragraph”“”)”}”(hŒz"CPU Isolation" means leaving a CPU exclusive to a given workload without any undesired code interference from the kernel.”h]”hŒ~“CPU Isolation†means leaving a CPU exclusive to a given workload without any undesired code interference from the kernel.”…””}”(hhðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K hhÝh²hubhï)”}”(hŒÚThose interferences, commonly pointed out as "noise", can be triggered by asynchronous events (interrupts, timers, scheduler preemption by workqueues and kthreads, ...) or synchronous events (syscalls and page faults).”h]”hŒÞThose interferences, commonly pointed out as “noiseâ€, can be triggered by asynchronous events (interrupts, timers, scheduler preemption by workqueues and kthreads, ...) or synchronous events (syscalls and page faults).”…””}”(hhþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K hhÝh²hubhï)”}”(hXƒSuch noise usually goes unnoticed. After all, synchronous events are a component of the requested kernel service. And asynchronous events are either sufficiently well-distributed by the scheduler when executed as tasks or reasonably fast when executed as interrupt. The timer interrupt can even execute 1024 times per seconds without a significant and measurable impact most of the time.”h]”hXƒSuch noise usually goes unnoticed. After all, synchronous events are a component of the requested kernel service. And asynchronous events are either sufficiently well-distributed by the scheduler when executed as tasks or reasonably fast when executed as interrupt. The timer interrupt can even execute 1024 times per seconds without a significant and measurable impact most of the time.”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KhhÝh²hubhï)”}”(hX‚However some rare and extreme workloads can be quite sensitive to those kinds of noise. This is the case, for example, with high bandwidth network processing that can't afford losing a single packet or very low latency network processing. Typically those use cases involve DPDK, bypassing the kernel networking stack and performing direct access to the networking device from userspace.”h]”hX„However some rare and extreme workloads can be quite sensitive to those kinds of noise. This is the case, for example, with high bandwidth network processing that can’t afford losing a single packet or very low latency network processing. Typically those use cases involve DPDK, bypassing the kernel networking stack and performing direct access to the networking device from userspace.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KhhÝh²hubhï)”}”(hŒŽIn order to run a CPU without or with limited kernel noise, the related housekeeping work needs to be either shut down, migrated or offloaded.”h]”hŒŽIn order to run a CPU without or with limited kernel noise, the related housekeeping work needs to be either shut down, migrated or offloaded.”…””}”(hj(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K hhÝh²hubeh}”(h]”Œ introduction”ah ]”h"]”Œ introduction”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KubhÉ)”}”(hhh]”(hÎ)”}”(hŒ Housekeeping”h]”hŒ Housekeeping”…””}”(hjAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj>h²hh³hÇh´K%ubhï)”}”(hXYIn the CPU isolation terminology, housekeeping is the work, often asynchronous, that the kernel needs to process in order to maintain all its services. It matches the noises and disturbances enumerated above except when at least one CPU is isolated. Then housekeeping may make use of further coping mechanisms if CPU-tied work must be offloaded.”h]”hXYIn the CPU isolation terminology, housekeeping is the work, often asynchronous, that the kernel needs to process in order to maintain all its services. It matches the noises and disturbances enumerated above except when at least one CPU is isolated. Then housekeeping may make use of further coping mechanisms if CPU-tied work must be offloaded.”…””}”(hjOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K'hj>h²hubhï)”}”(hŒdHousekeeping CPUs are the non-isolated CPUs where the kernel noise is moved away from isolated CPUs.”h]”hŒdHousekeeping CPUs are the non-isolated CPUs where the kernel noise is moved away from isolated CPUs.”…””}”(hj]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K.hj>h²hubhï)”}”(hŒVThe isolation can be implemented in several ways depending on the nature of the noise:”h]”hŒVThe isolation can be implemented in several ways depending on the nature of the noise:”…””}”(hjkh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K1hj>h²hubhŒ bullet_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hŒ»Unbound work, where "unbound" means not tied to any CPU, can be simply migrated away from isolated CPUs to housekeeping CPUs. This is the case of unbound workqueues, kthreads and timers. ”h]”hï)”}”(hŒºUnbound work, where "unbound" means not tied to any CPU, can be simply migrated away from isolated CPUs to housekeeping CPUs. This is the case of unbound workqueues, kthreads and timers.”h]”hŒ¾Unbound work, where “unbound†means not tied to any CPU, can be simply migrated away from isolated CPUs to housekeeping CPUs. This is the case of unbound workqueues, kthreads and timers.”…””}”(hj„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K4hj€ubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hj{h²hh³hÇh´Nubj)”}”(hXñBound work, where "bound" means tied to a specific CPU, usually can't be moved away as-is by nature. Either: - The work must switch to a locked implementation. E.g.: This is the case of RCU with CONFIG_RCU_NOCB_CPU. - The related feature must be shut down and considered incompatible with isolated CPUs. E.g.: Lockup watchdog, unreliable clocksources, etc... - An elaborate and heavyweight coping mechanism stands as a replacement. E.g.: the timer tick is shut down on nohz_full CPUs but with the constraint of running a single task on them. A significant cost penalty is added on kernel entry/exit and a residual 1Hz scheduler tick is offloaded to housekeeping CPUs. ”h]”(hï)”}”(hŒlBound work, where "bound" means tied to a specific CPU, usually can't be moved away as-is by nature. Either:”h]”hŒrBound work, where “bound†means tied to a specific CPU, usually can’t be moved away as-is by nature. Either:”…””}”(hjœh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K8hj˜ubhŒ block_quote”“”)”}”(hXA- The work must switch to a locked implementation. E.g.: This is the case of RCU with CONFIG_RCU_NOCB_CPU. - The related feature must be shut down and considered incompatible with isolated CPUs. E.g.: Lockup watchdog, unreliable clocksources, etc... - An elaborate and heavyweight coping mechanism stands as a replacement. E.g.: the timer tick is shut down on nohz_full CPUs but with the constraint of running a single task on them. A significant cost penalty is added on kernel entry/exit and a residual 1Hz scheduler tick is offloaded to housekeeping CPUs. ”h]”jz)”}”(hhh]”(j)”}”(hŒiThe work must switch to a locked implementation. E.g.: This is the case of RCU with CONFIG_RCU_NOCB_CPU. ”h]”hï)”}”(hŒhThe work must switch to a locked implementation. E.g.: This is the case of RCU with CONFIG_RCU_NOCB_CPU.”h]”hŒhThe work must switch to a locked implementation. E.g.: This is the case of RCU with CONFIG_RCU_NOCB_CPU.”…””}”(hj·h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K;hj³ubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hj°ubj)”}”(hŒThe related feature must be shut down and considered incompatible with isolated CPUs. E.g.: Lockup watchdog, unreliable clocksources, etc... ”h]”hï)”}”(hŒŒThe related feature must be shut down and considered incompatible with isolated CPUs. E.g.: Lockup watchdog, unreliable clocksources, etc...”h]”hŒŒThe related feature must be shut down and considered incompatible with isolated CPUs. E.g.: Lockup watchdog, unreliable clocksources, etc...”…””}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K>hjËubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hj°ubj)”}”(hX3An elaborate and heavyweight coping mechanism stands as a replacement. E.g.: the timer tick is shut down on nohz_full CPUs but with the constraint of running a single task on them. A significant cost penalty is added on kernel entry/exit and a residual 1Hz scheduler tick is offloaded to housekeeping CPUs. ”h]”hï)”}”(hX2An elaborate and heavyweight coping mechanism stands as a replacement. E.g.: the timer tick is shut down on nohz_full CPUs but with the constraint of running a single task on them. A significant cost penalty is added on kernel entry/exit and a residual 1Hz scheduler tick is offloaded to housekeeping CPUs.”h]”hX2An elaborate and heavyweight coping mechanism stands as a replacement. E.g.: the timer tick is shut down on nohz_full CPUs but with the constraint of running a single task on them. A significant cost penalty is added on kernel entry/exit and a residual 1Hz scheduler tick is offloaded to housekeeping CPUs.”…””}”(hjçh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KBhjãubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hj°ubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1jyh³hÇh´K;hj¬ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªh³hÇh´K;hj˜ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j~hj{h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jjuh1jyh³hÇh´K4hj>h²hubhï)”}”(hŒÖIn any case, housekeeping work has to be handled, which is why there must be at least one housekeeping CPU in the system, preferably more if the machine runs a lot of CPUs. For example one per node on NUMA systems.”h]”hŒÖIn any case, housekeeping work has to be handled, which is why there must be at least one housekeeping CPU in the system, preferably more if the machine runs a lot of CPUs. For example one per node on NUMA systems.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KIhj>h²hubhï)”}”(hŒ¨Also CPU isolation often means a tradeoff between noise-free isolated CPUs and added overhead on housekeeping CPUs, sometimes even on isolated CPUs entering the kernel.”h]”hŒ¨Also CPU isolation often means a tradeoff between noise-free isolated CPUs and added overhead on housekeeping CPUs, sometimes even on isolated CPUs entering the kernel.”…””}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KNhj>h²hubeh}”(h]”Œ housekeeping”ah ]”h"]”Œ housekeeping”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K%ubhÉ)”}”(hhh]”(hÎ)”}”(hŒIsolation features”h]”hŒIsolation features”…””}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj9h²hh³hÇh´KSubhï)”}”(hŒqDifferent levels of isolation can be configured in the kernel, each of which has its own drawbacks and tradeoffs.”h]”hŒqDifferent levels of isolation can be configured in the kernel, each of which has its own drawbacks and tradeoffs.”…””}”(hjJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KUhj9h²hubhÉ)”}”(hhh]”(hÎ)”}”(hŒScheduler domain isolation”h]”hŒScheduler domain isolation”…””}”(hj[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjXh²hh³hÇh´KYubhï)”}”(hŒ¶This feature isolates a CPU from the scheduler topology. As a result, the target isn't part of the load balancing. Tasks won't migrate either from or to it unless affined explicitly.”h]”hŒºThis feature isolates a CPU from the scheduler topology. As a result, the target isn’t part of the load balancing. Tasks won’t migrate either from or to it unless affined explicitly.”…””}”(hjih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K[hjXh²hubhï)”}”(hŒWAs a side effect the CPU is also isolated from unbound workqueues and unbound kthreads.”h]”hŒWAs a side effect the CPU is also isolated from unbound workqueues and unbound kthreads.”…””}”(hjwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K_hjXh²hubhÉ)”}”(hhh]”(hÎ)”}”(hŒ Requirements”h]”hŒ Requirements”…””}”(hjˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj…h²hh³hÇh´Kcubjz)”}”(hhh]”j)”}”(hŒ1CONFIG_CPUSETS=y for the cpusets-based interface ”h]”hï)”}”(hŒ0CONFIG_CPUSETS=y for the cpusets-based interface”h]”hŒ0CONFIG_CPUSETS=y for the cpusets-based interface”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Kehj™ubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hj–h²hh³hÇh´Nubah}”(h]”h ]”h"]”h$]”h&]”jjuh1jyh³hÇh´Kehj…h²hubeh}”(h]”Œ requirements”ah ]”h"]”h$]”Œ requirements”ah&]”uh1hÈhjXh²hh³hÇh´KcŒ referenced”KubhÉ)”}”(hhh]”(hÎ)”}”(hŒ Tradeoffs”h]”hŒ Tradeoffs”…””}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjÀh²hh³hÇh´Khubhï)”}”(hŒtBy nature, the system load is overall less distributed since some CPUs are extracted from the global load balancing.”h]”hŒtBy nature, the system load is overall less distributed since some CPUs are extracted from the global load balancing.”…””}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KjhjÀh²hubeh}”(h]”Œ tradeoffs”ah ]”h"]”h$]”Œ tradeoffs”ah&]”uh1hÈhjXh²hh³hÇh´Khj¿KubhÉ)”}”(hhh]”(hÎ)”}”(hŒ Interfaces”h]”hŒ Interfaces”…””}”(hjêh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjçh²hh³hÇh´Knubjz)”}”(hhh]”(j)”}”(hŒxDocumentation/admin-guide/cgroup-v2.rst cpuset isolated partitions are recommended because they are tunable at runtime. ”h]”hï)”}”(hŒwDocumentation/admin-guide/cgroup-v2.rst cpuset isolated partitions are recommended because they are tunable at runtime.”h]”hŒwDocumentation/admin-guide/cgroup-v2.rst cpuset isolated partitions are recommended because they are tunable at runtime.”…””}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Kphjûubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hjøh²hh³hÇh´Nubj)”}”(hŒŒThe 'isolcpus=' kernel boot parameter with the 'domain' flag is a less flexible alternative that doesn't allow for runtime reconfiguration. ”h]”hï)”}”(hŒ‹The 'isolcpus=' kernel boot parameter with the 'domain' flag is a less flexible alternative that doesn't allow for runtime reconfiguration.”h]”hŒ•The ‘isolcpus=’ kernel boot parameter with the ‘domain’ flag is a less flexible alternative that doesn’t allow for runtime reconfiguration.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Kshjubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hjøh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jjuh1jyh³hÇh´Kphjçh²hubeh}”(h]”Œ interfaces”ah ]”h"]”h$]”Œ interfaces”ah&]”uh1hÈhjXh²hh³hÇh´Knj¿Kubeh}”(h]”Œscheduler-domain-isolation”ah ]”h"]”Œscheduler domain isolation”ah$]”h&]”uh1hÈhj9h²hh³hÇh´KYubhÉ)”}”(hhh]”(hÎ)”}”(hŒIRQs isolation”h]”hŒIRQs isolation”…””}”(hjDh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjAh²hh³hÇh´Kxubhï)”}”(hŒOIsolate the IRQs whenever possible, so that they don't fire on the target CPUs.”h]”hŒQIsolate the IRQs whenever possible, so that they don’t fire on the target CPUs.”…””}”(hjRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KzhjAh²hubhÉ)”}”(hhh]”(hÎ)”}”(hŒ Interfaces”h]”hŒ Interfaces”…””}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj`h²hh³hÇh´K~ubjz)”}”(hhh]”(j)”}”(hŒoThe file /proc/irq/\*/smp_affinity as explained in detail in Documentation/core-api/irq/irq-affinity.rst page. ”h]”hï)”}”(hŒnThe file /proc/irq/\*/smp_affinity as explained in detail in Documentation/core-api/irq/irq-affinity.rst page.”h]”hŒnThe file /proc/irq/*/smp_affinity as explained in detail in Documentation/core-api/irq/irq-affinity.rst page.”…””}”(hjxh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K€hjtubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hjqh²hh³hÇh´Nubj)”}”(hŒ@The "irqaffinity=" kernel boot parameter for a default setting. ”h]”hï)”}”(hŒ?The "irqaffinity=" kernel boot parameter for a default setting.”h]”hŒCThe “irqaffinity=†kernel boot parameter for a default setting.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KƒhjŒubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hjqh²hh³hÇh´Nubj)”}”(hŒxThe "managed_irq" flag in the "isolcpus=" kernel boot parameter tries a best effort affinity override for managed IRQs. ”h]”hï)”}”(hŒwThe "managed_irq" flag in the "isolcpus=" kernel boot parameter tries a best effort affinity override for managed IRQs.”h]”hŒThe “managed_irq†flag in the “isolcpus=†kernel boot parameter tries a best effort affinity override for managed IRQs.”…””}”(hj¨h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K…hj¤ubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hjqh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jjuh1jyh³hÇh´K€hj`h²hubeh}”(h]”Œid1”ah ]”h"]”h$]”j7ah&]”uh1hÈhjAh²hh³hÇh´K~j¿Kubeh}”(h]”Œirqs-isolation”ah ]”h"]”Œirqs isolation”ah$]”h&]”uh1hÈhj9h²hh³hÇh´KxubhÉ)”}”(hhh]”(hÎ)”}”(hŒFull Dynticks (aka nohz_full)”h]”hŒFull Dynticks (aka nohz_full)”…””}”(hjÔh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjÑh²hh³hÇh´K‰ubhï)”}”(hŒÅFull dynticks extends the dynticks idle mode, which stops the tick when the CPU is idle, to CPUs running a single task in userspace. That is, the timer tick is stopped if the environment allows it.”h]”hŒÅFull dynticks extends the dynticks idle mode, which stops the tick when the CPU is idle, to CPUs running a single task in userspace. That is, the timer tick is stopped if the environment allows it.”…””}”(hjâh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K‹hjÑh²hubhï)”}”(hŒAGlobal timer callbacks are also isolated from the nohz_full CPUs.”h]”hŒAGlobal timer callbacks are also isolated from the nohz_full CPUs.”…””}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KhjÑh²hubhÉ)”}”(hhh]”(hÎ)”}”(hŒ Requirements”h]”hŒ Requirements”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjþh²hh³hÇh´K’ubjz)”}”(hhh]”j)”}”(hŒCONFIG_NO_HZ_FULL=y ”h]”hï)”}”(hŒCONFIG_NO_HZ_FULL=y”h]”hŒCONFIG_NO_HZ_FULL=y”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K”hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hjh²hh³hÇh´Nubah}”(h]”h ]”h"]”h$]”h&]”jjuh1jyh³hÇh´K”hjþh²hubeh}”(h]”Œid2”ah ]”h"]”h$]”j½ah&]”uh1hÈhjÑh²hh³hÇh´K’j¿KubhÉ)”}”(hhh]”(hÎ)”}”(hŒ Constraints”h]”hŒ Constraints”…””}”(hj:h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj7h²hh³hÇh´K—ubjz)”}”(hhh]”(j)”}”(hŒÇThe isolated CPUs must run a single task only. Multitask requires the tick to maintain preemption. This is usually fine since the workload usually can't stand the latency of random context switches. ”h]”hï)”}”(hŒÆThe isolated CPUs must run a single task only. Multitask requires the tick to maintain preemption. This is usually fine since the workload usually can't stand the latency of random context switches.”h]”hŒÈThe isolated CPUs must run a single task only. Multitask requires the tick to maintain preemption. This is usually fine since the workload usually can’t stand the latency of random context switches.”…””}”(hjOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K™hjKubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hjHh²hh³hÇh´Nubj)”}”(hŒRNo call to the kernel from isolated CPUs, at the risk of triggering random noise. ”h]”hï)”}”(hŒQNo call to the kernel from isolated CPUs, at the risk of triggering random noise.”h]”hŒQNo call to the kernel from isolated CPUs, at the risk of triggering random noise.”…””}”(hjgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Khjcubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hjHh²hh³hÇh´Nubj)”}”(hŒ-No use of POSIX CPU timers on isolated CPUs. ”h]”hï)”}”(hŒ,No use of POSIX CPU timers on isolated CPUs.”h]”hŒ,No use of POSIX CPU timers on isolated CPUs.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K hj{ubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hjHh²hh³hÇh´Nubj)”}”(hŒjArchitecture must have a stable and reliable clocksource (no unreliable TSC that requires the watchdog). ”h]”hï)”}”(hŒhArchitecture must have a stable and reliable clocksource (no unreliable TSC that requires the watchdog).”h]”hŒhArchitecture must have a stable and reliable clocksource (no unreliable TSC that requires the watchdog).”…””}”(hj—h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K¢hj“ubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hjHh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jjuh1jyh³hÇh´K™hj7h²hubeh}”(h]”Œ constraints”ah ]”h"]”Œ constraints”ah$]”h&]”uh1hÈhjÑh²hh³hÇh´K—ubhÉ)”}”(hhh]”(hÎ)”}”(hŒ Tradeoffs”h]”hŒ Tradeoffs”…””}”(hj¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj¹h²hh³hÇh´K§ubhï)”}”(hŒÒIn terms of cost, this is the most invasive isolation feature. It is assumed to be used when the workload spends most of its time in userspace and doesn't rely on the kernel except for preparatory work because:”h]”hŒÔIn terms of cost, this is the most invasive isolation feature. It is assumed to be used when the workload spends most of its time in userspace and doesn’t rely on the kernel except for preparatory work because:”…””}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K©hj¹h²hubjz)”}”(hhh]”(j)”}”(hŒ™RCU adds more overhead due to the locked, offloaded and threaded callbacks processing (the same that would be obtained with "rcu_nocbs" boot parameter). ”h]”hï)”}”(hŒ˜RCU adds more overhead due to the locked, offloaded and threaded callbacks processing (the same that would be obtained with "rcu_nocbs" boot parameter).”h]”hŒœRCU adds more overhead due to the locked, offloaded and threaded callbacks processing (the same that would be obtained with “rcu_nocbs†boot parameter).”…””}”(hjßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K®hjÛubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hjØh²hh³hÇh´Nubj)”}”(hXKernel entry/exit through syscalls, exceptions and IRQs are more costly due to fully ordered RmW operations that maintain userspace as RCU extended quiescent state. Also the CPU time is accounted on kernel boundaries instead of periodically from the tick. ”h]”hï)”}”(hŒÿKernel entry/exit through syscalls, exceptions and IRQs are more costly due to fully ordered RmW operations that maintain userspace as RCU extended quiescent state. Also the CPU time is accounted on kernel boundaries instead of periodically from the tick.”h]”hŒÿKernel entry/exit through syscalls, exceptions and IRQs are more costly due to fully ordered RmW operations that maintain userspace as RCU extended quiescent state. Also the CPU time is accounted on kernel boundaries instead of periodically from the tick.”…””}”(hj÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K²hjóubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hjØh²hh³hÇh´Nubj)”}”(hŒ`Housekeeping CPUs must run a 1Hz residual remote scheduler tick on behalf of the isolated CPUs. ”h]”hï)”}”(hŒ_Housekeeping CPUs must run a 1Hz residual remote scheduler tick on behalf of the isolated CPUs.”h]”hŒ_Housekeeping CPUs must run a 1Hz residual remote scheduler tick on behalf of the isolated CPUs.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K·hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hjØh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jjuh1jyh³hÇh´K®hj¹h²hubeh}”(h]”Œid3”ah ]”h"]”h$]”jåah&]”uh1hÈhjÑh²hh³hÇh´K§j¿Kubeh}”(h]”Œfull-dynticks-aka-nohz-full”ah ]”h"]”Œfull dynticks (aka nohz_full)”ah$]”h&]”uh1hÈhj9h²hh³hÇh´K‰ubeh}”(h]”Œisolation-features”ah ]”h"]”Œisolation features”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KSubhÉ)”}”(hhh]”(hÎ)”}”(hŒ Checklist”h]”hŒ Checklist”…””}”(hjCh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj@h²hh³hÇh´K»ubhï)”}”(hŒ¡You have set up each of the above isolation features but you still observe jitters that trash your workload? Make sure to check a few elements before proceeding.”h]”hŒ¡You have set up each of the above isolation features but you still observe jitters that trash your workload? Make sure to check a few elements before proceeding.”…””}”(hjQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K½hj@h²hubhï)”}”(hŒJSome of these checklist items are similar to those of real-time workloads:”h]”hŒJSome of these checklist items are similar to those of real-time workloads:”…””}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KÁhj@h²hubjz)”}”(hhh]”(j)”}”(hŒƒUse mlock() to prevent your pages from being swapped away. Page faults are usually not compatible with jitter sensitive workloads. ”h]”hï)”}”(hŒ‚Use mlock() to prevent your pages from being swapped away. Page faults are usually not compatible with jitter sensitive workloads.”h]”hŒ‚Use mlock() to prevent your pages from being swapped away. Page faults are usually not compatible with jitter sensitive workloads.”…””}”(hjth²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KÄhjpubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hjmh²hh³hÇh´Nubj)”}”(hŒQAvoid SMT to prevent your hardware thread from being "preempted" by another one. ”h]”hï)”}”(hŒPAvoid SMT to prevent your hardware thread from being "preempted" by another one.”h]”hŒTAvoid SMT to prevent your hardware thread from being “preempted†by another one.”…””}”(hjŒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KÇhjˆubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hjmh²hh³hÇh´Nubj)”}”(hŒvCPU frequency changes may induce subtle sorts of jitter in a workload. Cpufreq should be used and tuned with caution. ”h]”hï)”}”(hŒuCPU frequency changes may induce subtle sorts of jitter in a workload. Cpufreq should be used and tuned with caution.”h]”hŒuCPU frequency changes may induce subtle sorts of jitter in a workload. Cpufreq should be used and tuned with caution.”…””}”(hj¤h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KÊhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hjmh²hh³hÇh´Nubj)”}”(hXDeep C-states may result in latency issues upon wake-up. If this happens to be a problem, C-states can be limited via kernel boot parameters such as processor.max_cstate or intel_idle.max_cstate. More finegrained tunings are described in Documentation/admin-guide/pm/cpuidle.rst page ”h]”hï)”}”(hXDeep C-states may result in latency issues upon wake-up. If this happens to be a problem, C-states can be limited via kernel boot parameters such as processor.max_cstate or intel_idle.max_cstate. More finegrained tunings are described in Documentation/admin-guide/pm/cpuidle.rst page”h]”hXDeep C-states may result in latency issues upon wake-up. If this happens to be a problem, C-states can be limited via kernel boot parameters such as processor.max_cstate or intel_idle.max_cstate. More finegrained tunings are described in Documentation/admin-guide/pm/cpuidle.rst page”…””}”(hj¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KÍhj¸ubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hjmh²hh³hÇh´Nubj)”}”(hX Your system may be subject to firmware-originating interrupts - x86 has System Management Interrupts (SMIs) for example. Check your system BIOS to disable such interference, and with some luck your vendor will have a BIOS tuning guidance for low-latency operations. ”h]”hï)”}”(hX Your system may be subject to firmware-originating interrupts - x86 has System Management Interrupts (SMIs) for example. Check your system BIOS to disable such interference, and with some luck your vendor will have a BIOS tuning guidance for low-latency operations.”h]”hX Your system may be subject to firmware-originating interrupts - x86 has System Management Interrupts (SMIs) for example. Check your system BIOS to disable such interference, and with some luck your vendor will have a BIOS tuning guidance for low-latency operations.”…””}”(hjÔh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KÓhjÐubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hjmh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jjuh1jyh³hÇh´KÄhj@h²hubeh}”(h]”Œ checklist”ah ]”h"]”Œ checklist”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K»ubhÉ)”}”(hhh]”(hÎ)”}”(hŒFull isolation example”h]”hŒFull isolation example”…””}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjöh²hh³hÇh´KÚubhï)”}”(hŒzIn this example, the system has 8 CPUs and the 8th is to be fully isolated. Since CPUs start from 0, the 8th CPU is CPU 7.”h]”hŒzIn this example, the system has 8 CPUs and the 8th is to be fully isolated. Since CPUs start from 0, the 8th CPU is CPU 7.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KÜhjöh²hubhÉ)”}”(hhh]”(hÎ)”}”(hŒKernel parameters”h]”hŒKernel parameters”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjh²hh³hÇh´Kàubhï)”}”(hŒYSet the following kernel boot parameters to disable SMT and setup tick and IRQ isolation:”h]”hŒYSet the following kernel boot parameters to disable SMT and setup tick and IRQ isolation:”…””}”(hj&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Kâhjh²hubjz)”}”(hhh]”(j)”}”(hŒFull dynticks: nohz_full=7 ”h]”hï)”}”(hŒFull dynticks: nohz_full=7”h]”hŒFull dynticks: nohz_full=7”…””}”(hj;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Kåhj7ubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hj4h²hh³hÇh´Nubj)”}”(hŒ IRQs isolation: irqaffinity=0-6 ”h]”hï)”}”(hŒIRQs isolation: irqaffinity=0-6”h]”hŒIRQs isolation: irqaffinity=0-6”…””}”(hjSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KçhjOubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hj4h²hh³hÇh´Nubj)”}”(hŒ/Managed IRQs isolation: isolcpus=managed_irq,7 ”h]”hï)”}”(hŒ.Managed IRQs isolation: isolcpus=managed_irq,7”h]”hŒ.Managed IRQs isolation: isolcpus=managed_irq,7”…””}”(hjkh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Kéhjgubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hj4h²hh³hÇh´Nubj)”}”(hŒPrevent SMT: nosmt ”h]”hï)”}”(hŒPrevent SMT: nosmt”h]”hŒPrevent SMT: nosmt”…””}”(hjƒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Këhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hj4h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jjuh1jyh³hÇh´Kåhjh²hubhï)”}”(hŒThe full command line is then:”h]”hŒThe full command line is then:”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Kíhjh²hubj«)”}”(hŒ9nohz_full=7 irqaffinity=0-6 isolcpus=managed_irq,7 nosmt ”h]”hï)”}”(hŒ8nohz_full=7 irqaffinity=0-6 isolcpus=managed_irq,7 nosmt”h]”hŒ8nohz_full=7 irqaffinity=0-6 isolcpus=managed_irq,7 nosmt”…””}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Kïhj«ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªh³hÇh´Kïhjh²hubeh}”(h]”Œkernel-parameters”ah ]”h"]”Œkernel parameters”ah$]”h&]”uh1hÈhjöh²hh³hÇh´KàubhÉ)”}”(hhh]”(hÎ)”}”(hŒ CPUSET configuration (cgroup v2)”h]”hŒ CPUSET configuration (cgroup v2)”…””}”(hjÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjËh²hh³hÇh´Kòubhï)”}”(hŒlAssuming cgroup v2 is mounted to /sys/fs/cgroup, the following script isolates CPU 7 from scheduler domains.”h]”hŒlAssuming cgroup v2 is mounted to /sys/fs/cgroup, the following script isolates CPU 7 from scheduler domains.”…””}”(hjÜh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KôhjËh²hubhŒ literal_block”“”)”}”(hŒÿcd /sys/fs/cgroup # Activate the cpuset subsystem echo +cpuset > cgroup.subtree_control # Create partition to be isolated mkdir test cd test echo +cpuset > cgroup.subtree_control # Isolate CPU 7 echo 7 > cpuset.cpus echo "isolated" > cpuset.cpus.partition”h]”hŒÿcd /sys/fs/cgroup # Activate the cpuset subsystem echo +cpuset > cgroup.subtree_control # Create partition to be isolated mkdir test cd test echo +cpuset > cgroup.subtree_control # Isolate CPU 7 echo 7 > cpuset.cpus echo "isolated" > cpuset.cpus.partition”…””}”hjìsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jêh³hÇh´KùhjËh²hubeh}”(h]”Œcpuset-configuration-cgroup-v2”ah ]”h"]”Œ cpuset configuration (cgroup v2)”ah$]”h&]”uh1hÈhjöh²hh³hÇh´KòubhÉ)”}”(hhh]”(hÎ)”}”(hŒThe userspace workload”h]”hŒThe userspace workload”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjh²hh³hÇh´Mubhï)”}”(hŒdFake a pure userspace workload, the program below runs a dummy userspace loop on the isolated CPU 7.”h]”hŒdFake a pure userspace workload, the program below runs a dummy userspace loop on the isolated CPU 7.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mhjh²hubjë)”}”(hXÇ#include #include #include #include int main(void) { // Move the current task to the isolated cpuset (bind to CPU 7) int fd = open("/sys/fs/cgroup/test/cgroup.procs", O_WRONLY); if (fd < 0) { perror("Can't open cpuset file...\n"); return 0; } write(fd, "0\n", 2); close(fd); // Run an endless dummy loop until the launcher kills us while (1) ; return 0; }”h]”hXÇ#include #include #include #include int main(void) { // Move the current task to the isolated cpuset (bind to CPU 7) int fd = open("/sys/fs/cgroup/test/cgroup.procs", O_WRONLY); if (fd < 0) { perror("Can't open cpuset file...\n"); return 0; } write(fd, "0\n", 2); close(fd); // Run an endless dummy loop until the launcher kills us while (1) ; return 0; }”…””}”hj!sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jêh³hÇh´M hjh²hubhï)”}”(hŒ!Build it and save for later step:”h]”hŒ!Build it and save for later step:”…””}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M#hjh²hubjë)”}”(hŒ# gcc user_loop.c -o user_loop”h]”hŒ# gcc user_loop.c -o user_loop”…””}”hj=sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jêh³hÇh´M'hjh²hubeh}”(h]”Œthe-userspace-workload”ah ]”h"]”Œthe userspace workload”ah$]”h&]”uh1hÈhjöh²hh³hÇh´MubhÉ)”}”(hhh]”(hÎ)”}”(hŒ The launcher”h]”hŒ The launcher”…””}”(hjVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjSh²hh³hÇh´M*ubhï)”}”(hŒwThe below launcher runs the above program for 10 seconds and traces the noise resulting from preempting tasks and IRQs.”h]”hŒwThe below launcher runs the above program for 10 seconds and traces the noise resulting from preempting tasks and IRQs.”…””}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M,hjSh²hubjë)”}”(hXXTRACING=/sys/kernel/tracing/ # Make sure tracing is off for now echo 0 > $TRACING/tracing_on # Flush previous traces echo > $TRACING/trace # Record disturbance from other tasks echo 1 > $TRACING/events/sched/sched_switch/enable # Record disturbance from interrupts echo 1 > $TRACING/events/irq_vectors/enable # Now we can start tracing echo 1 > $TRACING/tracing_on # Run the dummy user_loop for 10 seconds on CPU 7 ./user_loop & USER_LOOP_PID=$! sleep 10 kill $USER_LOOP_PID # Disable tracing and save traces from CPU 7 in a file echo 0 > $TRACING/tracing_on cat $TRACING/per_cpu/cpu7/trace > trace.7”h]”hXXTRACING=/sys/kernel/tracing/ # Make sure tracing is off for now echo 0 > $TRACING/tracing_on # Flush previous traces echo > $TRACING/trace # Record disturbance from other tasks echo 1 > $TRACING/events/sched/sched_switch/enable # Record disturbance from interrupts echo 1 > $TRACING/events/irq_vectors/enable # Now we can start tracing echo 1 > $TRACING/tracing_on # Run the dummy user_loop for 10 seconds on CPU 7 ./user_loop & USER_LOOP_PID=$! sleep 10 kill $USER_LOOP_PID # Disable tracing and save traces from CPU 7 in a file echo 0 > $TRACING/tracing_on cat $TRACING/per_cpu/cpu7/trace > trace.7”…””}”hjrsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jêh³hÇh´M1hjSh²hubhï)”}”(hŒSIf no specific problem arose, the output of trace.7 should look like the following:”h]”hŒSIf no specific problem arose, the output of trace.7 should look like the following:”…””}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MEhjSh²hubjë)”}”(hX&-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 user_loop-1553 [007] d.h.. 1990.946593: reschedule_entry: vector=253 user_loop-1553 [007] d.h.. 1990.946593: reschedule_exit: vector=253”h]”hX&-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 user_loop-1553 [007] d.h.. 1990.946593: reschedule_entry: vector=253 user_loop-1553 [007] d.h.. 1990.946593: reschedule_exit: vector=253”…””}”hjŽsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jêh³hÇh´MJhjSh²hubhï)”}”(hŒyThat is, no specific noise triggered between the first trace and the second during 10 seconds when user_loop was running.”h]”hŒyThat is, no specific noise triggered between the first trace and the second during 10 seconds when user_loop was running.”…””}”(hjœh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MNhjSh²hubeh}”(h]”Œ the-launcher”ah ]”h"]”Œ the launcher”ah$]”h&]”uh1hÈhjöh²hh³hÇh´M*ubeh}”(h]”Œfull-isolation-example”ah ]”h"]”Œfull isolation example”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KÚubhÉ)”}”(hhh]”(hÎ)”}”(hŒ Debugging”h]”hŒ Debugging”…””}”(hj½h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjºh²hh³hÇh´MRubhï)”}”(hŒ‘Of course things are never so easy, especially on this matter. Chances are that actual noise will be observed in the aforementioned trace.7 file.”h]”hŒ‘Of course things are never so easy, especially on this matter. Chances are that actual noise will be observed in the aforementioned trace.7 file.”…””}”(hjËh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MThjºh²hubhï)”}”(hXThe best way to investigate further is to enable finer grained tracepoints such as those of subsystems producing asynchronous events: workqueue, timer, irq_vector, etc... It also can be interesting to enable the tick_stop event to diagnose why the tick is retained when that happens.”h]”hXThe best way to investigate further is to enable finer grained tracepoints such as those of subsystems producing asynchronous events: workqueue, timer, irq_vector, etc... It also can be interesting to enable the tick_stop event to diagnose why the tick is retained when that happens.”…””}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MXhjºh²hubhï)”}”(hŒ8Some tools may also be useful for higher level analysis:”h]”hŒ8Some tools may also be useful for higher level analysis:”…””}”(hjçh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M^hjºh²hubjz)”}”(hhh]”(j)”}”(hŒåDocumentation/tools/rtla/rtla.rst provides a suite of tools to analyze latency and noise in the system. For example Documentation/tools/rtla/rtla-osnoise.rst runs a kernel tracer that analyzes and output a summary of the noises. ”h]”hï)”}”(hŒäDocumentation/tools/rtla/rtla.rst provides a suite of tools to analyze latency and noise in the system. For example Documentation/tools/rtla/rtla-osnoise.rst runs a kernel tracer that analyzes and output a summary of the noises.”h]”hŒäDocumentation/tools/rtla/rtla.rst provides a suite of tools to analyze latency and noise in the system. For example Documentation/tools/rtla/rtla-osnoise.rst runs a kernel tracer that analyzes and output a summary of the noises.”…””}”(hjüh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M`hjøubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hjõh²hh³hÇh´Nubj)”}”(hŒ¨dynticks-testing does something similar to rtla-osnoise but in userspace. It is available at git://git.kernel.org/pub/scm/linux/kernel/git/frederic/dynticks-testing.git”h]”hï)”}”(hŒ¨dynticks-testing does something similar to rtla-osnoise but in userspace. It is available at git://git.kernel.org/pub/scm/linux/kernel/git/frederic/dynticks-testing.git”h]”hŒ¨dynticks-testing does something similar to rtla-osnoise but in userspace. It is available at git://git.kernel.org/pub/scm/linux/kernel/git/frederic/dynticks-testing.git”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mdhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hjõh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jjuh1jyh³hÇh´M`hjºh²hubeh}”(h]”Œ debugging”ah ]”h"]”Œ debugging”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´MRubeh}”(h]”Œ cpu-isolation”ah ]”h"]”Œ cpu isolation”ah$]”h&]”uh1hÈhhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(hÍNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jaŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(j;j8j;j8j6j3j=j:j>j;Œ requirements”NŒ tradeoffs”NŒ interfaces”NjÎjËj5j2j¶j³jójðj·j´jÈjÅjÿjüjPjMj¯j¬j3j0uŒ nametypes”}”(j;‰j;‰j6‰j=‰j>‰j¥‰j¦‰j§‰jΉj5‰j¶‰jó‰j·‰jȉjÿ‰jP‰j¯‰j3‰uh}”(j8hÊj8hÝj3j>j:j9j;jXj¹j…jájÀj3jçjËjAjÄj`j2jÑj2jþj³j7j+j¹jðj@j´jöjÅjjüjËjMjj¬jSj0jºuŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”joKs…”R”Œparse_messages”]”(hŒsystem_message”“”)”}”(hhh]”hï)”}”(hŒ-Duplicate implicit target name: "interfaces".”h]”hŒ1Duplicate implicit target name: “interfacesâ€.”…””}”(hjËh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîhjÈubah}”(h]”h ]”h"]”h$]”h&]”jÄaŒlevel”KŒtype”ŒINFO”Œsource”hÇŒline”K~uh1jÆhj`h²hh³hÇh´K~ubjÇ)”}”(hhh]”hï)”}”(hŒ/Duplicate implicit target name: "requirements".”h]”hŒ3Duplicate implicit target name: “requirementsâ€.”…””}”(hjçh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîhjäubah}”(h]”h ]”h"]”h$]”h&]”j2aŒlevel”KŒtype”jáŒsource”hÇŒline”K’uh1jÆhjþh²hh³hÇh´K’ubjÇ)”}”(hhh]”hï)”}”(hŒ,Duplicate implicit target name: "tradeoffs".”h]”hŒ0Duplicate implicit target name: “tradeoffsâ€.”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîhjÿubah}”(h]”h ]”h"]”h$]”h&]”j+aŒlevel”KŒtype”jáŒsource”hÇŒline”K§uh1jÆhj¹h²hh³hÇh´K§ubeŒtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.