频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

Linux 2.6 内核中的最新电源管理技术综述

来源:中国IT实验室 作者:佚名 出处:巧巧读书 2008-05-14 进入讨论组
上一页 1 2 

刚刚提到在使用 userspace governor 时,系统将变频策略的决策权交给了用户态应用程序。该用户态应用程序一般是一个 daemon 程序,每隔一定的时间间隔收集一次系统信息并根据系统的负载情况使用 userspace governor 提供的 scaling_setspeed 接口动态调整 CPU 的运行频率。

作为这个 daemon 程序,当时在几个主要的 Linux 发行版中使用的一般是 powersaved 或者 cpuspeed。这两个 daemon 程序一般每隔几秒钟统计一次 CPU 在这个采样周期内的负载情况,并根据统计结果调整 CPU 的运行频率。这种 userspace governor 加用户态 daemon 程序的变频方法虽然为用户提供了一定的灵活性,但通过开源社区的广泛使用所得到的意见反馈逐渐暴露了这种方法的两个严重缺陷。第一个是性能方面的问题。例如 powersaved 每隔五秒钟进行一次系统负载情况的采样分析的话,我们可以分析一下在下面给出的应用场景中的用户体验。假设 powersaved 的采样分析刚刚结束,而且由于在刚刚结束的采样周期内系统负载很低,CPU 被设置在最低频率上运行。这时用户如果打开 Firefox? 等对 CPU 运算能力要求相当高的程序的话,powersaved 要在下一个采样点——大约五秒钟之后才有机会观察到这种提高 CPU 运行频率的需求。也就是说,在 Firefox 启动之初的五秒钟内 CPU 的计算能力并没有被充分发挥出来,这无疑会使用户体验大打折扣。第二个是系统负载情况的采样分析的准确性问题。将监控系统负载情况并对未来 CPU 的性能需求做出判断的任务交给一个用户态程序完成实际上并不合理,一方面是由于一个用户态程序很难完整的收集到所有需要的信息,因为这些信息大部分都保存在内核空间;另一方面一个用户态程序如果想要收集这些系统信息,必然需要进行用户态与内核态之间的数据交互,而频繁的用户态与内核态之间的数据交互又会给系统性能带来负面影响。

那么这两个问题有没有解决的方法呢?应该讲社区中的开发人员就第二个问题比较容易达成一致,既然在用户态对系统的负载情况进行采集和分析存在这样那样的问题,那么更加合理的做法就是应该将这部分工作交由内核负责。但是第一个问题呢?第一个问题最直观的解决方案就是降低对系统负载进行采样分析的时间间隔,这样 powersaved 就能尽早的对系统负载的变化做出及时的响应。然而这种简单的降低采样分析的时间间隔的方案同样存在着两方面的问题,一方面这意味着更加频繁的用户态与内核态之间的数据交互,因此必然也就意味着对系统性能带来更大的负面影响;另一方面的主要原因在于当时各个 CPU 生产厂家的变频技术在硬件上仍不完善,具体体现就是在对 CPU 进行变频设置时所需的操作时间过长,例如 Intel 早期的 Speedstep 技术在对 CPU 进行变频设置时需要耗时 250 微秒,在此过程中 CPU 无法正常执行指令。读者如果简单的计算一下不难发现,即使对于一个主频为 1GHz 的 CPU 而言, 250 微秒也意味着 250,000 个时钟周期,在这期间 CPU 完全可以执行完上万条指令。因此从这个角度而言,简单的降低采样分析的时间间隔对系统性能带来的负面影响更加严重。幸运的是随着硬件技术的不断完善和改进,对 CPU 进行变频设置所需的操作时间已经显着降低,例如 Intel 最新的 Enhanced Speedstep 技术在对 CPU 进行变频设置时耗时已降至 10 微秒,下降了不止一个数量级。正是这种 CPU 硬件技术的发展为内核开发人员解决这些早期的遗留问题提供了契机,Venkatesh 等人提出并设计实现了一个新的名为 ondemand 的 governor ,它正是人们长期以来希望看到的一个完全在内核态下工作并且能够以更加细粒度的时间间隔对系统负载情况进行采样分析的 governor。在介绍 ondemand governor 的具体实现之前,我们先来看一下如何使用 ondemand governor 及其向用户提供了哪些操作接口。通过 cpufreq-set 将 ondemand 设置为当前所使用的 governor 之后,在 /sys/devices/system/cpu/cpuX/cpufreq 目录下会出现一个名为 ondemand 的子目录

