第 11 章 在 RHEL for Real Time 上设置 CPU 关联性
系统中的所有线程和中断源都有一个处理器关联性属性。操作系统调度程序使用此信息来确定要在 CPU 上运行的线程和中断。通过设置处理器关联性以及有效的策略和优先级设置,您可以实现最大可能的性能。应用程序始终与其他进程竞争资源(特别是 CPU 时间)。根据应用程序,相关的线程通常在同一核心上运行。或者,可以将一个应用程序线程分配给一个内核。
执行多任务的系统容易容易出错。当较低优先级的应用程序位于代码的关键部分时,即使高优先级的应用程序也会延迟执行。在低优先级应用程序退出 critical 部分后,内核可以安全地抢占低优先级应用程序,并在处理器上调度高优先级应用程序。另外,因为缓存无效,将进程从一个 CPU 迁移到另一个 CPU 可能会昂贵。RHEL for Real Time 包括解决其中一些问题的工具,并允许更好地控制延迟。
关联性表示为位掩码,掩码中的每个位代表一个 CPU 内核。如果位设置为 1,则线程或中断在该内核上运行;如果 0,则线程或中断将排除在核心上运行。关联性位掩码的默认值为 all,这意味着线程或中断可以在系统的任何核心上运行。
默认情况下,进程可以在任何 CPU 上运行。但是,通过更改进程的关联性,您可以定义要在预先确定的 CPU 集合上运行的进程。子进程继承其父进程的 CPU 相关性。
设置以下典型的关联性设置可达到最大可能的性能:
- 将单个 CPU 内核用于所有系统进程,并将应用程序设置为在内核的其余部分上运行。
-
在同一 CPU 中配置线程应用程序和特定内核线程,如 network
softirq或驱动程序线程。 - 对每个 CPU 上的 producer-consumer 线程配对。生产者和消费者是两类线程,生产者将数据插入到缓冲区中,消费者将其从缓冲区中删除。
在实时系统上调优关联性的常见做法是确定运行应用程序所需的内核数,然后隔离这些内核。您可以使用 Tuna 工具或使用 shell 脚本修改位掩码值(如 taskset 命令)来达到此目的。taskset 命令更改进程的关联性,并修改 /proc/ 文件系统条目会更改中断的关联性。
11.1. 使用 taskset 命令调整处理器关联性 复制链接链接已复制到粘贴板!
在实时,taskset 命令有助于设置或检索正在运行的进程的 CPU 关联性。taskset 命令采用 -p 和 -c 选项。The -p or-pid 选项可处理现有进程,且不会启动新的任务。-c or --cpu-list 指定处理器的数字列表,而不是 bitmask。列表中可以包含多个项目,用逗号分开,以及一系列处理器。例如: 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。