物理机的CPU freq调节

线上k8s集群有一批新上的物理机,应用调度到物理机上以为性能会更好,但却发现容器CPU使用率并不低,即便是空闲时间也会高,物理机的load也偏高。业务方来聊天时笑着开涮说不会是给我们搞的节能模式吧? 我们听了一愣,赶紧上来查。

powersave模式

  cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
  powersave
  powersave
  powersave
  ...(略)
  powersave
  powersave
  powersave

还真是……看频率:

[[email protected] ~]# cat /proc/cpuinfo |grep MHz
cpu MHz		: 1200.037
cpu MHz		: 1200.022
cpu MHz		: 1200.051
...(略)
cpu MHz		: 1200.021
cpu MHz		: 1200.120
cpu MHz		: 1200.090

这并没真的给我们省电,在大多数时间都忙碌的服务器上,节电模式反而更费电。 参考红帽文档中的说明

  • cpufreq_powersave 节电调控器会强制 CPU 使用最低时钟频率。这个频率将被静态设置,且不会更改。因此,这个特定调节器提供最大节能效益,但这是以“最低 CPU 性能”为代价的。这里“节电”一词有时是不正确的,因为(原则上)满负载但低速运行的 CPU 消耗的电量比没有负载但高速运行的 CPU 要多。因此,尽管我们可能建议在需要低性能时设定 CPU 使用节电调控器,但是在这期间意外的高负载可能会导致系统实际消耗了更多的电量。简单地说,节电调控器对 CPU 更象是"限速器"而不是"节能器”。它在过热时会出问题的系统和环境中最有用。

还有其他几种模式:

  • cpufreq_performance 性能调控器会强制 CPU 使用最高时钟频率。这个频率是静态设置的,不会改变。因此,这个特定的调节器“不提供节电效益”。它只适用于几个小时的高负载,而且即使在那种情况下也只可用于 CPU 几乎不(或者从不)闲置的时候。

  • cpufreq_ondemand 按需调控器是一个动态调控器,它允许 CPU 在系统负载高时达到最大时钟频率,还允许系统处于闲置时使用最低时钟频率。虽然这允许系统根据系统负载调整电源消耗,但也确实要承受“频率切换间造成的延迟”。因此,如果系统在闲置和高负载间切换过于频繁,那么延迟可抵消任何按需调控器带来的性能/节能优势。 对大多数系统来说,按需调控器可在散热、电源消耗、性能以及管理性间提供最佳折中方案。若系统只在每天的某个具体时间繁忙,按需调控器将根据负载自动在最大和最小频率间切换而无须进一步操作。

  • cpufreq_userspace 用户空间调控器允许用户空间程序,或者任何以 root 身份运行的进程,来设置频率。所有的调控器当中,用户空间调控器是最能够自定义的。根据它的配置,它能够为您的系统提供最佳的性能和能耗的折中方案。

  • cpufreq_conservative 与按需调控器类似,传统调控器也会根据用量调整时钟频率(类似按需调控器)。但是按需调控器更极端(从最大到最小,再返回),传统调控器则在更接近的频率间进行切换。 这意味着传统调控器会将时钟频率调整为它认为适合负载的频率,而不是简单的在最大和最小频率间选择。虽然这样可以极大地节省电量消耗,但它的代价是产生比按需调控器“更多的延迟”。

若要只在特定核上启用某个调控器,请使用 -c 指令和 CPU 数的范围或是逗号分隔的清单。例如,若要为 CPU 1-3 和 5 启用用户空间调控器,指令为:

  cpupower -c 1-3,5 frequency-set --governor cpufreq_userspace

改为performance模式

因为这批机器大部分时间在忙碌状态,因此设置为performance模式。

cpupower -c all frequency-set -g performance
Setting cpu: 0
Setting cpu: 1
...(略)
Setting cpu: 22
Setting cpu: 23

cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
performance
performance
...(略)
performance
performance

再看效果:

cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq
3100000
3100000
3100000
...(略)
3100000
3100000
3100000