$ sudo cpufreq-set -g ondemand
$ ls /sys/devices/system/cpu/cpu0/cpufreq/ondemand/
ignore_nice_load
powersave_bias
sampling_rate
sampling_rate_max
sampling_rate_min
up_threshold
$ sudo cat sampling_rate_min sampling_rate sampling_rate_max
40000
80000
40000000
$ sudo cat up_threshold
30

在这个子目录下名字以 sampling 打头的三个文件分别给出了 ondemand governor 允许使用的最短采样间隔,当前使用的采样间隔以及允许使用的最长采样间隔,三者均以微秒为单位。以笔者的电脑为例, ondemand governor 每隔 80 毫秒进行一次采样。另外比较重要的一个文件是 up_threshold ,它表明了系统负载超过什么百分比时 ondemand governor 会自动提高 CPU 的运行频率。以笔者的电脑为例,这个数值为 30% 。那么这个表明系统负载的百分比数值是如何得到的呢?在支持 Intel 最新的 Enhanced Speedstep 技术的 CPU 中,在处理器硬件中直接提供了两个 MSR 寄存器(Model Specific Register)供 ondemand governor 采样分析系统负载情况使用。这两个 MSR 寄存器的 名字分别为 IA32_MPERF 和 IA32_APERF[5] ,其中 IA32_MPERF MSR 中的 MPERF 代表 Maximum Performance , IA32_APERF MSR 中的 APERF 代表 Actual Performance 。就像这两个 MSR 的名字一样, IA32_MPERF MSR 寄存器是一个当 CPU 处在 ACPI C0 状态下时按照 CPU 硬件支持的最高运行频率每隔一个时钟周期加一的计数器; IA32_APERF MSR 寄存器是一个当 CPU 处在 ACPI C0 状态下时按照 CPU 硬件当前的实际运行频率每隔一个时钟周期加一的计数器。有了这两个寄存器的存在,再考虑上 CPU 处于 ACPI C0 和处于 ACPI C1、C2、C3 三种状态下的时间比例,也就是 CPU 处于工作状态和休眠状态的时间比例, ondemand governor 就可以准确的计算出 CPU 的负载情况了。

得到了 CPU 的负载情况,接下来的问题就是如何选择 CPU 合适的运行频率了。刚刚在前面提到,当系统负载超过 up_threshold 所设定的百分比时, ondemand governor 将会自动提高 CPU 的运行频率,但是具体提高到哪个频率上运行呢?在 ondemand governor 监测到系统负载超过 up_threshold 所设定的百分比时,说明用户当前需要 CPU 提供更强大的处理能力,因此 ondemand governor 会将CPU设置在最高频率上运行,这一点社区中的开发人员和广大用户都没有任何异议。但是当 ondemand governor 监测到系统负载下降,可以降低 CPU 的运行频率时,到底应该降低到哪个频率呢? ondemand governor 的最初实现是在可选的频率范围内调低至下一个可用频率,例如笔者使用的 CPU 支持三个可选频率,分别为 1.67GHz、 1.33GHz 和 1GHz ,如果 CPU 运行在 1.67GHz 时 ondemand governor 发现可以降低运行频率,那么 1.33GHz 将被选作降频的目标频率。这种降频策略的主导思想是尽量减小对系统性能的负面影响,从而不会使得系统性能在短时间内迅速降低以影响用户体验。但是在 ondemand governor 的这种最初实现版本在社区发布后,大量用户的使用结果表明这种担心实际上是多余的, ondemand governor 在降频时对于目标频率的选择完全可以更加激进。因此最新的 ondemand governor 在降频时会在所有可选频率中一次性选择出可以保证 CPU 工作在 80% 以上负荷的频率,当然如果没有任何一个可选频率满足要求的话则会选择 CPU 支持的最低运行频率。大量用户的测试结果表明这种新的算法可以在不影响系统性能的前提下做到更高效的节能。在算法改进后, ondemand governor 的名字并没有改变,而 ondemand governor 最初的实现也保存了下来,并且由于其算法的保守性而得名 conservative 。


