夜间强制降频

夜间强制降频

我的台式机一直处于开机状态。它充当服务器,还执行其他半必要的家庭任务。白天,它使用 OnDemand CPU 设置。这实际上只是根据需要调整 CPU 频率,这对我来说非常有效。

晚上,它四处飞来飞去。当然,大多数时候它都处于低功率空转状态,但偶尔也会加速运行以执行某些操作。我宁愿它一直处于省电模式,这样任务就不得不花更长的时间才能完成。

此外,我还有一张 Nvidia 显卡(GTX 580),当它需要时,它消耗的电量大约相当于一个非洲小村庄一年的用电量(怒视 Minecraft)。由于未知原因(无疑是桌面上发生了什么),它加速了,风扇听起来就像在充电,准备向太空发射激光。到了晚上,我想尽可能地降低显卡的时钟频率。

我考虑过一个简单的 root 运行 cron 脚本来推动这些工作,但我的工作时间是可变的。上周我工作了近 70 个小时,所以我每天都起得很早,但仍然很晚才睡。如果系统在超级降频模式下发出警报,我会很生气。我是否可以说“如果出现以下情况,则降频:

  • 晚上 10 点到早上 9 点之间
  • 10 分钟内没有任何鼠标/键盘活动
  • 没有正在播放的电影

如果其中一个条件不成立,则降频需要恢复即刻。我不想等待 cron 脚本出现来唤醒计算机。同样,一旦所有这些都成为现实,它就应该重新进入睡眠状态。

我有什么选择?

答案1

这是一个可以完成您想要的操作的程序:

#!/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 来查看电影是否正在播放。这也会影响音乐。

答案2

你可以使用以下命令强制扩展 CPU:

cpufreq-selector -f [frequency]

还有一些其他选项(例如特定的 CPU,或者选择治理而不是速度)这确实假设您的主板/CPU 允许 Ubuntu 手动控制缩放(显然情况并非总是如此。)

其余部分可以使用脚本来应用,但是你对脚本的要求太高了 ^_^。如果你需要即时响应,我认为你必须定期轮询你的系统。据我有限的了解,没有任何东西可以宣布你指定的条件。

不过,首先要研究的是屏幕保护程序。屏幕保护程序会在一段时间不活动后开启(晚上 10 点至早上 9 点也是这样),并且可能会被电影播放器​​禁止。如果您制作了一个屏幕保护程序,在初始化时缩减 CPU 占用,并在唤醒时恢复,那么您就得到了想要的结果。

不幸的是,我只能告诉您这么多,因为我对屏幕保护程序以及其工作原理一无所知。

祝你好运。

答案3

您可能实际上不会通过使用节能州长。

根据您的工作量,通过消耗更多电量然后返回深度睡眠状态来快速完成工作项目,而不是在降低电量消耗的情况下长时间工作,可能会产生更好的结果。

根据您的应用,可能还值得安装一个具有较低功率要求和适当尺寸的电源的专用服务器,并在晚上关闭桌面。

答案4

至于 CPU,你可以使用 CPU 频率缩放监视器小程序等将调节器切换为省电模式。显卡则是另一回事。我知道我的 ATI 卡在 /sys 中有一个旋钮,可以调整低、中、高之间的性能,但摆弄它们似乎没有任何区别,而且经常导致视频变得不稳定。

相关内容