CPU 省电方法

c 状态的使用方法

C 状态是 cpu 空闲时的电力状态.通过设置更深的 C 状态就可以减少电能消耗.
C 状态的层次越深,将停止更多的 CPU 功能,从空闲状态恢复的时间越长.

ACPI 中从 C 状态的恢复基本上是以中断为契机进行的.降低中断频率可以让
C 状态持续更长时间,从而减少电能消耗。

linux 中有 cpuidle 子系统用来控制 CPU 的空闲状态。通过 cpuidle 子系统可
以设置 CPU 空闲时的轮询 (polling) 方法和策略 (governor)。从而将每个 cpu
的状态特性抽象化.

全局 cpuidle 相关信息位于如下路径中:

/sys/devices/system/cpu/cpuidle

在我的系统中查看此目录信息,有如下输出:

[longyu@debian-10:10:58:24] ~ $ ls /sys/devices/system/cpu/cpuidle/
current_driver  current_governor_ro
[longyu@debian-10:10:58:29] ~ $ cat /sys/devices/system/cpu/cpuidle/*
intel_idle
menu

当开启了 cpuidle_sysfs_switch启动选项,上述目录下的文件将会被下面的文件替代:

  • current_driver
  • available_governors
  • current_governor

在这种情况下用户能够在运行时写入 current_governor 文件来切换策略

设定 cpuidle_sysfs_switch 进行验证

linux 启动参数中设置 cpuidle_sysfs_switch,进入系统后查看 cpuidle 全局信
息,过程记录如下:

longyu@virt-debian10:~$ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-4.19.0-8-amd64 root=UUID=82b1c6bc-d4cc-497c-8531-65808212d3ad ro quiet cpuidle_sysfs_switch
longyu@virt-debian10:~$ ls -lR /sys/devices/system/cpu/cpuidle/
/sys/devices/system/cpu/cpuidle/:
总用量 0
-r--r--r-- 1 root root 4096 8月  11 11:07 available_governors
-r--r--r-- 1 root root 4096 8月  11 11:07 current_driver
-rw-r--r-- 1 root root 4096 8月  11 11:07 current_governor

从上面的输出可以看到,cmdline 中开启了 cpuidle_sysfs_switch 选项,/sys 子目录中的对应文件也按照上文中的描述被替换为新的文件。

切换 cpuidle 省电策略

访问 available_governors获取当前可用的策略,然后写入策略到
current_governor切换策略

一个具体的操作示例如下:

longyu@virt-debian10:~$ cat /sys/devices/system/cpu/cpuidle/current_driver
none
longyu@virt-debian10:~$ cat /sys/devices/system/cpu/cpuidle/current_governor
menu
longyu@virt-debian10:~$ cat /sys/devices/system/cpu/cpuidle/available_governors
ladder menu
longyu@virt-debian10:~$ su -c 'echo "ladder" > /sys/devices/system/cpu/cpuidle/current_governor '
密码:
longyu@virt-debian10:~$ cat /sys/devices/system/cpu/cpuidle/current_governor
ladder

在上面的操作中,available_governors文件中存储系统支持的 governors 策略。这里有如下两种不同类型的策略:

  1. menu linux 系统中的标准策略
  2. ladder 阶段性改变的策略.

这里 menu 策略从中断等情况预测可以休眠的时间,选择与该休眠时间相符的最深的 C 状态.使用 cpu 负载 中断 I/O 负载等进行预测.

单个逻辑 cpu 的 cpuidle 信息

除了全局行的 cpuidle 省电配置外,每一个逻辑 cpu 都有自己单独的 cpuidle 配置。

每一个逻辑 CPU 的 cpuidle 信息可以通过如下目录进行访问:

/sys/devices/system/cpu/cpuX/cpuidle/stateM

这里 X 表示在线的每一个 cpu 的编号,M 表示不同的 S 状态.

在我的系统中,我查看 cpu0 的 cpuidle 信息,操作记录如下:

[longyu@debian-10:11:19:40] my_words $ ls -lR /sys/devices/system/cpu/cpu0/cpuidle/
/sys/devices/system/cpu/cpu0/cpuidle/:
总用量 0
drwxr-xr-x 2 root root 0 8月  11 10:59 state0
drwxr-xr-x 3 root root 0 8月  11 10:59 state1
drwxr-xr-x 3 root root 0 8月  11 10:59 state2
drwxr-xr-x 3 root root 0 8月  11 10:59 state3
drwxr-xr-x 3 root root 0 8月  11 10:59 state4
drwxr-xr-x 3 root root 0 8月  11 10:59 state5
drwxr-xr-x 3 root root 0 8月  11 10:59 state6
drwxr-xr-x 3 root root 0 8月  11 10:59 state7
drwxr-xr-x 3 root root 0 8月  11 10:59 state8/sys/devices/system/cpu/cpu0/cpuidle/state0:
总用量 0
-r--r--r-- 1 root root 4096 8月  11 11:18 desc
-rw-r--r-- 1 root root 4096 8月  11 11:18 disable
-r--r--r-- 1 root root 4096 8月  11 11:18 latency
-r--r--r-- 1 root root 4096 8月  11 11:18 name
-r--r--r-- 1 root root 4096 8月  11 11:18 power
-r--r--r-- 1 root root 4096 8月  11 11:18 residency
-r--r--r-- 1 root root 4096 8月  11 11:18 time
-r--r--r-- 1 root root 4096 8月  11 11:18 usage/sys/devices/system/cpu/cpu0/cpuidle/state1:
总用量 0
-r--r--r-- 1 root root 4096 8月  11 11:20 desc
-rw-r--r-- 1 root root 4096 8月  11 11:20 disable
-r--r--r-- 1 root root 4096 8月  11 11:20 latency
-r--r--r-- 1 root root 4096 8月  11 11:20 name
-r--r--r-- 1 root root 4096 8月  11 11:20 power
-r--r--r-- 1 root root 4096 8月  11 11:20 residency
drwxr-xr-x 2 root root    0 8月  11 11:20 s2idle
-r--r--r-- 1 root root 4096 8月  11 11:20 time
-r--r--r-- 1 root root 4096 8月  11 11:20 usage/sys/devices/system/cpu/cpu0/cpuidle/state1/s2idle:
总用量 0
-r--r--r-- 1 root root 4096 8月  11 11:20 time
-r--r--r-- 1 root root 4096 8月  11 11:20 usage/sys/devices/system/cpu/cpu0/cpuidle/state2:
总用量 0
-r--r--r-- 1 root root 4096 8月  11 11:20 desc
-rw-r--r-- 1 root root 4096 8月  11 11:20 disable
-r--r--r-- 1 root root 4096 8月  11 11:20 latency
-r--r--r-- 1 root root 4096 8月  11 11:20 name
-r--r--r-- 1 root root 4096 8月  11 11:20 power
-r--r--r-- 1 root root 4096 8月  11 11:20 residency
drwxr-xr-x 2 root root    0 8月  11 11:20 s2idle
-r--r--r-- 1 root root 4096 8月  11 11:20 time
-r--r--r-- 1 root root 4096 8月  11 11:20 usage/sys/devices/system/cpu/cpu0/cpuidle/state2/s2idle:
总用量 0
-r--r--r-- 1 root root 4096 8月  11 11:20 time
-r--r--r-- 1 root root 4096 8月  11 11:20 usage

这里根据不同的的 S 状态单独建立了不同的子目录,子目录中的文件由统一的模型创建。不同文件的功能信息描述如下:

  • desc : Small description about the idle state (string)
  • disable : Option to disable this idle state (bool) -> see note below
  • latency : Latency to exit out of this idle state (in microseconds)
  • residency : Time after which a state becomes more effecient than any
    shallower state (in microseconds)
  • name : Name of the idle state (string)
  • power : Power consumed while in this idle state (in milliwatts)
  • time : Total time spent in this idle state (in microseconds)
  • usage : Number of times this state was entered (count)

这里需要注意的是 disable 变量的行为和影响依赖于特定策略的实现。在 ladder 策略下,就可能出现问题。例如当你想要关闭一个浅层状态,然后所有跟深层的状态也都被关闭了,但是 disable 变量并不能反映出这样的结果.类似的,当你使能一个深层的状态,但是浅层的状态仍旧保持关闭,这个操作将不会生效.

x86 cpu 中 C 状态运行过程

linux 中 x86 cpu 中 C 状态运行过程如下:

  1. Linux 下一旦变为空闲状态,就会调度 idle 进程,调用 pm_idle 函数
  2. 在使用 cpuidle 子系统的系统下,pm_idle 调用 cpuidle_idle_call()
  3. cpuidle_idle_call 中通过 cpuidle governor 的 select 方法选择下一状
  4. 每个状态各自调用注册的 enter 方法迁移到新的状态

限制 C 状态

C 状态可以达到一定的省电要求,在一些情况下我们可能需要对 C 状态进行限定。这可以通过使用 max_cstate这一内核启动参数来完成,这个参数能够限制 C 状态的最大值.

P 状态

P 状态是 cpu 正在运行时的电力状态.P 状态下是通过降低频率来降低
电能消耗的.

linux 中 P 状态可以使用的省电策略如下:

  1. performance 以可以设置的最高速率运行
  2. powersave 以可以设置的最低速率运行
  3. ondemand 根据系统负载更换频率
  4. conservative 根据系统负载缓慢更换频率
  5. userspace 可以从用户应用程序设置 P 状态

一般使用 ondemand 策略杰克,但是并不是在所有的 cpu 中都可以使用,一些
cpu 可能不支持立刻修改频率的功能

conservative 适用于笔记本电脑等使用电池的系统。

频率越低越好吗?

频率并不是越低越好,频率降低会导致运行时间增长,空闲时间减少,消耗
的电能增加。

cpufrea 相关控制文件

linux 中与系统 cpufreq 相关的控制文件路径如下:

[longyu@debian-10:11:52:56] cpuidle $ ls -lR /sys/devices/system/cpu/cpufreq/
/sys/devices/system/cpu/cpufreq/:
总用量 0
drwxr-xr-x 2 root root 0 8月  11 11:52 policy0
drwxr-xr-x 2 root root 0 8月  11 11:54 policy1
drwxr-xr-x 2 root root 0 8月  11 11:54 policy2
drwxr-xr-x 2 root root 0 8月  11 11:54 policy3
drwxr-xr-x 2 root root 0 8月  11 11:54 policy4
drwxr-xr-x 2 root root 0 8月  11 11:54 policy5
drwxr-xr-x 2 root root 0 8月  11 11:54 policy6
drwxr-xr-x 2 root root 0 8月  11 11:54 policy7/sys/devices/system/cpu/cpufreq/policy0:
总用量 0
-r--r--r-- 1 root root 4096 8月  11 11:52 affected_cpus
-r--r--r-- 1 root root 4096 8月  11 11:52 cpuinfo_max_freq
-r--r--r-- 1 root root 4096 8月  11 11:52 cpuinfo_min_freq
-r--r--r-- 1 root root 4096 8月  11 11:52 cpuinfo_transition_latency
-r--r--r-- 1 root root 4096 8月  11 11:52 energy_performance_available_preferences
-rw-r--r-- 1 root root 4096 8月  11 11:52 energy_performance_preference
-r--r--r-- 1 root root 4096 8月  11 11:52 related_cpus
-r--r--r-- 1 root root 4096 8月  11 11:52 scaling_available_governors
-r--r--r-- 1 root root 4096 8月  11 11:52 scaling_cur_freq
-r--r--r-- 1 root root 4096 8月  11 11:52 scaling_driver
-rw-r--r-- 1 root root 4096 8月  11 11:52 scaling_governor
-rw-r--r-- 1 root root 4096 8月  11 11:52 scaling_max_freq
-rw-r--r-- 1 root root 4096 8月  11 11:52 scaling_min_freq
-rw-r--r-- 1 root root 4096 8月  11 11:52 scaling_setspeed

这里每一个 policy 代表不同的策略,其子目录中的文件功能描述如下:

  1. affected_cpus 因 P 状态的改变而受影响的 CPU
  2. cpuinfo_transition_latency 改变频率所需的延迟时间 nm
  3. related_cpus 与 affected_cpus 意思相同,但是考虑了 _PSD 的CoordType=HW_ALL 时的情况.
  4. scaling_available_governors 可利用的 governors 列表
    scaling_cur_freq 最后设置的当前 cpu 频率 kHz. 不使用驱动程序重新获取值,有
    可能与 cpuinfo_cur_freq 的值不同
  5. scaling_setspeed 使用用户程序时,写入这个文件就可以修改频率.

每个逻辑 cpu 的 cpufreq

每个 cpu 的 cpufreq 相关 sys 文件在如下目录:

/sys/devices/system/cpu/cpuN/cpufreq/stats

这里 N 代表 cpu 的编号。

一个示例如下:

[longyu@debian-10:11:52:30] cpuidle $ ls -lR /sys/devices/system/cpu/cpu0/cpufreq/
/sys/devices/system/cpu/cpu0/cpufreq/:
总用量 0
-r--r--r-- 1 root root 4096 8月  11 11:52 affected_cpus
-r--r--r-- 1 root root 4096 8月  10 23:16 cpuinfo_max_freq
-r--r--r-- 1 root root 4096 8月  11 11:52 cpuinfo_min_freq
-r--r--r-- 1 root root 4096 8月  11 11:52 cpuinfo_transition_latency
-r--r--r-- 1 root root 4096 8月  11 11:52 energy_performance_available_preferences
-rw-r--r-- 1 root root 4096 8月  11 11:52 energy_performance_preference
-r--r--r-- 1 root root 4096 8月  11 11:52 related_cpus
-r--r--r-- 1 root root 4096 8月  11 11:52 scaling_available_governors
-r--r--r-- 1 root root 4096 8月  11 11:52 scaling_cur_freq
-r--r--r-- 1 root root 4096 8月  11 11:52 scaling_driver
-rw-r--r-- 1 root root 4096 8月  11 11:52 scaling_governor
-rw-r--r-- 1 root root 4096 8月  11 11:52 scaling_max_freq
-rw-r--r-- 1 root root 4096 8月  11 11:52 scaling_min_freq
-rw-r--r-- 1 root root 4096 8月  11 11:52 scaling_setspeed

cpufreq-info 命令

linux 中可以用 cpufreq-info 来查看 cpufreq 内核信息。这个命令在我的系统中没有预装,我执行如下命令来安装:

[longyu@debian-10:12:02:53] cpuidle $ sudo apt-get install cpufrequtils

cpufreq-info 命令运行示例如下:

[longyu@debian-10:12:03:13] cpuidle $ cpufreq-info
cpufrequtils 008: cpufreq-info (C) Dominik Brodowski 2004-2009
Report errors and bugs to cpufreq@vger.kernel.org, please.
analyzing CPU 0:driver: intel_pstateCPUs which run at the same hardware frequency: 0CPUs which need to have their frequency coordinated by software: 0maximum transition latency: 4294.55 ms.hardware limits: 400 MHz - 3.90 GHzavailable cpufreq governors: performance, powersavecurrent policy: frequency should be within 400 MHz and 3.90 GHz.The governor "powersave" may decide which speed to usewithin this range.current CPU frequency is 3.00 GHz.
analyzing CPU 1:driver: intel_pstateCPUs which run at the same hardware frequency: 1CPUs which need to have their frequency coordinated by software: 1maximum transition latency: 4294.55 ms.hardware limits: 400 MHz - 3.90 GHzavailable cpufreq governors: performance, powersavecurrent policy: frequency should be within 400 MHz and 3.90 GHz.The governor "powersave" may decide which speed to usewithin this range.current CPU frequency is 2.98 GHz.

可以看到它打印除了 cpu0 与 cpu1 的 cpufreq 相关信息,其中有很多是可以通过访问 sys 目录下的文件获取的。

cpufreq 相关的内核模块:

cpufreq 的不同策略有不同的实现,这些策略使用相同的接口注册到系统中。在我的系统中,与 cpufreq 相关的内核模块信息如下:

[longyu@debian-10:12:07:06] cpuidle $ find /lib/modules/4.19.0-10-amd64/ -name 'cpufre*'
/lib/modules/4.19.0-10-amd64/kernel/drivers/cpufreq
/lib/modules/4.19.0-10-amd64/kernel/drivers/cpufreq/cpufreq_conservative.ko
/lib/modules/4.19.0-10-amd64/kernel/drivers/cpufreq/cpufreq_powersave.ko
/lib/modules/4.19.0-10-amd64/kernel/drivers/cpufreq/cpufreq_userspace.ko

上面不同的模块表示不同的 cpufreq 策略的实现。这里我尝试加载 cpufreq_conservative.ko 模块来注册 conservative 策略。

在我的系统中 cpufreq_conservative.ko可以正常加载,加载完成后在 sys 目录下没有创建相应的文件。

我在网上搜索相应的网页,找到了如下链接:

cpu frequency scaling

按照上述链接中的描述,我执行了如下步骤:

  1. 安装 sysfsutils 命令

    sudo apt-get install install sysfsutils

  2. 修改 /etc/sysfs.conf 配置文件,添加相关设定

 mode devices/system/cpu/cpufreq/conservative = 644devices/system/cpu/cpufreq/conservative/freq_step = 10devices/system/cpu/cpufreq/conservative/up_threshold = 45devices/system/cpu/cpufreq/conservative/ignore_nice_load = 1devices/system/cpu/cpufreq/conservative/sampling_down_factor = 10
  1. 重启服务让配置生效

    执行 /etc/init.d/sysfsutils、service sysfsutils start 命令来更新配置。

启动 sysfsutils 服务的过程记录如下:

[longyu@debian-10:12:58:42] my_words $ sudo /etc/init.d/sysfsutils start
[ ok ] Starting sysfsutils (via systemctl): sysfsutils.service.

根据上述输出,配置文件成功解析。但是进一步的验证却发现设定的策略没有生效,可能是 scaling_available_governors 中没有 conservative 这
一项目的问题,暂时跳过。

powertop 工具

powertop 是用来监测电源消耗并提供电源管理功能的工具,它可以用来获取 P 状态的信息。

此命令执行示例如下:

  1. overview
  2. Idle stats


3. Frequency stats


4. Device stats


更多的信息请 man powertop

智能加速技术

具有智能加速技术的 cpu 自动以高于固定频率的频率运行。

tunbostat 就是用来确定智能加速技术的工具。

turbostat 在内核源码 tools 目录中。

直接进入到内核源码目录的 tools/power/x86/turbostat目录中进行编译,执行过程记录如下:

[longyu@debian-10:13:06:22] turbostat $ pwd
/home/longyu/linux-source-4.19/tools/power/x86/turbostat
[longyu@debian-10:13:06:29] turbostat $ make
gcc -Wall -I../../../include -DMSRHEADER='"../../../../arch/x86/include/asm/msr-index.h"' -DINTEL_FAMILY_HEADER='"../../../../arch/x86/include/asm/intel-family.h"' turbostat.c -o /home/longyu/linux-source-4.19/tools/power/x86/turbostat/turbostat
[longyu@debian-10:13:06:30] turbostat $

turbostat 执行示例如下:

[longyu@debian-10:13:07:07] turbostat $ sudo ./turbostat
turbostat version 18.07.27 - Len Brown <lenb@kernel.org>
CPUID(0): GenuineIntel 0x16 CPUID levels; 0x80000008 xlevels; family:model:stepping 0x6:8e:b (6:142:11)
CPUID(1): SSE3 MONITOR - EIST TM2 TSC MSR ACPI-TM HT TM
CPUID(6): APERF, TURBO, DTS, PTM, HWP, HWPnotify, HWPwindow, HWPepp, No-HWPpkg, EPB
cpu3: MSR_IA32_MISC_ENABLE: 0x00850089 (TCC EIST MWAIT PREFETCH TURBO)
CPUID(7): SGX
cpu3: MSR_IA32_FEATURE_CONTROL: 0x00000005 (Locked )
CPUID(0x15): eax_crystal: 2 ebx_tsc: 150 ecx_crystal_hz: 0
TSC: 1800 MHz (24000000 Hz * 150 / 2 / 1000000)
CPUID(0x16): base_mhz: 1800 max_mhz: 3900 bus_mhz: 100
cpu3: MSR_MISC_PWR_MGMT: 0x00401cc0 (ENable-EIST_Coordination DISable-EPB DISable-OOB)
RAPL: 17476 sec. Joule Counter Range, at 15 Watts
cpu3: MSR_PLATFORM_INFO: 0x4043df1011200
4 * 100.0 = 400.0 MHz max efficiency frequency
18 * 100.0 = 1800.0 MHz base frequency
cpu3: MSR_IA32_POWER_CTL: 0x0024005d (C1E auto-promotion: DISabled)
cpu3: MSR_TURBO_RATIO_LIMIT: 0x25252627
37 * 100.0 = 3700.0 MHz max turbo 4 active cores
37 * 100.0 = 3700.0 MHz max turbo 3 active cores
38 * 100.0 = 3800.0 MHz max turbo 2 active cores
39 * 100.0 = 3900.0 MHz max turbo 1 active cores
cpu3: MSR_CONFIG_TDP_NOMINAL: 0x00000010 (base_ratio=16)
cpu3: MSR_CONFIG_TDP_LEVEL_1: 0x00080050 (PKG_MIN_PWR_LVL1=0 PKG_MAX_PWR_LVL1=0 LVL1_RATIO=8 PKG_TDP_LVL1=80)
cpu3: MSR_CONFIG_TDP_LEVEL_2: 0x001200c8 (PKG_MIN_PWR_LVL2=0 PKG_MAX_PWR_LVL2=0 LVL2_RATIO=18 PKG_TDP_LVL2=200)
cpu3: MSR_CONFIG_TDP_CONTROL: 0x00000000 ( lock=0)
cpu3: MSR_TURBO_ACTIVATION_RATIO: 0x0000000f (MAX_NON_TURBO_RATIO=15 lock=0)
cpu3: MSR_PKG_CST_CONFIG_CONTROL: 0x1e008008 (UNdemote-C3, UNdemote-C1, demote-C3, demote-C1, locked, pkg-cstate-limit=8 (unlimited))
cpu3: POLL: CPUIDLE CORE POLL IDLE
cpu3: C1: MWAIT 0x00
cpu3: C1E: MWAIT 0x01
cpu3: C3: MWAIT 0x10
cpu3: C6: MWAIT 0x20
cpu3: C7s: MWAIT 0x33
cpu3: C8: MWAIT 0x40
cpu3: C9: MWAIT 0x50
cpu3: C10: MWAIT 0x60
cpu3: cpufreq driver: intel_pstate
cpu3: cpufreq governor: powersave
cpufreq intel_pstate no_turbo: 0
cpu3: MSR_MISC_FEATURE_CONTROL: 0x00000000 (L2-Prefetch L2-Prefetch-pair L1-Prefetch L1-IP-Prefetch)
cpu0: MSR_PM_ENABLE: 0x00000001 (HWP)
cpu0: MSR_HWP_CAPABILITIES: 0x01121027 (high 39 guar 16 eff 18 low 1)
cpu0: MSR_HWP_REQUEST: 0x80002704 (min 4 max 39 des 0 epp 0x80 window 0x0 pkg 0x0)
cpu0: MSR_HWP_INTERRUPT: 0x00000000 (Dis_Guaranteed_Perf_Change, Dis_Excursion_Min)
cpu0: MSR_HWP_STATUS: 0x00000000 (No-Guaranteed_Perf_Change, No-Excursion_Min)
cpu0: MSR_IA32_ENERGY_PERF_BIAS: 0x00000006 (balanced)
cpu0: MSR_RAPL_POWER_UNIT: 0x000a0e03 (0.125000 Watts, 0.000061 Joules, 0.000977 sec.)
cpu0: MSR_PKG_POWER_INFO: 0x00000078 (15 W TDP, RAPL 0 - 0 W, 0.000000 sec.)
cpu0: MSR_PKG_POWER_LIMIT: 0x4280c800dd8088 (UNlocked)
cpu0: PKG Limit #1: ENabled (17.000000 Watts, 28.000000 sec, clamp ENabled)
cpu0: PKG Limit #2: ENabled (25.000000 Watts, 0.002441* sec, clamp DISabled)
cpu0: MSR_DRAM_POWER_LIMIT: 0x5400de00000000 (UNlocked)
cpu0: DRAM Limit: DISabled (0.000000 Watts, 0.000977 sec, clamp DISabled)
cpu0: MSR_PP0_POLICY: 0
cpu0: MSR_PP0_POWER_LIMIT: 0x00000000 (UNlocked)
cpu0: Cores Limit: DISabled (0.000000 Watts, 0.000977 sec, clamp DISabled)
cpu0: MSR_PP1_POLICY: 0
cpu0: MSR_PP1_POWER_LIMIT: 0x00000000 (UNlocked)
cpu0: GFX Limit: DISabled (0.000000 Watts, 0.000977 sec, clamp DISabled)
cpu0: MSR_IA32_TEMPERATURE_TARGET: 0x02640000 (100 C)
cpu0: MSR_IA32_PACKAGE_THERM_STATUS: 0x882f0800 (53 C)
cpu0: MSR_IA32_PACKAGE_THERM_INTERRUPT: 0x00000003 (100 C, 100 C)
cpu3: MSR_PKGC3_IRTL: 0x0000884e (valid, 79872 ns)
cpu3: MSR_PKGC6_IRTL: 0x00008876 (valid, 120832 ns)

具体的命令说明信息请查阅内核 Documentation 目录。

虚拟环境下的省电

虚拟环境下的省电需要注意不能为了单个客户端休眠而修改主机的休眠状态,不同客户端的休眠要单独处理。

xen 的 P 状态

控制 xen P 状态有两种不同的类型:

  1. 管理程序控制 P 状态
  2. Dom0 控制 P 状态

使用 Dom0 控制 P 状态,需要在内核启动参数中添加 cpufreq=dom0-kernel 选项。

Dom0 控制 P 状态时,必须由 Dom0 的虚拟 CPU 直接控制物理 CPU 的 P 状态。所有的虚拟 CPU 必须与所有的物理 CPU 一对一映射,不能一一对应时,cpufreq 参数将不会生效。

xenpm 可以用来观察 CPU C/P 状态使用情况,具体的命令如下:

xenpm get-cpuidle-states [cpuid]
xenpm get-cpufreq-states [cpuid]

xen 的 C 状态

要在 xen 环境中使用 C 状态,需要修改 grub 配置。修改内容如下:

kernel /boot/xen.gz cpuidle

在启用这种状态时,如果系统产生异常,可以在管理程序的启动选项中加入
max_cstate=2lapic_timer_c2_ok,限制使用的 C 状态。

KVM 的 C/P 状态

kvm 的 C/P 状态可以使用与 linux 一样的工具进行配置,这里就不再赘述了。

管理远程主机的电源

从远程接通或断开电源的方法有使用 NIC(Network Interface Card) 功能的
WOL 和 IPMI(BMC) 方法。

Wake on LAN 由网络发送 magic packet 特殊数据包,从网络设备接通系统电源
的方法。

注意要使用这个功能首先需要在 BIOS 中将 Remote wake on 设置为 on。

执行 ethtool 命令查看网卡支持唤醒的事件类型:

longyu@virt-debian10:~$ sudo /sbin/ethtool enp9s0
[sudo] longyu 的密码:
Settings for enp9s0:Supported ports: [ TP ]Supported link modes:   10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Supported pause frame use: NoSupports auto-negotiation: YesSupported FEC modes: Not reportedAdvertised link modes:  10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Advertised pause frame use: NoAdvertised auto-negotiation: YesAdvertised FEC modes: Not reportedSpeed: 1000Mb/sDuplex: FullPort: Twisted PairPHYAD: 1Transceiver: internalAuto-negotiation: onMDI-X: Unknown (auto)Supports Wake-on: pumbgWake-on: gCurrent message level: 0x00000007 (7)drv probe linkLink detected: no

man ethtool 可以查看到不同的唤醒事件,主要是根据包类型来划分的。

         wol p|u|m|b|a|g|s|f|d...Sets Wake-on-LAN options.  Not all devices support this.  The argument to this option is a string of characters specifying which options to enable.p   Wake on PHY activityu   Wake on unicast messagesm   Wake on multicast messagesb   Wake on broadcast messagesa   Wake on ARPg   Wake on MagicPacket™s   Enable SecureOn™ password for MagicPacket™f   Wake on filter(s)d   Disable (wake on nothing).  This option clears all  pre‐vious options.

执行如下命令设定唤醒事件:

ethtool -s eth4 wol pumbag

启用并配置 WOL 后即使主机的电源切断,也可以从远程重新接通电源。使用 ethtool 命令启用了WOL 的 NIC,在切断电源后,如果连接上 LAN 电缆,也会闪光。

发送魔术包

可以执行如下命令发送魔术包到 mac 地址指定的主机上。

ether-wake mac address

上述方式中没有权限控制,只要获取到 mac 地址,就能够发送魔术包。对这样的行为我们可以在本地使用 ethtool -s eth4 wol s 启用 Secure on 功能,然后执行 ethtools -s 设置密码来进行保护,只让那些获取到密码的用户来唤醒远程主机。

执行 ethtool -s eth4 sopass xx:dd:xx:xx 设置以 : 分隔的 4~6
个字符串。

再次执行 ether-wake 时需要指定密码,命令格式如下:

ether-wake -p passwd mac address

这种用 mac 地址区分设备,在一些情况下魔术包无法到达,IPMI 能够解决这个
问题。

IPMI

IPMI 可以将 IP 地址指定为接收地址进行电源管理,具体的操作不进行研究。

网络设备节省电能

网络设备省电可以从以下三个方面入手:

  1. 关闭 wol
  2. 降低速率
  3. 驱动补丁

cpu、虚拟机、网络设备省电方法相关推荐

  1. 如何禁用C-State功能?关闭intel CPU的C-State省电模式方法

    前段时间,Win10电脑经常出现蓝屏故障,蓝屏代码为WHEA_UNCORRECTABLE_ERROR,一开始以为是系统的问题,重新安装系统几次都未能解决这个问题,多次更新驱动也得不到解决,包括内存也更 ...

  2. linux怎么让cpu不自动降频,Win10 CPU自动降频怎么办?Win10下让CPU不降频设置方法

    有一些用户反馈在Win10系统下CPU会自动降频,也就是自动降低频率以减少资源消耗,如果是平时还没有什么,但是如果你在玩游戏,那么降频给大家带来游戏性能的降低是不能接受的,游戏会变的卡顿下面小编给大家 ...

  3. 计算机故障分析与处理事例,几个典型CPU故障案例的处理方法

    CPU作为电脑的核心组成部份,它的好坏直接影响到电脑的性能.CPU有时会发生故障,那么,下面让学习啦小编带您去看看几个典型的案例的处理方法吧. 几个典型CPU故障案例的处理方法: 一般情况下,CPU出 ...

  4. Ubuntu+Xen+Virt-manager创建全虚拟机化虚拟机(HVM)方法大合集 | CSDN 创作打卡

    Ubuntu+Xen+Virt-manager创建全虚拟机化虚拟机(HVM)方法大合集 环境 安装Xen 使用virt-manager安装Xen虚拟机 检查libvirtd服务状态 安装其他工具 安装 ...

  5. IDEA的CPU占用率高问题解决方法

    前言:这段时间发现 IDEA 的 CPU 占用率猛涨,时不时就飙升到百分之7.80,使得敲代码的体验感十分不佳,在经过一番查找之后终于解决了问题,在此记录一下 IDEA的CPU占用率高问题解决方法 问 ...

  6. 虚拟机忘记密码解决方法

    虚拟机忘记密码解决方法 参考文章: (1)虚拟机忘记密码解决方法 (2)https://www.cnblogs.com/pinpin/p/10937152.html 备忘一下.

  7. Mysql CPU占用高的问题解决方法小结

    Mysql CPU占用高的问题解决方法小结 参考文章: (1)Mysql CPU占用高的问题解决方法小结 (2)https://www.cnblogs.com/shuaiandjun/p/566204 ...

  8. VMware workstation虚拟机不能联网解决方法

    VMware workstation虚拟机不能联网解决方法 参考文章: (1)VMware workstation虚拟机不能联网解决方法 (2)https://www.cnblogs.com/wxyw ...

  9. python测试代码运行时间_10种检测Python程序运行时间、CPU和内存占用的方法

    在运行复杂的Python程序时,执行时间会很长,这时也许想提高程序的执行效率.但该怎么做呢? 首先,要有个工具能够检测代码中的瓶颈,例如,找到哪一部分执行时间比较长.接着,就针对这一部分进行优化. 同 ...

最新文章

  1. BREW 计费模式概览
  2. FusionChart
  3. 无废话-SQL Server 2005新功能(1) - TSQL
  4. Struts2对象属性驱动
  5. TypeScript里的完整函数定义语法
  6. Tableau Desktop
  7. 【Qt】使用QProcess调用其它程序或脚本
  8. Linux Rsync实现文件同步备份(转载)
  9. uniapp底部导航栏中间凸起_PPT导航栏,真的非常好用!
  10. 用Python给你的头像加口罩,加圣诞帽,加红心,加加加
  11. 计算机需要那些高中数学知识点,高中数学知识点(高中数学知识点最全版)
  12. 单火开关和零火开关的区别
  13. 十年,MongoDB从一片小绿叶长成一颗大树
  14. 记一次高德地图引入 AMap is not defined 血坑
  15. Android手机电池不耐用,手机电池用久了不耐用?教你几招让它“起死回生”!
  16. 微信开放平台开发第三方授权登陆:微信扫码登录
  17. js过滤对象中值为空的属性
  18. 解决TypeError:Cannot read properties of undefined并深入解读TypeError错误类型
  19. 脱星摘帽刺激 ST板块表现出众
  20. 测试部门来了个00后卷王之王,老油条感叹真干不过,但是...

热门文章

  1. C语言实验——求两个整数之和 (sdut oj)
  2. 水电一体化预付费云平台
  3. echarts折线风向图(附源码,可直接使用)
  4. 小白也能自己完成APP制作
  5. 高斯积分e^(-x^2)在无限域上的定积分
  6. H5调用摄像头拍照,录音及选择文件
  7. ARM-A架构入门基础(三)MMU
  8. 【Qt】.qrc文件为项目添加图片、动画、音效、视频等资源文件
  9. MFC CImage图像失真的解决方法
  10. 测井计算机使用的总线,测井数据处理开始步入工作站时代