第 9 章 RHEL for Real Time 中的关联性
在实时中,系统中的每个线程和中断源都有一个处理器关联性属性。操作系统调度程序使用此信息来确定在哪些 CPU 上运行哪些线程和中断。
实时的 Affinity 以位掩码表示,掩码中的每个位代表一个 CPU 内核。如果位设置为 1,则线程或中断可在该内核上运行;如果 0,线程或中断将排除在核心上运行。关联性位掩码的默认值为所有,这意味着线程或中断可以在系统的任意核心上运行。
默认情况下,进程可以在任何 CPU 上运行。但是,可以通过更改进程的关联性,指示进程在预先确定的 CPU 上运行。子进程继承其父进程的 CPU 相关性。
一些更典型的关联性设置包括:
- 为所有系统进程保留一个 CPU 内核,并允许应用程序在内核的其余部分上运行。
-
在同一 CPU 上允许线程应用程序和给定内核线程(如网络
softirq
或驱动程序线程)。 - 对每个 CPU 上的生成者和消费者线程配对。
关联性设置必须与程序结合使用,以获得良好的预期行为。
9.1. 处理器关联性
在实时中,进程默认可在任何 CPU 上运行。但是,您可以通过更改进程的关联性,将进程配置为在预先确定的 CPU 上运行。子进程继承其父进程的 CPU 相关性。
在系统上调优关联性的实时做法是确定运行应用程序所需的内核数,然后隔离这些内核。这可以通过 Tuna 工具或 shell 脚本修改 bitmask 值来实现。
taskset
命令可用于更改进程的关联性,并修改 /proc/
文件系统条目会更改中断的关联性。使用带有 a -p
or- pid 选项和
进程的进程标识符(PID)的 taskset
命令,检查进程的关联性。
-c
or -cpu-list
选项显示内核的数字列表,而不是显示为位掩码。可以通过指定要绑定特定进程的 CPU 数量来设置关联性。例如,对于之前使用 CPU 0 或 CPU 1 的进程,您可以更改关联性,使其只能在 CPU 1 上运行。除了 taskset
命令外,您还可以使用 sched_setaffinity ()
系统调用来设置处理器关联性。