专栏首页皮振伟的专栏[linux][intel]linux对intel c-state和p-state的支持分析

[linux][intel]linux对intel c-state和p-state的支持分析

前言: 前文《[qemu][acpi]从虚拟化看ACPI》中,介绍了ACPI的大概逻辑,以及ACPI sleep的S1,S2,S3(STR),S4(STD),S5状态。 关于节电,intel提供了c-state和p-state的CPU级别的控制,linux也对其进行了支持。 分析: 1,c-state 关于c-state的详细解释,参考intel的文档https://software.intel.com/en-us/articles/power-management-states-p-states-c-states-and-package-c-states

大意是说,intel提供了per-cpu的级别的c-state控制,在不同的控制级别下,级别越深,则越省电,同时也意味着恢复到c0级别需要的时间越多。 结合intel官方的图片:

上面case 1,在一段相对较长的时间内,都比较空闲,隔了一段时间内,出现了下一次的interrupt。 在case 2里面,同样的时间间隔内,出现了多次的指令运行。 因为从c6恢复过来需要的延迟比较高,所以在case 1的情况下,更适合深度c-state。 2,linux对c-state的支持 我们都知道,top看到的cpu使用率里面,idle就是统计cpu执行idle的时间。在kernel中调度的时候,如果发现没有task处于running状态,则会执行idle。idle在执行的时候,可以选择更加深度c-state用来节电。 linux-4.14/drivers/idle/vim intel_idle.c中,定义了多个cpuidle_state结构,对应不同的cpu架构。下图选自haswell架构:

不同级别的c-state对应了不同exit_latency。不同的cpu对c-state的支持也不尽相同。 查询intel SDM或者看这个文件,都可以看出来支持情况。整体来看,越新的架构,支持的越好。 3,intel_idle.max_cstate 默认情况下,会使用最深级别的c-state。对于haswell来说,就是c10。 intel_idle模块提供了一个可配置的参数,在grub的启动参数中可以配置intel_idle.max_cstate=5这样类似的参数即可。 对于cpu密集的延迟敏感型应用来说,可以使用更低的intel_idle.max_cstate配置。intel_idle.max_cstate的默认值是9,如果是0,则表示关闭intel idle。 4,moniotr/mwait 代码linux-4.14/arch/x86/include/asm/mwait.h中,

mwait idle的实现主要由monitor和mwait组合实现的。

monitor函数用asm实现,结合intel SDM:

这里的opcode用byte填写的,可能是asm不支持monitor指令(或者为了兼容低板本的编译器)。即使用monitor来监控idle task的flag。 再来看mwait指令:

使用上文提到的c-state的参数,经过计算,放到eax中,调用mwait指令。

同样也是用byte填写opcode。 综上,结合SDM和上文的monitor参数,可以判断出来:在执行mwait期间,会陷入到c-state(具体的级别和cpu型号,intel_idle.max_cstate有关)中,如果遇到了irq或者idle的flag被修改,则会唤醒cpu。相应irq,或者重新调度。

本文分享自微信公众号 - AlwaysGeek(gh_d0972b1eeb60)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-07-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [linux][redis]redis对cpu亲和性的支持

    前言 redis在最近的版本中,开始了对多线程的支持。加上之前对多进程的支持,模型的复杂度也比过去复杂了不少。 redis本身又是一个对性能、延迟非常敏感的业务...

    皮振伟
  • [linux][network]互联网后台模型

    前言: 虽然话题的范围有点大,但是在这里作者不打算谈框架,侃架构。 这里也只是作者最熟悉的一种后台架构模型。 并发模型: 多进程模型: 来一个请求,设定环境...

    皮振伟
  • [linux][nginx]nginx的graceful shutdown和worker shutdown timeout

    前言: 某大佬问作者,nginx做proxy的时候,重新加载配置的时候,会不会影响已有的连接? 作者基于too young too simple的认知:clie...

    皮振伟
  • chrome xpath的使用

    最近研究爬虫的时候,发现chrome也支持xpath,用法如下,在console中输入

    用户2936342
  • 从抓包的角度分析connect()函数的连接过程

    这篇文章主要是从tcp连接建立的角度来分析客户端程序如何利用connect函数和服务端程序建立tcp连接的,了解connect函数在建立连接的过程中底层协议栈做...

    范蠡
  • 听了他讲的泛型,我就明白为什么他的工资比我多30万了!

    Java是怎么实现泛型的?不错,类型擦除。Java编译器将源码编译成字节码的时候会将你在源码中声明的类型进行擦除,比如:

    吴延宝
  • 最全的数组操作方法,你造吗?

    在 JavaScript 中,对于数组的操作非常频繁,对应的 API 也很丰富 。ECMAScript 规范在每一版发布时,都会提供新的 API 来增强数组的操...

    grain先森
  • 【机器学习圈子里的裙带关系】学术“朋友圈”罪与罚

    来源:Reddit 作者:闻菲 【新智元导读】或许你以为搞学术做研究可以不受世俗干扰,殊不知有人在的地方就有江湖。在学术圈,跟对人或许跟做好事情一样重要...

    新智元
  • GitHubDaily 过去一周分享总结(106 期)

    今天是周末,照例给大家整理一下,过去一周 GitHubDaily 在微博、知乎平台分享的一些内容。

    GitHubDaily
  • WPF 列表右键菜单比较符合 MVVM 的命令绑定方法

    群里小伙伴问我如何在 ListView 的右击的时候知道右击的是哪一项,他想要获取对应的行信息。他使用的是 GridView 做的,于是我告诉他需要自己写 It...

    林德熙

扫码关注云+社区

领取腾讯云代金券