【问题标题】:Programmatically disable CPU core以编程方式禁用 CPU 内核
【发布时间】:2017-12-08 00:43:56
【问题描述】:

众所周知,在 Linux 中禁用逻辑 CPU 的方法基本上是使用 echo 0 > /sys/devices/system/cpu/cpu<number>/online。这样,您只是告诉操作系统忽略给定的 (<number>) CPU。

我的问题更进一步,是否不仅可以忽略它,还可以通过物理方式将其关闭?我希望那个 CPU 不接收任何功率,以使其能耗为零。

我知道可以从 BIOS 禁用内核(并非总是如此),但我想知道是否可以在某个程序中执行此操作。

【问题讨论】:

  • 这不是 SMP 架构的常见或标准功能。
  • @n.m.这是否意味着在 NUMA 架构中是可能的?我没有说任何关于 SMP 架构的事情,我不知道它是否相关
  • 在任何特定的 CPU/机器型号上,硬件为单个内核或其他组件打开或关闭电源可能存在也可能不存在。我最初认为这个特性完全是非标准的,但显然 Linux 最近开始为其提供标准化接口。谷歌 linux 电源域
  • 您的电路板设计为您可以完全关闭一个内核/芯片的电源而让电路板的其余部分保持正常运行?您为此使用什么设备以及它们如何连接到其他处理器(如果您关闭自己,则无法重新打开自己,因此这需要连接到单独的东西,除非它被设计为关闭仅不是回到事情上)。

标签: linux hardware multicore processor hardware-programming


【解决方案1】:

AFAIK 目前没有可用的系统调用或库函数。甚至 ioctl 实现。所以除了创建新的模块/系统调用之外,我还能想到两种方法:

  1. 使用 ASM asm(<assembly code>); 其中汇编代码是特定于体系结构的 asm 代码来修改 cpu 标志。

  2. c 中的系统调用 (man 3 system)。假设你只是想通过 c 来做。

【讨论】:

  • 更新:- 使用 ASM 我们可以停止特定的 CPU,但内核不会知道。因此,它可能会导致复杂性,因为内核(调度程序)假设 CPU 正在工作,因此目前除了echo > 0 /sys/devices/system/cpu/cpu<number>/online 之外没有办法通知 CPU 我们希望停止该 CPU。
【解决方案2】:

您可以通过使用像 cpufreq 这样的调控器来接近这一点。让 Linux 排除 CPU 和省电模式将确保内核以最低频率运行。

