一、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
四、如发现线上机器节电调频开启,处理方法
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设置各厂商大同小异,请自行查找。
转载请务必标注来源,否则将追究法律责任。
非常不错,很详细,关于节能模式引起的宕机事件发生很多,不仅要修改bios选项,还要修改系统相关参数
已经想不起来,博客中上次的正常评论是什么时候了。看到分享的经验能帮到他人是件开心的事情,哪怕徒劳无功。感谢回复。
嘿 你猜我是谁
小新新
请问文章中截图,查看cpu频率的命令是什么?
可以在文章的第三步第2小步中使用i7z工具查看,下有个i7z下载,直接点击就可以下载此工具查看CPU的频率。 😉
发现这边文章,太帅了,
飞哥牛批。
您好,我有个问题是,使用cat /proc/cpuinfo | grep ‘cpu MHz’ 查看发现cpu MHz值各有不同,说明都不是跑在C0模式下。这是表示开启CUP节能了呢,还是没开呢。
有两种情况,
1、处理器确实没有在C0的模式下运行。
2、处理器处于C0模式下,频率还是会跳动,这个原因是intel_pstate这个模块导致,这个模块会动态调节当前的处理器频率,可以disbled掉这个模块 频率就会稳定运行,我是在CentOS 7下发现的这个原因,其他发型版本没有测试。
你好,你的文章写的非常好,我也亲自验证了下。有个问题想问下:
我在pstate开启下,系统默认加载intel-pstate驱动,并开出sys接口(/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor)
sys接口有这几个可选择的CPU运行模式:powersave和performance,网上查到,powersave是使系统在最低频率下运行,performance是最高频率运行。但是我把模式无论设置成哪种系统都是最高频率。这个有点不解?我想降低频率,但powersave不可行?群主是否知道原因,或者有降低频率的方案?
谢谢!!
我不清楚你是用的什么服务器是虚拟机还是物理机,什么厂商的服务器。不过物理机如果要开启节能大致思路是这样的。
1.检查BIOS中C-State是否为Enabled,如不是请修改为Enabled。
2.检查BIOS中PowerManager(电源管理)是否调整为OS Control,如不是请修改为OS Control,将电源控制权限交由OS去控制。
3.即使动态调频处理器频率,如果负载过高的情况下处理器仍然会在最高频率下运行。
4.为了节能也可以考虑把Turbo关闭。
友情提示开启节能有可能导致一些玄学故障 😆 。
我遇到过很多典型的故障就是 各种数据库负载过高,CPU升高,web系统访问卡慢,数据处理延迟大。
嗯嗯,节能的开启会导致各种想不到的问题,网卡丢包,cpu hang等。
写的太赞了
感谢回复,你的认可是我继续的动力 😆
最近遇到个CPU的问题,cat /proc/cpuinfo |grep MHz|uniq,查看CPU频率的时候,前天晚上查是13条 “cpu MHz : 1100.000″或“cpu MHz : 2201:000”,今天早上查出来24条,不知道这个是在什么情况下会增加。感觉应该是开了节能模式,1.怎么确定是否开了节能模式;2.在什么情况下这个会增加。跪求大佬帮忙解答
1.文章中有检测服务器是否开启的节能的小工具(见i7z下载https://houzhibo.com/wp-content/uploads/2018/01/i7z-new.tar.gz ,如不放心可自行GitHub下载)
2.简单而言。如开启节能或启动P-state 频率是依据机器的负载动态调节频率。负载低的时候处理器频率就低,忙的时候频率就满载处于最高状态,这个可以根据不同的策略设置不同负载处理器的频率,但我没有太细致了解这块。
3.有可以讨论的可以加这个QQ群297318422,虽然里面没有人哈哈哈 😆
好答案,赞一个
谢谢。
楼主您好!
还有个整体想咨询下您:
您文章说的要在os里关掉节能方法: “手动Linux kernel配置参数(grub文件)里增加以下参数来禁用操作系统底层驱动的节能功能在grub中添加intel_idle.max_cstate=0 idle=poll”,
但我希望能在OS运行过程能根据业务情况,可动态开启或者关闭节能模式,而不是在grub中修改重启后,模式永久生效无法再变。所以,想问下,有什么方法,可实现OS运行过程时,能人为动态开和关节能模式的方法呢?
谢谢。
你好。
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上的节能,而不重启机器,我不清楚有没有实现的方法。不好意思。 😛 😛 😛
您好,有个问题请教下,如果我在bios中未关闭C state即状态为enabled,那么使用intel_pstate=disable intel_idle.max_cstate=0 processor.max_cstate=1 idle=poll,是否也能达到节能的效果呢?
十分感谢
我验证了下,发现在bios中无论是否关闭C state,结果都是一样的;不过同样我也发现了一个问题,使用i7z查看处理器频率和状态时发现,我的处理器的频率一直在800~1600之间波动(但是四个核的频率是一致的),且C0%始终为100,但是Halt(C1)%一直有值(25~63),和楼主给出的图片中结果有点出入,麻烦给解下惑,谢谢。
你好,方便的话提供下OS的发行版本和版本号及Kernel的版本。有服务器型号更好,如果不方便留言在博客中,也可以加群里沟通。
不过我按楼主这调整后,OS系统里面cat/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor显示变为conservative,并不是最高performance,这是为啥呢
如果禁用了intel_pstate后就不会出现/sys/devices/system/cpu/cpu0这个目录了,当然也有可能我好久没处理服务器相关的故障,可能有新的功能和配置了。
您好,我使用dell R640的服务器运行rhel7.8的系统,按照grub设置disabled intel_pstate之后,使用cat /proc/cpuinfo | grep -i “cpu mhz” 检查cpu core 并未处于基准频率
然后我使用tuned-adm profile latency-performance 策略后可以达到CPU频率提升的目的
但是我发现使用i7z检测所有cpu core 处于C1模式,而不像之前在7.3kernkel版本中显示为C0状态
并且,我检查cat /sys/devices/system/cpu/cpuidle/current_driver
显示当前cpuidle 驱动依旧为intel_idle
grub禁用pstate,系统应该会采用acpi_idle驱动模块来管理CPU频率,但是为何实际并不是这样?
如果想使用acpi_idle驱动我没记错的话应该在grub中加入
intel_idle.max_cstate=0
这会禁用默认 intel_idle 驱动程序并强制内核使用 acpi_idle
你可以试试
可以参考此链接
https://mlog.club/article/4180775