[ZLG-ARM] Linux 2.6 内核中的最新电源管理技术综述-3

[复制链接]
2461|1
 楼主| 胡刚 发表于 2009-4-6 16:51 | 显示全部楼层 |阅读模式
$&nbsp;sudo&nbsp;cpufreq-set&nbsp;-g&nbsp;ondemand&nbsp;<br />$&nbsp;ls&nbsp;/sys/devices/system/cpu/cpu0/cpufreq/ondemand/&nbsp;<br />ignore_nice_load&nbsp;<br />powersave_bias&nbsp;<br />sampling_rate&nbsp;<br />sampling_rate_max&nbsp;<br />sampling_rate_min&nbsp;<br />up_threshold&nbsp;<br />$&nbsp;sudo&nbsp;cat&nbsp;sampling_rate_min&nbsp;sampling_rate&nbsp;<br /><br /><br /><br />sampling_rate_max&nbsp;<br />40000&nbsp;<br />80000&nbsp;<br />40000000&nbsp;<br />$&nbsp;sudo&nbsp;cat&nbsp;up_threshold&nbsp;<br />30&nbsp;<br />&nbsp;&nbsp;<br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在这个子目录下名字以&nbsp;sampling&nbsp;打头的三个文件分别给出了ondemand&nbsp;governor&nbsp;允许使用的最短采样间隔,当前使用的采样间隔以及允许使用的最长采样间隔,三者均以微秒为单位。<br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以笔者的电脑为例,&nbsp;ondemand&nbsp;governor&nbsp;每隔&nbsp;80&nbsp;毫秒进行一次采样。另外比较重要的一个文件是&nbsp;up_threshold&nbsp;,它表明了系统负载超过什么百分比时ondemand&nbsp;governor&nbsp;会自动提高CPU&nbsp;的运行频率。以笔者的电脑为例,这个数值为&nbsp;30%&nbsp;。那么这个表明系统负载的百分比数值是如何得到的呢?在支持Intel&nbsp;最新的&nbsp;Enhanced&nbsp;Speedstep&nbsp;技术的&nbsp;CPU&nbsp;中,在处理器硬件中直接提供了两个&nbsp;MSR&nbsp;寄存器(Model&nbsp;Specific&nbsp;Register)供&nbsp;ondemand&nbsp;governor&nbsp;采样分析系统负载情况使用。这两个&nbsp;MSR&nbsp;寄存器的&nbsp;名字分别为&nbsp;IA32_MPERF&nbsp;和&nbsp;IA32_APERF[5]&nbsp;,其中&nbsp;IA32_MPERF&nbsp;MSR&nbsp;中的&nbsp;MPERF&nbsp;代表Maximum&nbsp;Performance&nbsp;,&nbsp;IA32_APERF&nbsp;MSR&nbsp;中的&nbsp;APERF&nbsp;代表Actual&nbsp;Performance&nbsp;。就像这两个&nbsp;MSR&nbsp;的名字一样,&nbsp;IA32_MPERF&nbsp;MSR&nbsp;寄存器是一个当&nbsp;CPU&nbsp;处在&nbsp;ACPI&nbsp;C0&nbsp;状态下时按照&nbsp;CPU&nbsp;硬件支持的最高运行频率每隔一个时钟周期加一的计数器;IA32_APERF&nbsp;MSR&nbsp;寄存器是一个当&nbsp;CPU&nbsp;处在&nbsp;ACPI&nbsp;C0&nbsp;状态下时按照&nbsp;CPU&nbsp;硬件当前的实际运行频率每隔一个时钟周期加一的计数器。有了这两个寄存器的存在,再考虑上&nbsp;CPU&nbsp;处于ACPI&nbsp;C0&nbsp;和处于&nbsp;ACPI&nbsp;C1、C2、C3&nbsp;三种状态下的时间比例,也就是&nbsp;CPU&nbsp;处于工作状态和休眠状态的时间比例,&nbsp;ondemand&nbsp;governor&nbsp;就可以准确的计算出&nbsp;CPU&nbsp;的负载情况了。&nbsp;<br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;得到了&nbsp;CPU&nbsp;的负载情况,接下来的问题就是如何选择&nbsp;CPU&nbsp;合适的运行频率了。刚刚在前面提到,当系统负载超过up_threshold&nbsp;所设定的百分比时,&nbsp;ondemand&nbsp;governor&nbsp;将会自动提高&nbsp;CPU&nbsp;的运行频率,但是具体提高到哪个频率上运行呢?在&nbsp;ondemand&nbsp;governor&nbsp;监测到系统负载超过&nbsp;up_threshold所设定的百分比时,说明用户当前需要&nbsp;CPU&nbsp;提供更强大的处理能力,因此&nbsp;ondemand&nbsp;governor&nbsp;会将CPU设置在最高频率上运行,这一点社区中的开发人员和广大用户都没有任何异议。但是当&nbsp;ondemand&nbsp;governor&nbsp;监测到系统负载下降,可以降低&nbsp;CPU&nbsp;的运行频率时,到底应该降低到哪个频率呢?&nbsp;ondemand&nbsp;governor&nbsp;的最初实现是在可选的频率范围内调低至下一个可用频率,例如笔者使用的&nbsp;CPU&nbsp;支持三个可选频率,分别为&nbsp;1.67GHz、&nbsp;1.33GHz&nbsp;和&nbsp;1GHz&nbsp;,如果&nbsp;CPU&nbsp;运行在&nbsp;1.67GHz&nbsp;时ondemand&nbsp;governor&nbsp;发现可以降低运行频率,那么&nbsp;1.33GHz&nbsp;将被选作降频的目标频率。这种降频策略的主导思想是尽量减小对系统性能的负面影响,从而不会使得系统性能在短时间内迅速降低以影响用户体验。但是在&nbsp;ondemand&nbsp;governor&nbsp;的这种最初实现版本在社区发布后,大量用户的使用结果表明这种担心实际上是多余的,&nbsp;ondemand&nbsp;governor&nbsp;在降频时对于目标频率的选择完全可以更加激进。因此最新的&nbsp;ondemand&nbsp;governor&nbsp;在降频时会在所有可选频率中一次性选择出可以保证&nbsp;CPU&nbsp;工作在&nbsp;80%&nbsp;以上负荷的频率,当然如果没有任何一个可选频率满足要求的话则会选择&nbsp;CPU&nbsp;支持的最低运行频率。大量用户的测试结果表明这种新的算法可以在不影响系统性能的前提下做到更高效的节能。在算法改进后,&nbsp;ondemand&nbsp;governor&nbsp;的名字并没有改变,而&nbsp;ondemand&nbsp;governor&nbsp;最初的实现也保存了下来,并且由于其算法的保守性而得名conservative&nbsp;。&nbsp;<br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;支持&nbsp;Intel&nbsp;Enhanced&nbsp;Speedstep&nbsp;技术的&nbsp;CPU&nbsp;驱动程序的实现前文在讨论cpufreq&nbsp;的软件结构时已经指出,&nbsp;cpufreq&nbsp;从设计上将&nbsp;CPU&nbsp;变频的&nbsp;policy&nbsp;与mechanism&nbsp;分离开来并由上层的governor&nbsp;负责决定&nbsp;CPU&nbsp;合适的工作频率。但是在governor根据系统负载的变化决定调整&nbsp;CPU&nbsp;的运行频率时,最终还是需要底层与&nbsp;CPU&nbsp;相关的特定驱动程序完成设置&nbsp;CPU&nbsp;运行频率的任务。这里向读者介绍一下支持&nbsp;Intel&nbsp;最新的Enhanced&nbsp;Speedstep&nbsp;技术的&nbsp;CPU&nbsp;驱动程序的实现原理,关注的重点是如何对&nbsp;CPU&nbsp;进行变频设置。实际上支持&nbsp;Intel&nbsp;Enhanced&nbsp;Speedstep&nbsp;技术的处理器为用户提供了非常简单的编程接口,对&nbsp;CPU&nbsp;运行频率进行设置是通过一个名为&nbsp;IA32_PERF_CTL&nbsp;的MSR&nbsp;寄存器进行的,另外还有一个名为&nbsp;IA32_PERF_STATUS&nbsp;的MSR&nbsp;寄存器可供检查&nbsp;CPU&nbsp;当前所处的运行频率。当用户需要对CPU&nbsp;运行频率进行设置时只需按照&nbsp;Intel&nbsp;开发手册的说明向IA32_PERF_CTL&nbsp;MSR&nbsp;寄存器中写入规定的数值即可。&nbsp;<br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;总结及未来的发展方向&nbsp;<br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本文为读者介绍了变频技术在&nbsp;CPU&nbsp;硬件上的出现以及&nbsp;Linux&nbsp;内核中最初的实现存在的各种问题,并由此导致了&nbsp;cpufreq&nbsp;这一新的内核子系统的诞生。虽然早期的cpufreq模块所提供的三种&nbsp;governors&nbsp;能够在一定程度下满足用户的需要并且提供了一定的灵活性,但是由于受到当时&nbsp;CPU&nbsp;硬件技术水平的限制,仍然有很多不尽如人意的地方。之后随着&nbsp;CPU&nbsp;变频硬件技术的不断发展,尤其是&nbsp;Intel&nbsp;Enhanced&nbsp;Speedstep&nbsp;技术的出现,原有的技术障碍被打破,随之而来的是&nbsp;cpufreq&nbsp;内核子系统有了一个全新的更加完善而高效的&nbsp;ondemand&nbsp;governor&nbsp;。&nbsp;<br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由此不难看出,内核中的&nbsp;cpufreq&nbsp;子系统是由于&nbsp;CPU&nbsp;硬件变频技术的出现而出现,同时也在随着&nbsp;CPU&nbsp;硬件变频技术的发展而发展。这其实也预示着内核中&nbsp;cpufreq&nbsp;子系统未来的发展方向,即继续跟随&nbsp;CPU&nbsp;硬件变频技术的发展脚步与时俱进。在本文的最后简单为读者介绍一下在&nbsp;Intel&nbsp;最新的&nbsp;CPU&nbsp;中针对硬件变频支持的一项新技术。前文提到在支持&nbsp;Intel&nbsp;最新的Enhanced&nbsp;Speedstep&nbsp;技术的&nbsp;CPU&nbsp;中提供了名字分别为IA32_MPERF&nbsp;和&nbsp;IA32_APERF&nbsp;的两个&nbsp;MSR&nbsp;寄存器,以便为cpufreq&nbsp;模块所使用的&nbsp;governor&nbsp;动态收集系统的负载情况提供直接的硬件支持。其中&nbsp;IA32_APERF&nbsp;MSR&nbsp;寄存器当&nbsp;CPU&nbsp;处在ACPI&nbsp;C0&nbsp;状态下时按照&nbsp;CPU&nbsp;硬件当前的实际运行频率每隔一个时钟周期加一。&nbsp;Intel&nbsp;最新的处理器中进一步考虑了CPU&nbsp;在运行过程中由于访问内存或&nbsp;IO&nbsp;等原因可能会出现流水线停摆的状况时,&nbsp;IA32_APERF&nbsp;以前这种简单的按照&nbsp;CPU&nbsp;当前实际运行频率每隔一个时钟周期加一的做法并不能完全准确的反映CPU&nbsp;的负载情况。在&nbsp;Intel&nbsp;最新的处理器中如果出现流水线停摆的情况,&nbsp;IA32_APERF&nbsp;将暂时停止累加,而是在对用户真正“有用”的时间周期才会递增,这样&nbsp;CPU&nbsp;硬件就可以为cpufreq&nbsp;模块所使用的&nbsp;governor&nbsp;提供比以前更加准确的系统负载统计信息。<br />
msleep 发表于 2009-4-8 10:15 | 显示全部楼层

好文件,多谢分享

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

95

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部