【讨论】:

    【解决方案3】:

    当您执行echo 0 > /sys/devices/system/cpu/cpu<number>/online 时,接下来会发生什么取决于特定的 CPU。在 ARM 嵌入式系统上,内核通常会禁用驱动特定内核 PLL 的时钟,因此您可以有效地得到您想要的。

    在 Intel X86 系统上,您只能禁用中断并调用 hlt 指令(Linux 内核会这样做)。这有效地将 CPU 置于省电状态,直到它被另一个 CPU 应用户请求唤醒。如果您有一台笔记本电脑,您可以通过从/sys/class/power_supply/BAT{0,1}/current_now(或uevent 读取所有值,如电压)或使用“powertop”实用程序来验证禁用内核时功耗确实下降。

    例如,下面是在 Linux 内核中为 Intel CPU 禁用 CPU 内核的调用链。 https://github.com/torvalds/linux/blob/master/drivers/cpufreq/intel_pstate.c

    arch/x86/kernel/smp.c:smp_ops.play_dead = native_play_dead,

    arch/x86/kernel/smpboot.c : native_play_dead() -> play_dead_common() -> local_irq_disable()

    在此之前,CPUFREQ 还会在禁用它之前将 CPU 设置为最低功耗级别,尽管这似乎不是绝对必要的。

    intel_pstate_stop_cpu -> intel_cpufreq_stop_cpu -> intel_pstate_set_min_pstate -> intel_pstate_set_pstate -> wrmsrl_on_cpu(cpu->cpu, MSR_IA32_PERF_CTL, pstate_funcs.get_val(cpu, pstate));

    在 Intel X86 上似乎没有禁用实际时钟和电压调节器的官方方法。即使有,它也将特定于主板,因此您最接近的赌注可能是查看 BIOS,例如 coreboot。 嗯,我意识到除了查看内核源代码之外,我对英特尔一无所知。

    【讨论】:

      【解决方案4】:

      您还可以在内核启动时将 cpus 与调度程序隔离。

      isolcpus=0,1,2 添加到内核启动参数中。

      https://www.linuxtopia.org/online_books/linux_kernel/kernel_configuration/re46.html

      【讨论】:

      • 我不知道这个参数,这当然很有趣,尽管它没有回答我的问题,即物理上停止处理器(接收零功率),而不是被任务调度程序“忽略”。
      【解决方案5】:

      在 Windows 10 中,可以使用新的电源管理命令 CPMINCORES CPMAXCORES。

      Powercfg -setacvalueindex scheme_current sub_processor CPMAXCORES 50
      Powercfg -setacvalueindex scheme_current sub_processor CPMINCORES 25
      Powercfg -setactive scheme_current
      

      这里 50% 的核心被分配用于所需的深度睡眠,25% 被禁止停放。在需要提高时钟速率的数值模拟中表现非常出色(在 Intel 上提升 15%)

      您无法选择要停放的内核,但 Windows 10 内核会检查 Intel 的 Comet Lake 和更新的“首选”(更节能)内核,并开始停放那些不喜欢的内核。 这不是严格的停放,因此在高负载时内核可以以非常低的负载使用这些内核。

      以防万一您正在寻找替代品

      【讨论】:

      • 尽管这似乎是一个有趣的选择,但我认为这种方法并不能减轻我的担忧,因为我需要完全关闭一个具体的处理器或一组处理器。跨度>
      • 从技术上讲,这正是核心停车场的作用。您问“为了使其能耗为零”。一般这么复杂的die,或者它的blocks不能把它的功率降为零,因为parts之间的逻辑互连太多了,其中最大的就是cache。但这就是 C6 电源状态所做的,关闭指定内核中的大多数电路。这里有更多关于在 Windows 中停车的信息bitsum.com/parkcontrol
      • P.S.处理器和逻辑核心是不同的东西。从技术上讲,在多处理器系统中禁用多个处理器中的一个也需要禁用它的电源调节器。虽然监管机构是分开的,但我仍然认为这是不可能的。我什至不确定当其他单元在运行时,CPU 是否会在未通电状态下通过 QPI/UPI 在总线上产生错误的破坏性负载阻抗。
      【解决方案6】:

      我知道这是一个老问题,但禁用 CPU 的一种方法是通过 grub config。

      如果您在/etc/default/grub 中添加到GRUB_CMDLINE_LINUX 的末尾(假设您使用的是标准Linux dist,如果您使用的是设备,则grub 配置的位置可能不同),例如:

      GRUB_CMDLINE_LINUX=".......Current config here **maxcpus**=2"
      

      然后通过运行重新制作你的 grub 配置 grub2-mkconfig -o /boot/grub2/grub.cfg(或grub-mkconfig -o /boot/grub2/grub.cfg,取决于您的安装)。某些发行版可能需要nr_cpus 而不是maxcpus

      只是一些额外的信息:

      • 如果您正在运行具有多个物理 CPU 的服务器,那么禁用一个 CPU 很可能会禁用链接到该 CPU 的内存集,因此它可能会影响服务器的性能

      • 以这种方式禁用 CPU,不会影响您的 1 类管理程序访问 CPU(这是基于 xen 管理程序的,我相信它也适用于 vmware,如果有人可以提供确认会很棒)。根据 virtualbox 设置,它可能会限制您可以分配给 VM 的 CPU 数量,除非您正在运行半虚拟化。

      • 但我不确定您是否会节省电力,如今大多数服务器甚至台式机都已经很好地控制了电源,使当前负载不需要的任何设备进入睡眠状态。我担心的是通过减少 CPU(内核)的数量,然后您将只是将负载转移到剩余的 CPU 上,并且由于需要安排处理器时间,并且可能有指令排队,以及数量较少的影响可用于中断的内核数量(例如:网络流量),它可能会对功耗产生负面影响。

      【讨论】:

        猜你喜欢
        • 2011-01-23
        • 2014-09-08
        • 2019-06-15
        • 2011-08-11
        • 2010-10-15
        • 1970-01-01
        • 1970-01-01
        • 2012-12-21
        • 1970-01-01
        相关资源
        最近更新 更多