通过智能活动监视器降低 PC 的功耗

2019-07-14 03:44发布

了解如何通过监视应用程序使用模式和用户活动降低 Linux® 计算机中的功耗。
现代计算机中内置的高级电源配置管理界面(Advanced Configuration and Power Interface,ACPI)和电源配置系统为降低整体功耗提供了各种方法。Linux 及其相关用户空间程序配有大量可以在各种环境下控制 PC 功耗所需的工具。 目前的大多数文档主要介绍如何修改内核参数及 hdparm 设置以减少不必要的磁盘活动。此外,还有丰富的文档可供更改处理器设置时参考,从而最大程度地发挥基于当前电源动态调整频率的优点。 本文提供了通过监视应用程序使用模式构建这些能够节省能源的工具和代码。使用本文提供的技术,根据焦点中的应用程序、用户活动及一般系统性能更改电源设置。 硬件和软件要求 2000 年以后制造的所有 PC 都应当能够提供降低功耗的硬件和软件。您需要一个新 Linux 内核,并且它将有助于获得内置有许多节能工具的 Linux 发行版。不过,关闭屏幕或者触发自动关机就可以提供显著的节能优点。如果您拥有的硬件较旧或者不具有 ACPI 功能,应当仍然会发现本文提供的代码十分有用。 虽然演示所使用的是针对直接输入设计的 PC,但是服务器或远程终端也可以使用相同的概念来根据用户活动降低功耗。



回页首

focusTracker.pl 程序 通过监视应用程序使用情况来降低功耗可以采取许多形式。在本文中,第一步是识别与 “费电” 相关的典型使用模式,然后在检测到这些模式时激活节电模式。清单 1 中的 focusTracker.pl 程序包含了启动识别过程的代码。
清单 1. focusTracker.pl 程序头文件

#!/usr/bin/perl -w
# focusTracker.pl - collect focus data for usage visualizations
use strict;
use X11::GUITest qw( :ALL ); # find application focus
use threads; # non blocking reads from xev
use Thread::Queue; # non blocking reads from xev
$SIG{INT} = /&printHeader; # print header file to stderr on exit

$|=1; # non-buffered output
my %log = (); # focus tracking data structure
my $lastId = ""; # last focused window id
my $pipe = ""; # non blocking event reads via xev
my _cnnew1_cnnew1@win = (); # binary activity data for maxWindows applications
my $cpu = ""; # cpu usage from iostat
my $mbread_s = ""; # disk read mb/s from iostat
my $totalWindow = 0; # total used windows
my $maxWindows = 50; # total tracked windows

除了必要的模块包含及变量声明之外,信号中断捕捉程序被定义为允许输出每个数据运行的相关的头文件。这种数据与头文件的分离使您可以更轻松地使用诸如 kst 之类的工具进行可视化处理。清单 2 显示了主处理循环的开头。
清单 2. focusTracker.pl 主循环开始

while(my $line = )
{
for my $c (0..$maxWindows){ $win[$c] = 0 } #initialize all data positions

next if( $line =~ /Linux/ || length($line) < 10 ); # header line, empty line

my $windowId = GetInputFocus();
my $windowName = GetWindowName( $windowId ) || "NoWindowName";

if( ! exists($log{$windowId}) )
{
# if this is a new window, assign it to the next position in the data set
$log{ $windowId }{ order } = $totalWindow;
$log{ $windowId }{ name } = $windowName;
$totalWindow++ if( $totalWindow < $maxWindows );

}# if a newly tracked window

每次从 stdin 中读取时,当前的焦点二进制数据(存储于 @win 中)将被重设为 0。每次在以前从未获得过焦点的窗口获得焦点时,系统都会把它的位置及名称记录到 %log 散列中。此步骤是将正确的焦点/非焦点数据与相应的窗口名称关联在一起的关键。清单 3 显示了输入读取的附加部分以及通道(pipe)管理的开头。
清单 3. focusTracker.pl 通道管理



本文转自IBM Developerworks中国       请点击此处查看全文