当前位置: 首页>>技术教程>>正文


晚上强制降频

问题描述

我的桌面始终保持打开状态。它既充当服务器,又执行其他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)功能在深夜进行小睡,直到需要时为止。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/11728.html,未经允许,请勿转载。