cpu、虚拟机、网络设备省电方法

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_pstate
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency: 4294.55 ms.
  hardware limits: 400 MHz - 3.90 GHz
  available cpufreq governors: performance, powersave
  current policy: frequency should be within 400 MHz and 3.90 GHz.
                  The governor "powersave" may decide which speed to use
                  within this range.
  current CPU frequency is 3.00 GHz.
analyzing CPU 1:
  driver: intel_pstate
  CPUs which run at the same hardware frequency: 1
  CPUs which need to have their frequency coordinated by software: 1
  maximum transition latency: 4294.55 ms.
  hardware limits: 400 MHz - 3.90 GHz
  available cpufreq governors: performance, powersave
  current policy: frequency should be within 400 MHz and 3.90 GHz.
                  The governor "powersave" may decide which speed to use
                  within 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 = 644
	devices/system/cpu/cpufreq/conservative/freq_step = 10
	devices/system/cpu/cpufreq/conservative/up_threshold = 45
	devices/system/cpu/cpufreq/conservative/ignore_nice_load = 1
	devices/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: No
	Supports auto-negotiation: Yes
	Supported FEC modes: Not reported
	Advertised link modes:  10baseT/Half 10baseT/Full 
	                        100baseT/Half 100baseT/Full 
	                        1000baseT/Full 
	Advertised pause frame use: No
	Advertised auto-negotiation: Yes
	Advertised FEC modes: Not reported
	Speed: 1000Mb/s
	Duplex: Full
	Port: Twisted Pair
	PHYAD: 1
	Transceiver: internal
	Auto-negotiation: on
	MDI-X: Unknown (auto)
	Supports Wake-on: pumbg
	Wake-on: g
	Current message level: 0x00000007 (7)
			       drv probe link
	Link 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 activity
                  u   Wake on unicast messages
                  m   Wake on multicast messages
                  b   Wake on broadcast messages
                  a   Wake on ARP
                  g   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. 驱动补丁
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值