[ZLG-ARM] 谢谢分享!好**!

[复制链接]
1623|1
 楼主| 胡刚 发表于 2009-4-6 16:50 | 显示全部楼层 |阅读模式
&nbsp;内核中的&nbsp;cpufreq&nbsp;子系统通过&nbsp;sysfs&nbsp;文件系统向上层应用提供了用户接口,对于系统中的每一个&nbsp;CPU&nbsp;而言,其&nbsp;cpufreq&nbsp;的&nbsp;sysfs&nbsp;用户接口位于&nbsp;/sys/devices/system/cpu/cpuX/cpufreq/&nbsp;目录下,其中&nbsp;X&nbsp;代表&nbsp;processor&nbsp;id&nbsp;,与&nbsp;/proc/cpuinfo&nbsp;中的信息相对应。以cpu0&nbsp;为例,用户一般会在该目录下观察到以下文件:&nbsp;<br /><br /><br /><br />$&nbsp;ls&nbsp;-F&nbsp;/sys/devices/system/cpu/cpu0/cpufreq/&nbsp;<br />affected_cpus&nbsp;<br />cpuinfo_cur_freq&nbsp;<br />cpuinfo_max_freq&nbsp;<br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpuinfo_min_freq&nbsp;<br />ondemand/&nbsp;<br />scaling_available_frequencies&nbsp;<br />scaling_available_governors&nbsp;<br />scaling_cur_freq&nbsp;<br />scaling_driver&nbsp;<br />scaling_governor&nbsp;<br />scaling_max_freq&nbsp;<br />scaling_min_freq&nbsp;<br />stats/&nbsp;<br />&nbsp;&nbsp;<br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这其中的所有可读文件都可以使用&nbsp;cat&nbsp;命令进行读操作,另外所有可写文件都可以使用&nbsp;echo&nbsp;命令进行写操作。其中cpuinfo_max_freq&nbsp;和&nbsp;cpuinfo_min_freq&nbsp;分别给出了CPU&nbsp;硬件所支持的最高运行频率及最低运行频率,&nbsp;cpuinfo_cur_freq&nbsp;则会从&nbsp;CPU&nbsp;硬件寄存器中读取&nbsp;CPU&nbsp;当前所处的运行频率。虽然&nbsp;CPU&nbsp;硬件支持多种不同的运行频率,但是在有些场合下用户可以只选择使用其中的一个子集,这种控制是通过scaling_max_freq&nbsp;和&nbsp;scaling_min_freq&nbsp;进行的。Governor在选择合适的运行频率时只会在&nbsp;scaling_max_freq&nbsp;和scaling_min_freq&nbsp;所确定的频率范围内进行选择,这也就是scaling_available_frequencies&nbsp;所显示的内容。与cpuinfo_cur_freq&nbsp;不同,&nbsp;scaling_cur_freq&nbsp;返回的是cpufreq&nbsp;模块缓存的&nbsp;CPU&nbsp;当前运行频率,而不会对&nbsp;CPU&nbsp;硬件寄存器进行检查。&nbsp;scaling_available_governors&nbsp;会告诉用户当前有哪些&nbsp;governors&nbsp;可供用户使用,而&nbsp;scaling_driver&nbsp;则会显示该&nbsp;CPU&nbsp;所使用的变频驱动程序。&nbsp;Stats&nbsp;目录下给出了对&nbsp;CPU&nbsp;各种运行频率的使用统计情况,例如&nbsp;CPU&nbsp;在各种频率下的运行时间以及在各种频率之间的变频次数。&nbsp;Ondemand&nbsp;目录则与&nbsp;ondemand&nbsp;governor&nbsp;相关,在后文会进行相应的介绍。&nbsp;<br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过以上的介绍,大家对如何使用&nbsp;cpufreq&nbsp;通过&nbsp;sysfs&nbsp;提供的用户接口已经有了大致的了解,但是对于绝大部分用户而言,逐一操作这些文件既费力又耗时。因此&nbsp;Dominik&nbsp;等人开发了cpufrequtils&nbsp;工具包[2],为用户提供了更加简便的对内核cpufreq&nbsp;子系统的操作接口。通过&nbsp;cpufreq-info&nbsp;的输出,读者可以很清楚的看到刚刚在上面介绍过的/sys/devices/system/cpu/cpuX/cpufreq/&nbsp;目录下各个文件的内容。&nbsp;<br /><br /><br /><br />$&nbsp;cpufreq-info&nbsp;<br />cpufrequtils&nbsp;002:&nbsp;cpufreq-info&nbsp;(C)&nbsp;Dominik&nbsp;Brodowski&nbsp;<br /><br /><br /><br />2004-2006&nbsp;<br />Report&nbsp;errors&nbsp;and&nbsp;bugs&nbsp;to&nbsp;linux@brodo.de,&nbsp;please.&nbsp;<br />analyzing&nbsp;CPU&nbsp;0:&nbsp;<br />&nbsp;&nbsp;driver:&nbsp;acpi-cpufreq&nbsp;<br />&nbsp;&nbsp;CPUs&nbsp;which&nbsp;need&nbsp;to&nbsp;switch&nbsp;frequency&nbsp;at&nbsp;the&nbsp;same&nbsp;time:&nbsp;<br /><br /><br /><br />0&nbsp;1&nbsp;<br />&nbsp;&nbsp;hardware&nbsp;limits:&nbsp;1000&nbsp;MHz&nbsp;-&nbsp;1.67&nbsp;GHz&nbsp;<br />&nbsp;&nbsp;available&nbsp;frequency&nbsp;steps:&nbsp;1.67&nbsp;GHz,&nbsp;1.33&nbsp;GHz,&nbsp;1000&nbsp;<br /><br /><br /><br />MHz&nbsp;<br />&nbsp;&nbsp;available&nbsp;cpufreq&nbsp;governors:&nbsp;userspace,&nbsp;conservative,&nbsp;<br /><br /><br /><br />ondemand,&nbsp;powersave,&nbsp;performance&nbsp;<br />&nbsp;&nbsp;current&nbsp;policy:&nbsp;frequency&nbsp;should&nbsp;be&nbsp;within&nbsp;1000&nbsp;MHz&nbsp;<br /><br /><br /><br />and&nbsp;1.67&nbsp;GHz.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;governor&nbsp;&quot;ondemand&quot;&nbsp;may&nbsp;decide&nbsp;which&nbsp;<br /><br /><br /><br />speed&nbsp;to&nbsp;use&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;within&nbsp;this&nbsp;range.&nbsp;<br />&nbsp;&nbsp;current&nbsp;CPU&nbsp;frequency&nbsp;is&nbsp;1000&nbsp;MHz.&nbsp;<br />analyzing&nbsp;CPU&nbsp;1:&nbsp;<br />&nbsp;&nbsp;driver:&nbsp;acpi-cpufreq&nbsp;<br />&nbsp;&nbsp;CPUs&nbsp;which&nbsp;need&nbsp;to&nbsp;switch&nbsp;frequency&nbsp;at&nbsp;the&nbsp;same&nbsp;time:&nbsp;<br /><br /><br /><br />0&nbsp;1&nbsp;<br />&nbsp;&nbsp;hardware&nbsp;limits:&nbsp;1000&nbsp;MHz&nbsp;-&nbsp;1.67&nbsp;GHz&nbsp;<br />&nbsp;&nbsp;available&nbsp;frequency&nbsp;steps:&nbsp;1.67&nbsp;GHz,&nbsp;1.33&nbsp;GHz,&nbsp;1000&nbsp;<br /><br /><br /><br />MHz&nbsp;<br />&nbsp;&nbsp;available&nbsp;cpufreq&nbsp;governors:&nbsp;userspace,&nbsp;conservative,&nbsp;<br /><br /><br /><br />ondemand,&nbsp;powersave,&nbsp;performance&nbsp;<br />&nbsp;&nbsp;current&nbsp;policy:&nbsp;frequency&nbsp;should&nbsp;be&nbsp;within&nbsp;1000&nbsp;MHz&nbsp;<br /><br /><br /><br />and&nbsp;1.67&nbsp;GHz.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;governor&nbsp;&quot;ondemand&quot;&nbsp;may&nbsp;decide&nbsp;which&nbsp;<br /><br /><br /><br />speed&nbsp;to&nbsp;use&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;within&nbsp;this&nbsp;range.&nbsp;<br />&nbsp;&nbsp;current&nbsp;CPU&nbsp;frequency&nbsp;is&nbsp;1000&nbsp;MHz.&nbsp;<br /><br /><br /><br /><br />&nbsp;&nbsp;<br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ondemand&nbsp;governor&nbsp;的由来及其实现刚刚我们在&nbsp;cpufreq-info&nbsp;的输出中可以看到&nbsp;cpufreq&nbsp;子系统一共提供了五种&nbsp;governors&nbsp;供用户选择使用,它们分别是&nbsp;userspace,conservative,ondemand,powersave&nbsp;和performance。在最新的内核中如果用户不进行额外设置的话,ondemand&nbsp;会被作为默认的&nbsp;governor&nbsp;使用。为了理解是什么原因造成了这种现状,我们在这里带领读者回顾一下&nbsp;cpufreq&nbsp;子系统中的governor在内核中的开发历史。&nbsp;<br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cpufreq&nbsp;作为一个子系统最早被加入到&nbsp;Linux&nbsp;内核中时只配备了三个governors&nbsp;,分别是performance、powersave&nbsp;和userspace。当用户选择使用&nbsp;performance&nbsp;governor&nbsp;时,CPU会固定工作在其支持的最高运行频率上;当用户选择使用powersave&nbsp;governor&nbsp;时,CPU会固定工作在其支持的最低运行频率上。因此这两种&nbsp;governors&nbsp;都属于静态&nbsp;governor&nbsp;,即在使用它们时&nbsp;CPU&nbsp;的运行频率不会根据系统运行时负载的变化动态作出调整。这两种&nbsp;governors&nbsp;对应的是两种极端的应用场景,使用&nbsp;performance&nbsp;governor&nbsp;体现的是对系统高性能的最大追求,而使用&nbsp;powersave&nbsp;governor&nbsp;则是对系统低功耗的最大追求。虽然这两种应用需求确实存在,但大多数用户在大部分时间里需要的是更加灵活的变频策略。最早的&nbsp;cpufreq&nbsp;子系统通过&nbsp;userspace&nbsp;governor&nbsp;为用户提供了这种灵活性。正如它的名字一样,使用&nbsp;userspace&nbsp;governor&nbsp;时,系统将变频策略的决策权交给了用户态应用程序,并提供了相应的接口供用户态应用程序调节&nbsp;CPU&nbsp;运行频率使用。通过使用&nbsp;cpufrequtils&nbsp;工具包中的&nbsp;cpufreq-set&nbsp;将&nbsp;userspace&nbsp;设置为&nbsp;cpufreq&nbsp;子系统所使用的&nbsp;governor&nbsp;后,我们可以看到与之前相比在&nbsp;/sys/devices/system/cpu/cpuX/cpufreq/&nbsp;目录下多出了一个名为&nbsp;scaling_setspeed&nbsp;的文件,这正是&nbsp;userspace&nbsp;governor&nbsp;所提供的特殊用户接口。用户可以通过向该文件写入任何一个&nbsp;scaling_available_frequencies&nbsp;中所支持的运行频率,从而将&nbsp;CPU&nbsp;设置在该频率下运行。&nbsp;<br /><br /><br /><br />#&nbsp;cpufreq-set&nbsp;-g&nbsp;userspace&nbsp;<br />#&nbsp;cat&nbsp;cpuinfo_cur_freq&nbsp;<br />1000000&nbsp;<br />#&nbsp;cat&nbsp;scaling_available_frequencies&nbsp;<br />1667000&nbsp;1333000&nbsp;1000000&nbsp;<br />#&nbsp;echo&nbsp;1333000&nbsp;&gtscaling_setspeed&nbsp;<br />#&nbsp;cat&nbsp;cpuinfo_cur_freq&nbsp;<br />1333000&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;刚刚提到在使用&nbsp;userspace&nbsp;governor&nbsp;时,系统将变频策略的决策权交给了用户态应用程序。该用户态应用程序一般是一个&nbsp;daemon&nbsp;程序,每隔一定的时间间隔收集一次系统信息并根据系统的负载情况使用&nbsp;userspace&nbsp;governor&nbsp;提供的&nbsp;scaling_setspeed&nbsp;接口动态调整&nbsp;CPU&nbsp;的运行频率。作为这个daemon&nbsp;程序,当时在几个主要的&nbsp;Linux&nbsp;发行版中使用的一般是&nbsp;powersaved&nbsp;或者&nbsp;cpuspeed。这两个&nbsp;daemon&nbsp;程序一般每隔几秒钟统计一次&nbsp;CPU&nbsp;在这个采样周期内的负载情况,并根据统计结果调整&nbsp;CPU&nbsp;的运行频率。这种&nbsp;userspace&nbsp;governor&nbsp;加用户态&nbsp;daemon&nbsp;程序的变频方法虽然为用户提供了一定的灵活性,但通过开源社区的广泛使用所得到的意见反馈逐渐暴露了这种方法的两个严重缺陷。第一个是性能方面的问题。例如powersaved&nbsp;每隔五秒钟进行一次系统负载情况的采样分析的话,我们可以分析一下在下面给出的应用场景中的用户体验。假设&nbsp;powersaved&nbsp;的采样分析刚刚结束,而且由于在刚刚结束的采样周期内系统负载很低,CPU&nbsp;被设置在最低频率上运行。这时用户如果打开&nbsp;Firefox&reg;&nbsp;等对&nbsp;CPU&nbsp;运算能力要求相当高的程序的话,powersaved&nbsp;要在下一个采样点——大约五秒钟之后才有机会观察到这种提高&nbsp;CPU&nbsp;运行频率的需求。也就是说,在Firefox&nbsp;启动之初的五秒钟内&nbsp;CPU&nbsp;的计算能力并没有被充分发挥出来,这无疑会使用户体验大打折扣。第二个是系统负载情况的采样分析的准确性问题。将监控系统负载情况并对未来&nbsp;CPU&nbsp;的性能需求做出判断的任务交给一个用户态程序完成实际上并不合理,一方面是由于一个用户态程序很难完整的收集到所有需要的信息,因为这些信息大部分都保存在内核空间;另一方面一个用户态程序如果想要收集这些系统信息,必然需要进行用户态与内核态之间的数据交互,而频繁的用户态与内核态之间的数据交互又会给系统性能带来负面影响。&nbsp;<br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;那么这两个问题有没有解决的方法呢?应该讲社区中的开发人员就第二个问题比较容易达成一致,既然在用户态对系统的负载情况进行采集和分析存在这样那样的问题,那么更加合理的做法就是应该将这部分工作交由内核负责。但是第一个问题呢?第一个问题最直观的解决方案就是降低对系统负载进行采样分析的时间间隔,这样&nbsp;powersaved&nbsp;就能尽早的对系统负载的变化做出及时的响应。然而这种简单的降低采样分析的时间间隔的方案同样存在着两方面的问题,一方面这意味着更加频繁的用户态与内核态之间的数据交互,因此必然也就意味着对系统性能带来更大的负面影响;另一方面的主要原因在于当时各个&nbsp;CPU&nbsp;生产厂家的变频技术在硬件上仍不完善,具体体现就是在对&nbsp;CPU&nbsp;进行变频设置时所需的操作时间过长,例如&nbsp;Intel&nbsp;早期的&nbsp;Speedstep&nbsp;技术在对&nbsp;CPU&nbsp;进行变频设置时需要耗时&nbsp;250&nbsp;微秒,在此过程中&nbsp;CPU&nbsp;无法正常执行指令。读者如果简单的计算一下不难发现,即使对于一个主频为&nbsp;1GHz&nbsp;的&nbsp;CPU&nbsp;而言,&nbsp;250&nbsp;微秒也意味着&nbsp;250,000&nbsp;个时钟周期,在这期间&nbsp;CPU&nbsp;完全可以执行完上万条指令。因此从这个角度而言,简单的降低采样分析的时间间隔对系统性能带来的负面影响更加严重。幸运的是随着硬件技术的不断完善和改进,对&nbsp;CPU&nbsp;进行变频设置所需的操作时间已经显著降低,例如&nbsp;Intel&nbsp;最新的&nbsp;Enhanced&nbsp;Speedstep&nbsp;技术在对&nbsp;CPU&nbsp;进行变频设置时耗时已降至&nbsp;10&nbsp;微秒,下降了不止一个数量级。正是这种&nbsp;CPU&nbsp;硬件技术的发展为内核开发人员解决这些早期的遗留问题提供了契机,Venkatesh&nbsp;等人提出并设计实现了一个新的名为&nbsp;ondemand&nbsp;的&nbsp;governor&nbsp;,它正是人们长期以来希望看到的一个完全在内核态下工作并且能够以更加细粒度的时间间隔对系统负载情况进行采样分析的&nbsp;governor。在介绍&nbsp;ondemand&nbsp;governor&nbsp;的具体实现之前,我们先来看一下如何使用&nbsp;ondemand&nbsp;governor&nbsp;及其向用户提供了哪些操作接口。通过&nbsp;cpufreq-set&nbsp;将&nbsp;ondemand&nbsp;设置为当前所使用的&nbsp;governor&nbsp;之后,在&nbsp;/sys/devices/system/cpu/cpuX/cpufreq&nbsp;目录下会出现一个名为&nbsp;ondemand&nbsp;的子目录<br />
msleep 发表于 2009-4-8 10:00 | 显示全部楼层

谢谢分享!好**!

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

本版积分规则

26

主题

95

帖子

0

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