第 13 章 在 RHEL for Real Time 中设置 CPU 关联性
系统中的所有线程和中断源都具有处理器关联属性。操作系统调度程序使用此信息来确定要在 CPU 上运行的线程和中断。设置处理器关联以及有效策略和优先级设置可达到最大可能的性能。应用程序总是竞争资源,特别是 CPU 时间,与其他进程。根据应用程序,相关的线程通常会在同一内核上运行。另外,也可将一个应用程序线程分配给一个内核。
执行多任务处理的系统通常更容易地造成破坏。即使高优先级应用程序也可能延迟执行,较低优先级应用程序位于代码的关键部分。在低优先级应用程序退出关键部分后,内核会安全地抢占低优先级应用程序,并在处理器上调度高优先级应用程序。另外,由于缓存无效,将进程从一个 CPU 迁移到另一个 CPU 可能很昂贵。RHEL for Real Time 包括解决其中一些问题的工具,并允许更好地控制延迟。
关联性以位掩码表示,掩码中的每个位代表 CPU 内核。如果位设置为 1,则线程或中断可以在该内核上运行;如果 0,则线程或中断将排除在核心上运行。关联性位掩码的默认值为 all,这意味着线程或中断可在系统中的任何内核上运行。
默认情况下,进程可以在任何 CPU 上运行。但是,通过更改进程的关联性,您可以定义一个在一组预先确定的 CPU 上运行的进程。子进程继承其父进程的 CPU 相关性。
设置以下典型的关联性设置可实现最大可能的性能:
- 为所有系统进程使用单个 CPU 核心,并将应用程序设置为在内核的其余部分中运行。
- 在同一 CPU 中配置线程应用程序和特定内核线程(网络 softirq 或驱动程序线程)。
- 对每个 CPU 上的 producer-consumer 线程进行对。制作者和消费者是两类线程,生产者将数据插入到缓冲区中,并且消费者将其从缓冲区中删除。
在实时系统中调整相关合并的常见做法是确定运行应用程序所需的内核数,然后隔离这些内核。您可以使用 Tuna 工具或使用 shell 脚本修改位掩码值来达到此目的,如 taskset
命令。taskset
命令更改进程的关联性,修改 /proc/
文件系统条目会更改中断的关联性。
13.1. 使用 taskset
命令调整处理器关联性
实时,taskset
命令有助于设置或检索正在运行的进程的 CPU 关联性。taskset
命令采用 -p
和 -c
选项。-p
或 --pid
选项会处理现有的进程,且不会启动新任务。-c
或 --cpu-list
指定了一个处理器数列表,而不是一个位掩码。这个列表可以包含多个项目,用逗号分开,以及一系列处理器。例如: 0,5,7,9-11。
先决条件
- 有 root 权限。
流程
检查特定进程的进程关联性:
# taskset -p -c 1000 pid 1000’s current affinity list: 0,1
该命令打印 PID 为 1000 的进程的关联性。进程配置为使用 CPU 0 或 CPU 1。
(可选)要配置特定 CPU 来绑定进程:
# taskset -p -c 1 1000 pid 1000’s current affinity list: 0,1 pid 1000’s new affinity list: 1
(可选)要定义多个 CPU 关联性:
# taskset -p -c 0,1 1000 pid 1000’s current affinity list: 1 pid 1000’s new affinity list: 0,1
(可选)在特定 CPU 上配置优先级级别和策略:
# taskset -c 5 chrt -f 78 /bin/my-app
如需进一步粒度,您还可以指定优先级和策略。在示例中,命令使用
SCHED_FIFO
策略在 CPU 5 上运行/bin/my-app
应用,优先级值为 78。