【问题标题】:equally busy cpu cores同样繁忙的 CPU 内核
【发布时间】:2015-03-16 18:30:21
【问题描述】:

我最近在运行计算密集型 python 程序(无线程)时意识到,在 Windows (Win8.1 x64) 下,没有一个 CPU 核心(我的 4 个逻辑核心、2 个物理核心)被完全占用,而是每个逻辑核心都被完全占用忙了约 25%。总而言之,这对应于一个核心 100% 繁忙。 Windows 是否分散了任务,但不是很好?这有什么关系,让核心尽可能冷吗?或者它与Python有关?我在 linux 下运行相同的程序,这里发生了我所期望的(一个核心 100% 忙)

【问题讨论】:

  • 您可以尝试为您的进程设置处理器亲和性吗? Here are instructions 如何在 Windows 7 中执行此操作。在 8.1 中,您必须转到“详细信息”选项卡(现在无法给您屏幕截图,因为我只能访问德语本地化的 Win 8.1)。如果将关联设置为仅 1 个 CPU,则行为应该会改变。如果不是,那么奇怪的事情正在发生。但一般来说,不管它有什么原因,让你的操作系统的调度程序不管它的工作,让它自己工作。
  • 是的,现在只有一个 CPU 100% 忙。此外,当我将任务优先级设置为实时(“Echttzeit”,我也是德国人)时,只有一个核心(但这次,半秒内使用了另一个核心,然后再次切换核心。我是只是困惑,这究竟是如何工作的,为什么Windows会这样做。我认为,Windows是一个接一个地强调核心,使每个核心的温度尽可能低,然后切换到下一个核心。但这些变化是为了为任务管理器快速解散。

标签: python windows cpu


【解决方案1】:

您在 Windows 中观察到的实际上是人们对交互式 CPU 调度程序(无论是 Windows 还是 Linux,其他 Unix 变体或 macOS)的默认行为所期望的。

当您执行线程时,操作系统会不断发送定时中断(时钟中断),这会将 CPU 内核的控制权从用户空间(您正在运行的应用程序)带回内核空间(运行进程的操作系统)这使操作系统能够在其他进程拥有“CPU pie”的份额之后重新安排进程在相同(或其他)CPU 内核上运行。如果只有您的进程是主要的 CPU 使用者,原则上也会发生这种情况(除了您的进程之外,通常总会有其他进程在后台运行)

这种行为是交互式调度模式的一个非常重要的特性(这是当今大多数操作系统的默认设置,因为它们是交互式的......)因为它允许所有正在运行的进程获得 CPU 资源的一部分没有挨饿他们中的任何一个。这允许每个运行的进程通过在它们之间共享整个 CPU 资源来“感觉”交互,而不是让“CPU hogs”占用 CPU 而不将其归还。

现在,话虽如此,您可以调整该行为。例如,就像您通过将进程的亲和性设置为单个核心或将“实时”优先级设置为进程所做的那样。

它们中的任何一个都会导致进程继续在同一个核心上运行(亲和力很简单,您要求操作系统仅在 1 个核心上运行它)。 实时只是停止中断该过程。它使您的机器交互性降低,但也停止中断正在运行的进程,因此它继续在它开始运行的同一个内核上运行。

现在,关于您在 Linux 上指定的行为。我认为这是以下两种解释之一:

  1. 您在不知不觉中安排进程在 SCHED_FIFO 上运行(这相当于 Windows 的“实时”)

    为了验证它,使用你的进程的PID并执行

    chrt -p <your process PID>
    
  2. 您误解了某些工具,该工具显示进程好像在单个内核上运行,而实际上它分布在所有内核上。

如果您能详细说明您是如何得出在 Linux 中它可以在所有内核上运行的结论,我将非常高兴。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    相关资源
    最近更新 更多