CPU节能简介,查看机器是否开启节能及OS中关闭节能方法。

  • 内容
  • 评论
  • 相关

一、CPU节能概念

随着CPU的发展,Intel出现了EIST技术,它可以动态的调整CPU的频率。当CPU使用率低下或者接近0时候,能降低CPU频率并且降压,从而降低功耗和发热。当检测到CPU使用率增高,它会马上回到原始工作频率,但是你必须考虑CPU被唤醒的时间,并且确保它会再次100%运行。这一系列的过程通常被称为“C-states”或“C-modes”,它是从C0开始的。

随着C-states的不断增加,CPU睡眠模式就更深,即更多的电路和信号被关闭,并且CPU将需要更多时间返回到C0模式,即唤醒。

对于每个模式也有不同的名称与不同功耗的子模式,从而唤醒时间级别等。

而在一些case中,CPU节能会带一些不稳定的因素,如unstable issue或performance issue,所以我们可以通过系统层面来disable CPU节能。

二、常见的几种C-states

C0 :工作状态,CPU完全运行。

C1 :停止状态,主CPU停止内部时钟经由软件;总线接口单元和APIC保持全速运行。

C3 :深度睡眠,止所有CPU内部和外部时钟。

C6 : 深度功率下降, 将CPU内部电压降低到任何值,包括0V。

三、快速查看处理器节能是否打开

1. Linux 下命令快速查看

从图可以看出当前超线程cpu NHz各有不同,说明都不是跑在C0模式下。

2、使用i7z工具查看

Linux下查看C-state的小工具,使用简单,直接上传i7z_64bit文件到系统里,命令添加可执行权限,如:chmod +x i7z_64bit,然后直接执行 ./i7z_64bit

i7z下载

四、如发现线上机器节电调频开启,处理方法

CentOS 7.x 节电及处理器调频设置

1、  CentOS7.3 OS中使用了 Intel P-state ,导致机器BIOS关闭节电设置后,处理器的频率依旧处于频繁跳动状态。通过grub禁用 Intel P-state解决OS控制处理器频率问题。操作如下:

禁用Intel P-state

sed -i '/GRUB_CMDLINE_LINUX/{s/"$//g;s/$/ intel_pstate=disable intel_idle.max_cstate=0 processor.max_cstate=1 idle=poll"/}' /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot

此前有同学提到的方案为修改scaling_governor为performance,此方案再使用过程中处理器频率会有瞬间掉频的情况。故不推荐。

以下为修改前后对比

下图CentOS 7.3为修改前处理器频率状态

下图CentOS 7.3为修改后处理器频率状态

CentOS 6.x 节电及处理器调频设置

1、  部分SuperMicro、dell 老机型(如 R510  R610)机器在BIOS关闭节电不生效,由于从rhel 6 开始,操作系统默认会通过intel_idle驱动来控制cpu的节能状态,而忽略BIOS设置.所以要通过添加启动参数禁用intel_idle,让linux系统通过ACPI调用BIOS设置来彻底实现禁用节能.所以手动Linux kernel配置参数(grub文件)里增加以下参数来禁用操作系统底层驱动的节能功能在grub中添加intel_idle.max_cstate=0  idle=poll

重启生效,部分没有在BIOS关闭节电的老机器也可直接用此方法,使处理器频率运行在最高频率。

修改示例如下 (修改当前使用kernel才可生效)

 

使用了grub2装机的系统修改grub细节稍有不同,可按照下图修改,注意是修改的grub.cfg

 

此文档关闭节电方法都是基于OS进行操作,BIOS设置各厂商大同小异,请自行查找。

转载请务必标注来源,否则将追究法律责任。

评论

