为什么在多处理器中,所有CPU的利用率都不均衡?
我刚刚开始研究多核架构,心里有个问题。 我有一个测试应用程序,它以线程数为参数,创建那些线程,设置关联(借助sched_setaffinity),然后在每个线程任务中都有一个忙循环(while(1))。 我使用的是带有4个处理器的Fedora19虚拟机(3.11.9-200.fc19.x86_64)。现在,当我创建4个线程时,将它们的关联性设置为4个不同的处理器,CPU利用率是不均匀的。 就像, PID用户PR NI VIRT RES SHR S%CPU%MEM TIME+命令 2113根20 0 0 0 R 92.90 0.000 18:22.91多重试验 2114根20 0 0 0 R 92.23 0.000 18:07.29多次复测 2112根20 0 0 0 R 49.28 0.000 9:41.48多重试验 2111根20 0 0 0 R 48.61 0.000 9:42.17多重测 2110根20 0 0 0 0 Z 0.000 0.000 0:00.00多次重复试验 有谁能给我一个解释,为什么第三个和第四个内核没有前两个内核那么忙,尽管它们有相同的线程功能 这真的很有帮助为什么在多处理器中,所有CPU的利用率都不均衡?,c,linux,multiprocessing,C,Linux,Multiprocessing,我刚刚开始研究多核架构,心里有个问题。 我有一个测试应用程序,它以线程数为参数,创建那些线程,设置关联(借助sched_setaffinity),然后在每个线程任务中都有一个忙循环(while(1))。 我使用的是带有4个处理器的Fedora19虚拟机(3.11.9-200.fc19.x86_64)。现在,当我创建4个线程时,将它们的关联性设置为4个不同的处理器,CPU利用率是不均匀的。 就像, PID用户PR NI VIRT RES SHR S%CPU%MEM TIME+命令 2113根20
谢谢我至少可以想出几个可能的原因来解释这种行为:
- 您的程序不是唯一执行的程序。任何其他程序以及操作系统本身都使用处理器,这可能不允许您的程序充分利用可用的CPU电源。即使设置了CPU相关性,进程调度器仍然会影响线程可用的CPU时间
- CPU核心是虚拟的,因此不是完全独立的。例如,英特尔处理器共享其大部分物理逻辑网络。由于您的任务都非常简单且完全相同,因此在同一物理核心上执行的线程将争夺其资源
lscpu
命令的输出吗?在这种情况下,这些看起来非常适合。在更复杂的系统中,如果没有简单的任务作为核心或超线程核心运行在相同数量的线程上,则需要了解如何运行。现代系统在同一个处理器上遍历指令,找到依赖项并对齐这些指令。此外,有些系统会同时处理分支的两个结果,以便在分支未按预期进行时不会浪费时间。无论哪种方式,特卡拉的评论都可能适用于给定的情况。