问题描述
我的桌面始终保持打开状态。它既充当服务器,又执行其他semi-essential家庭任务。在白天,它使用OnDemand CPU设置。这实际上只是根据需要扩展CPU频率,这对我来说真的很好。
到了晚上,它飞来飞去。当然,大多数情况下,它会以低功耗空转,但是偶尔,它会逐渐增加以执行某些操作。我希望它保留在PowerSave上,而任务被迫花费更长的时间才能完成。
另外,我有一张Nvidia卡(GTX 580),它可以在一年中消耗与非洲小村庄所使用的电量相同的电量(向Minecraft炫耀)。由于未知的原因(毫无疑问在桌面上发生了什么),这种情况逐渐增加,风扇发出的声音听起来就像是他们在充电以将激光发射到太空。在晚上的时候,我想尽量降低卡的频率。
我考虑过使用简单的root-run cron脚本来完成这些任务,但是我的工作时间是可变的。上周我每周工作近70个小时,所以我每天很早起床,但仍然很晚起床。如果系统以super-underclock模式鸣叫,我会很生气。有什么我想说的吗?
-
晚上10点至9点之间
-
10分钟没有任何鼠标/键盘活动
-
没有电影在播放
如果这些条件之一不成立,则需要立即还原时钟。我不想等待cron-script出现,以将计算机从休眠状态唤醒。同样,一旦所有这些都成为现实,它就应该回到睡眠状态。
我有什么选择?
最佳办法
这是一个满足您需求的程序:
#!/usr/bin/env python
# coding: utf8
import time
import sys
import commands
USER = commands.getoutput("cat /var/log/auth.log | grep " +
sys.argv[0]).split("sudo:")[1].split()[0].strip()
def is_idle():
return int(commands.getoutput("xprintidle")) >= 10 * 60 * 1000
def is_night():
return time.localtime().tm_hour in (22, 23, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
def is_stumm():
return "RUNNING" not in commands.getoutput(("sudo -u %s pacmd " +
"list-sinks | grep RUNNING") % USER)
def main():
powersave = False
while 1:
if is_idle() and is_night() and is_stumm():
if not powersave:
print "going into powersave mode"
commands.getoutput("echo powersave > " +
"/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor")
powersave = True
else:
if powersave:
print "going into ondemand mode"
commands.getoutput("echo ondemand > " +
"/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor")
powersave = False
time.sleep(0.5)
if __name__ == '__main__':
assert commands.getstatusoutput("xprintidle")[0] == 0, (
"you need to `sudo apt-get install xprintidle`")
assert commands.getoutput("whoami") == "root", (
"you need to be root to run this program")
main()
注意您的偏好:
-
... >= 10 * 60 * 1000
-
... tm_hour in (22, 23, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
和 -
"RUNNING" not in ...
我正在使用Pulseaudio来查找电影是否正在播放。这也会影响音乐。
次佳办法
您可以使用以下方法强制执行cpu缩放:
cpufreq-selector -f [frequency]
还有其他一些选项(即特定的cpu或选择管理方式而不是速度),这确实是假设您的主板/cpu允许Ubuntu手动控制缩放比例(显然并非总是如此)。
其余的可以使用脚本来应用,但是您对它的要求很高。如果您需要即时响应,我认为您必须定期轮询系统。根据我的有限知识,没有什么可以宣布您指定的条件。
屏幕保护程序是开始调查的地方。在设定的不活动时间(这在晚上10点至上午9点也是如此)之后会打开,并且可以由电影播放器禁止。如果您创建了一个在初始化时按比例缩小CPU的屏幕保护程序,并在唤醒后将其还原,那么您将拥有所需的功能。
不幸的是,这是我能带给您的,对屏保及其工作方式一无所知。
祝好运。
第三种办法
您实际上可能不会通过使用节电控制器来节省更多电量。
根据您的工作负载,通过花费更多的功率来快速完成工作项目,然后返回到深度睡眠状态,而不是在降低功耗的情况下长时间工作,可能会带来更好的结果。
根据您的应用程序,还可能需要安装功率要求较低的专用服务器,并为该负载安装适当尺寸的电源,并在晚上简单地关闭台式机。
第四种办法
powernap是处理此类问题的便捷工具,它的优点是它在进程表中查看系统是否忙碌,而不是键盘空闲时间。
您是否测量了每个调速器的节能量?像西蒙一样,我也怀疑这会增加很多,而不是更快地完成工作或试图调整诸如怪物视频卡之类的东西。
可以将powernap配置为仅执行调节器开关,或者如果您的硬件支持,可以使用Wake On Lan(WOL)功能在深夜进行小睡,直到需要时为止。
-
作者的Blog post。