23条评论
  1. Gravatar 头像

    计云城 回复

    非常不错,很详细,关于节能模式引起的宕机事件发生很多,不仅要修改bios选项,还要修改系统相关参数

    • Gravatar 头像

      Zack 回复

      @计云城 已经想不起来,博客中上次的正常评论是什么时候了。看到分享的经验能帮到他人是件开心的事情,哪怕徒劳无功。感谢回复。

  2. Gravatar 头像

    boss 回复

    嘿 你猜我是谁

  3. Gravatar 头像

    alpha 回复

    请问文章中截图,查看cpu频率的命令是什么?

    • Gravatar 头像

      Zack 回复

      @alpha 可以在文章的第三步第2小步中使用i7z工具查看,下有个i7z下载,直接点击就可以下载此工具查看CPU的频率。 😉

  4. Gravatar 头像

    位鹏飞 回复

    发现这边文章,太帅了,

  5. Gravatar 头像

    L 回复

    您好,我有个问题是,使用cat /proc/cpuinfo | grep 'cpu MHz' 查看发现cpu MHz值各有不同,说明都不是跑在C0模式下。这是表示开启CUP节能了呢,还是没开呢。

    • Gravatar 头像

      Zack 回复

      @L 有两种情况,
      1、处理器确实没有在C0的模式下运行。
      2、处理器处于C0模式下,频率还是会跳动,这个原因是intel_pstate这个模块导致,这个模块会动态调节当前的处理器频率,可以disbled掉这个模块 频率就会稳定运行,我是在CentOS 7下发现的这个原因,其他发型版本没有测试。

  6. Gravatar 头像

    小陆 回复

    你好,你的文章写的非常好,我也亲自验证了下。有个问题想问下:
    我在pstate开启下,系统默认加载intel-pstate驱动,并开出sys接口(/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor)
    sys接口有这几个可选择的CPU运行模式:powersave和performance,网上查到,powersave是使系统在最低频率下运行,performance是最高频率运行。但是我把模式无论设置成哪种系统都是最高频率。这个有点不解?我想降低频率,但powersave不可行?群主是否知道原因,或者有降低频率的方案?
    谢谢!!

    • Gravatar 头像

      Zack 回复

      @小陆 我不清楚你是用的什么服务器是虚拟机还是物理机,什么厂商的服务器。不过物理机如果要开启节能大致思路是这样的。
      1.检查BIOS中C-State是否为Enabled,如不是请修改为Enabled。
      2.检查BIOS中PowerManager(电源管理)是否调整为OS Control,如不是请修改为OS Control,将电源控制权限交由OS去控制。
      3.即使动态调频处理器频率,如果负载过高的情况下处理器仍然会在最高频率下运行。
      4.为了节能也可以考虑把Turbo关闭。
      友情提示开启节能有可能导致一些玄学故障 😆 。

  7. Gravatar 头像

    王佳斌 回复

    写的太赞了

  8. Gravatar 头像

    王佳斌 回复

    最近遇到个CPU的问题,cat /proc/cpuinfo |grep MHz|uniq,查看CPU频率的时候,前天晚上查是13条 "cpu MHz : 1100.000"或“cpu MHz : 2201:000”,今天早上查出来24条,不知道这个是在什么情况下会增加。感觉应该是开了节能模式,1.怎么确定是否开了节能模式;2.在什么情况下这个会增加。跪求大佬帮忙解答

    • Gravatar 头像

      Zack 回复

      @王佳斌 1.文章中有检测服务器是否开启的节能的小工具(见i7z下载https://houzhibo.com/wp-content/uploads/2018/01/i7z-new.tar.gz ,如不放心可自行GitHub下载)
      2.简单而言。如开启节能或启动P-state 频率是依据机器的负载动态调节频率。负载低的时候处理器频率就低,忙的时候频率就满载处于最高状态,这个可以根据不同的策略设置不同负载处理器的频率,但我没有太细致了解这块。
      3.有可以讨论的可以加这个QQ群297318422,虽然里面没有人哈哈哈 😆

  9. Gravatar 头像

    Jesse 回复

    好答案,赞一个

  10. Gravatar 头像

    小陆 回复

    楼主您好!
    还有个整体想咨询下您:
    您文章说的要在os里关掉节能方法: "手动Linux kernel配置参数(grub文件)里增加以下参数来禁用操作系统底层驱动的节能功能在grub中添加intel_idle.max_cstate=0 idle=poll",
    但我希望能在OS运行过程能根据业务情况,可动态开启或者关闭节能模式,而不是在grub中修改重启后,模式永久生效无法再变。所以,想问下,有什么方法,可实现OS运行过程时,能人为动态开和关节能模式的方法呢?
    谢谢。

    • Gravatar 头像

      Zack 回复

      @小陆 你好。
      1.如果你使用的是CentOS 7.x 通过P-state设置不同的工作模式对处理器进行运行频率上的限制,
      echo governor | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor >/dev/null
      2.CentOS 6.x 如果使用3.0以上版本的kernel应该也有这个功能,如果是2.6.x版本的kernel 可以了解下cpufreq
      3.如果单纯的关闭\打开BIOS上的节能,而不重启机器,我不清楚有没有实现的方法。不好意思。 😛 😛 😛

  11. Gravatar 头像

    Jesse 回复

    您好,有个问题请教下,如果我在bios中未关闭C state即状态为enabled,那么使用intel_pstate=disable intel_idle.max_cstate=0 processor.max_cstate=1 idle=poll,是否也能达到节能的效果呢?
    十分感谢

    • Gravatar 头像

      Jesse 回复

      @Jesse 我验证了下,发现在bios中无论是否关闭C state,结果都是一样的;不过同样我也发现了一个问题,使用i7z查看处理器频率和状态时发现,我的处理器的频率一直在800~1600之间波动(但是四个核的频率是一致的),且C0%始终为100,但是Halt(C1)%一直有值(25~63),和楼主给出的图片中结果有点出入,麻烦给解下惑,谢谢。

      • Gravatar 头像

        Zack 回复

        @Jesse 你好,方便的话提供下OS的发行版本和版本号及Kernel的版本。有服务器型号更好,如果不方便留言在博客中,也可以加群里沟通。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

来来来,看看你是不是一个人。 *

Title - Artist
0:00