User Tools

Site Tools


realtime:documentation:howto:tools:cpu-partitioning:start

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
realtime:documentation:howto:tools:cpu-partitioning:start [2024/05/27 14:17]
alison [Realtime application best practices]
realtime:documentation:howto:tools:cpu-partitioning:start [2024/07/28 15:49] (current)
alison [Softirqs and kthreads] improve hyperlink
Line 88: Line 88:
 Softirqs are kernel threads which are often challenging to manage on realtime systems. ​ Softirqs may run in atomic context immediately following a hard IRQ which "​raises"​ them, or they may be executed in process context by per-CPU kernel threads called //​ksoftirqd/​n//,​ where //n// is the core number. ​  There are 10 kinds of softirqs which perform diverse tasks for the networking, block, scheduling, timer and [[https://​wiki.linuxfoundation.org/​realtime/​documentation/​technical_details/​rcu|RCU]] subsystems as well as executing callbacks for a large number of device drivers via the tasklet mechanism. ​  Only one softirq of any kind may be active at any given time on a core.   Thus if ksoftirqd is preempted by a hard IRQ, the associated soft interrupt is disabled from following it immediately,​ and must wait for ksoftirqd. ​  This unfortunate situation has been called "the new Big Kernel Lock" by realtime Linux maintainers. Softirqs are kernel threads which are often challenging to manage on realtime systems. ​ Softirqs may run in atomic context immediately following a hard IRQ which "​raises"​ them, or they may be executed in process context by per-CPU kernel threads called //​ksoftirqd/​n//,​ where //n// is the core number. ​  There are 10 kinds of softirqs which perform diverse tasks for the networking, block, scheduling, timer and [[https://​wiki.linuxfoundation.org/​realtime/​documentation/​technical_details/​rcu|RCU]] subsystems as well as executing callbacks for a large number of device drivers via the tasklet mechanism. ​  Only one softirq of any kind may be active at any given time on a core.   Thus if ksoftirqd is preempted by a hard IRQ, the associated soft interrupt is disabled from following it immediately,​ and must wait for ksoftirqd. ​  This unfortunate situation has been called "the new Big Kernel Lock" by realtime Linux maintainers.
  
-Kernel configuration allows system managers to move the NET_RX and RCU callbacks out of softirqs and into their own kthreads. ​ Since kernel 5.12, moving the NET_RX into its own kthread is possible by //​echo//​-ing '​1'​ into the //​threaded//​ sysfs attribute associated with a network device. ​ The process table will afterwards include a new kthread called //​napi/​xxx//,​ where xxx is the interface name. [Read more about the [[https://​wiki.linuxfoundation.org/​networking/​napi?s[]=napi|NAPI]] mechanism in the networking wiki.] ​ Userspace may employ //taskset// to pin this kthread on any core.   ​Moving the softirq into its own kthread incurs a context-switch penalty, but even so may be worthwhile on systems where bursts of network traffic unacceptably delay applications. ​  ​[[https://​wiki.linuxfoundation.org/​realtime/​documentation/​technical_details/​rcu?​s[]=rcu#​rcu_callback_offloading|RCU Callback Offloading]] produces a new set of kthreads, and can be accomplished via a combination of compile-time configuration with boot-time command-line parameters. +Kernel configuration allows system managers to move the NET_RX and RCU callbacks out of softirqs and into their own kthreads. ​ Since kernel 5.12, moving the NET_RX into its own kthread is possible by //​echo//​-ing '​1'​ into the //​threaded//​ sysfs attribute associated with a network device. ​ The process table will afterwards include a new kthread called //​napi/​xxx//,​ where xxx is the interface name. [Read more about the [[https://​wiki.linuxfoundation.org/​networking/​napi|NAPI]] mechanism in the networking wiki.] ​ Userspace may employ //taskset// to pin this kthread on any core.   ​Moving the softirq into its own kthread incurs a context-switch penalty, but even so may be worthwhile on systems where bursts of network traffic unacceptably delay applications. ​  ​[[https://​wiki.linuxfoundation.org/​realtime/​documentation/​technical_details/​rcu|RCU Callback Offloading]] produces a new set of kthreads, and can be accomplished via a combination of compile-time configuration with boot-time command-line parameters.
-===== Realtime application best practices ===== +
- +
-Multithreaded applications which rely on glibc'​s libpthread are prone to unexpected latency delays since pthread condition variables do not honor priority inheritance ([[https://​sourceware.org/​bugzilla/​show_bug.cgi?​id=11588|bugzilla]]). [[https://​github.com/​dvhart/​librtpi|librtpi]] is an alternative LGPL-licensed pthread implementation which supports priority inheritance,​ and whose API as close to glibc'​s as possible. ​ The alternative [[https://​www.musl-libc.org/​|MUSL libc]] has a pthread condition variable implementation similar to glibc'​s. +
  
realtime/documentation/howto/tools/cpu-partitioning/start.1716819428.txt.gz · Last modified: 2024/05/27 14:17 by alison