是否有任何方法(Linux 内核选项、sysctl 设置或可配置调度程序模块)可以导致高优先级进程/线程在物理处理器核心上运行,而第二个(超线程)虚拟核心未调度,以便最大限度地提高单线程性能(通过防止竞争情况、不共享 L1 缓存以及可能使用最大 cpu 时钟(Turbo Boost),同时在具有较低 cpu 时钟的其他物理核心的两个虚拟核心上运行较低优先级的进程/线程,以最大化总时钟系统吞吐量 ?
换句话说:是否可以根据优先级动态禁用超线程?
如果有任何 CPU 使用进程/线程优先级来决定超线程核心上的两个线程中的哪一个在竞争情况下可以首先取得进展,Linux 内核是否能够调度高优先级进程/线程,以便它们仅与优先级非常低的进程/线程共享物理核心,以尽量减少它们对其他线程的影响?
当高优先级进程处于睡眠状态时,其前一个物理核心的两个虚拟核心应再次可供较低优先级进程使用,这使得taskset
从所有其他进程的 CPU 亲和性掩码中排除一个物理核心是不合适的。
编辑:随着桤木湖处理器凭借其性能和高效核心的混合架构,这个问题扩展到:
如何将低优先级进程强制转移到高效核心并使性能核心保持空闲状态(以节省电量)或为高优先级进程保留(以保留热预算,以最大限度地提高性能)涡轮增压)?
答案1
- 您确切想要的(特别是OP评论中讨论的内容)需要与任务切换同步地上线/离线一些核心=>只有调度程序可以做到这一点。
- 可用于运行由调度程序调度的任务的核心集是对调度程序的约束。 (即调度程序无法控制关于 CFS、BFS 和 ULE 的 AFAIK)
因此没有办法实现确切地你想要什么。
然而,由于一些独立的内核设施,有一些可能性会发生这种情况,但是,天下没有免费的午餐,其成本取决于以高优先级运行的应用程序。
一个想法是编写一个专用脚本来启动这些应用程序,特殊脚本将:
1/ 将不受欢迎的兄弟姐妹下线
好的,这假设你知道身体的将运行任务的核心,假设是 cpu2。但你一定知道它是哪一个。阅读§2。
这可以通过写入 0 来实现/sys/devices/system/cpu/cpu3/online
2/ 设置进程的CPU亲和性
当您编写它时,您的首要目标是尽可能多地保留 L1 缓存。如果您非常关心 L1 缓存,那么您不希望根据调度程序基于公平共享的决定随时将任务迁移到另一个核心。
这可以通过多种方式来实现,出于您将在第 3 节中发现的原因,我更愿意诉诸于调度工具及其 -a 选项,承认需要 cpu2 :
schedtool -a 0x4 -e yourapp_name yourapp_parms
3/ 设置进程的调度策略和优先级
调度任务 SCHED_FIFO 将有很大帮助,因为没有时间片仅当要运行更高优先级的任务或阻塞时,该任务才会被调度。
有多种方法可以实现此目的,schedtool
使用 -F 和 -p 选项:
schedtool -F -p 5 -e yourapp_name yourapp_parms
我更喜欢schedtool
,因为您可以将关联设置和调度策略设置合并到单个命令中:
schedtool -a 0x04 -F -p 5 -e yourapp_name yourapp_parms
小心处理:您进入实时任务的世界……所以……您知道自己在做什么。特别是......如果您的任务是 CPU 密集型的,您知道您必须关心系统上运行 SCHED_FIFO 的其他任务的相对优先级,并且当然要意识到有时让其他内核运行其他 SCHED_FIFO CPU-Bound 任务的极端荒谬……
4/ 任务完成后重新插入最初离线的同级
这可以通过写入 1 来实现/sys/devices/system/cpu/cpu3/online
局限性
按照这种方法,您将了解,只有当您的特权任务终止时,同级任务才可供调度程序使用。
虽然如果运行 CPU 密集型任务 SCHED_FIFO 的话这不是问题(因为它永远不会或很少被调度),但如果特权任务实际上是 IO 密集型的,那么它很可能会显得有害(从整体性能的角度来看)。
因为在这种情况下,特权任务将(正确地)被调度出去,而另一个任务将占用 CPU(可能会擦除您亲爱的 L1 缓存),而同级任务将保持离线状态。在整个等待的时间里。
因此,像往常一样,只有在典型工作负载下对系统进行基准测试才能判断此方法是否确实具有任何显着优势。