Linux 2.6 内核中的最新电源管理技术综述(图一)

Linux 2.6 内核中的最新电源管理技术综述(图二)



支持 Intel Enhanced Speedstep 技术的 CPU 驱动程序的实现

前文在讨论 cpufreq 的软件结构时已经指出, cpufreq 从设计上将 CPU 变频的 policy 与mechanism 分离开来并由上层的 governor 负责决定 CPU 合适的工作频率。但是在 governor 根据系统负载的变化决定调整 CPU 的运行频率时,最终还是需要底层与 CPU 相关的特定驱动程序完成设置 CPU 运行频率的任务。这里向读者介绍一下支持 Intel 最新的 Enhanced Speedstep 技术的 CPU 驱动程序的实现原理,关注的重点是如何对 CPU 进行变频设置。实际上支持 Intel Enhanced Speedstep 技术的处理器为用户提供了非常简单的编程接口,对 CPU 运行频率进行设置是通过一个名为 IA32_PERF_CTL 的 MSR 寄存器进行的,另外还有一个名为 IA32_PERF_STATUS 的 MSR 寄存器可供检查 CPU 当前所处的运行频率。当用户需要对 CPU 运行频率进行设置时只需按照 Intel 开发手册的说明向 IA32_PERF_CTL MSR 寄存器中写入规定的数值即可。


Linux 2.6 内核中的最新电源管理技术综述(图一)

Linux 2.6 内核中的最新电源管理技术综述(图二)



总结及未来的发展方向

本文为读者介绍了变频技术在 CPU 硬件上的出现以及 Linux 内核中最初的实现存在的各种问题,并由此导致了 cpufreq 这一新的内核子系统的诞生。虽然早期的cpufreq模块所提供的三种 governors 能够在一定程度下满足用户的需要并且提供了一定的灵活性,但是由于受到当时 CPU 硬件技术水平的限制,仍然有很多不尽如人意的地方。之后随着 CPU 变频硬件技术的不断发展,尤其是 Intel Enhanced Speedstep 技术的出现,原有的技术障碍被打破,随之而来的是 cpufreq 内核子系统有了一个全新的更加完善而高效的 ondemand governor 。

由此不难看出,内核中的 cpufreq 子系统是由于 CPU 硬件变频技术的出现而出现,同时也在随着 CPU 硬件变频技术的发展而发展。这其实也预示着内核中 cpufreq 子系统未来的发展方向,即继续跟随 CPU 硬件变频技术的发展脚步与时俱进。在本文的最后简单为读者介绍一下在 Intel 最新的 CPU 中针对硬件变频支持的一项新技术。前文提到在支持 Intel 最新的 Enhanced Speedstep 技术的 CPU 中提供了名字分别为 IA32_MPERF 和 IA32_APERF 的两个 MSR 寄存器,以便为 cpufreq 模块所使用的 governor 动态收集系统的负载情况提供直接的硬件支持。其中 IA32_APERF MSR 寄存器当 CPU 处在 ACPI C0 状态下时按照 CPU 硬件当前的实际运行频率每隔一个时钟周期加一。 Intel 最新的处理器中进一步考虑了 CPU 在运行过程中由于访问内存或 IO 等原因可能会出现流水线停摆的状况时, IA32_APERF 以前这种简单的按照 CPU 当前实际运行频率每隔一个时钟周期加一的做法并不能完全准确的反映 CPU 的负载情况。在 Intel 最新的处理器中如果出现流水线停摆的情况, IA32_APERF 将暂时停止累加,而是在对用户真正“有用”的时间周期才会递增,这样 CPU 硬件就可以为 cpufreq 模块所使用的 governor 提供比以前更加准确的系统负载统计信息。

更多文章 更多内容请看网络管理实用手册Linux集群技术体验Linux的音影世界专题,或进入讨论组讨论。
上一页 1 2 
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章