8

我只想在我的 Ubuntu 8.10机器上运行Folding@home客户端,因为该程序的 RAM 消耗量很大。

“空闲”是指没有用户活动(键盘、鼠标等)时的状态。由于 F@H 具有最低的 CPU 优先级,因此此时运行其他(可能很重的)进程是可以的。重点是改善用户体验,在无人使用机器的情况下做繁重的工作。

如何做到这一点?

4

9 回答 9

12

当有问题的机器是桌面时,您可以将启动/停止脚本挂接到屏幕保护程序中,以便在屏幕保护程序处于非活动状态时停止进程,反之亦然。

于 2009-03-07T20:19:37.457 回答
4

安排进程仅在系统空闲时才出现是很繁琐的。

实际上在这些条件下启动程序并不难。您必须安排程序彻底关闭,并弄清楚如何以及何时执行此操作。

您必须能够区分该进程自己的 CPU 使用率和可能正在运行的其他程序的 CPU 使用率,以便您可以判断系统是否正确“空闲”。

仅在系统空闲时才安排进程容易得多。只需使用“nice”命令启动 Folding@Home 客户端。

但是,这并不能解决内存不足的问题。如果您启用了交换空间,系统应该能够交换任何低优先级的进程,这样它们就不会消耗实际资源,但要注意每次 Folding@Home 客户端都会对磁盘 I/O 造成重大影响换入和换出 RAM。

ps RAM现在很便宜...

pp看这篇文章

于 2009-03-07T20:06:36.957 回答
4

可能是您需要通过 nice 设置空闲任务的最低优先级。

于 2009-03-12T09:11:09.830 回答
2

您将需要查看一些确定“空闲”的内容并探索sysinfo()调用(链接指出了它在不同内核版本之间填充的结构的差异)。

Linux 不以典型的方式管理内存。不要只看负载,还要看内存。特别是 /proc/meminfo 有一个以 Committed_AS 开头的精彩行,它向您显示内核实际承诺给其他进程的内存量。将其与您从 sysinfo 中了解到的内容进行比较,您可能会意识到一分钟的平均负载为 0.00 并不意味着该运行某个想要分配 256MB 内存的程序的时间,因为内核可能真的超卖了。注意,由 sysinfo() 填充的所有值都可以通过 /proc 获得,sysinfo() 只是获取它们的一种更简单的方法。

您还想查看自启动以来每个内核在 IOWAIT 中花费了多少时间,这是一个更强有力的指标,表明您是否应该运行 I/O 资源消耗。在 /proc/stat 中获取该信息,第一行包含所有 CPU 的总计数。IOWAIT 在第 6 场。当然,如果您打算为单个 CPU 设置亲和力,那么只有那个 CPU 会感兴趣(它仍然是第六个字段,以 USER_HZ 为单位或通常以 100 秒为单位)。对 btime 进行平均,也可以在 /proc/stat 中找到。

简而言之,不要只看负载平均值。

编辑

您不应该假设缺少用户输入意味着空闲.. cron 作业往往会运行.. 公共服务不时被征税等等。空闲仍然是您根据阅读我上面列出的值(或更多)的最佳猜测.

编辑 2

查看 /proc/sys/vm 中的旋钮值还可以很好地指示用户认为什么是空闲的,特别是交换性。我意识到你只在你自己的盒子上这样做,但这是一个权威的维基,问题标题是通用的:)

于 2009-03-07T20:20:21.277 回答
1

文件/proc/loadavg具有系统当前负载。您可以编写一个 bash 脚本来检查它,如果它很低,则运行该命令。然后您可以将其添加到 /etc/cron.d 以定期运行它。

此文件包含有关系统负载的信息。前三个数字代表系统上活动任务的数量——实际运行的进程——在过去 1、5 和 15 分钟内的平均值。下一个条目显示当前可运行任务的瞬时数量 - 当前计划运行而不是在系统调用中被阻止的进程 - 以及系统上的进程总数。最后一项是最近运行的进程的进程 ID。

示例输出:

0.55 0.47 0.43 1/210 12437
于 2009-03-07T19:54:57.750 回答
1

如果您使用的是 GNOME,请查看以下内容:

https://wiki.gnome.org/Attic/GnomeScreensaver/FrequentlyAskedQuestions

于 2009-10-05T15:59:46.123 回答
0

有关检查系统何时空闲(通过 gnome 屏幕保护程序)的 perl 脚本,请参阅此线程。
您可以在怠速开始和停止时运行命令。
我将它与一些脚本一起使用,以在空闲时更改 BOINC 首选项
(为 BOINC 提供更多内存和 cpu 使用率)。

ubuntu 论坛上的 perl 脚本

于 2009-08-08T07:18:00.550 回答
0

您可以使用xprintidle命令来查看用户是否空闲。该命令将从与 X 服务器的最后一次交互开始以毫秒为单位打印值。

这是用户离开时可以启动/停止任务的示例脚本:

#!/bin/bash

# Wait until user will be idle for provided number of milliseconds
# If user wasn't idle for that amount of time, exit with error
WAIT_FOR_USER_IDLE=60000

# Minimal number of milliseconds after which user will be considered as "idle"
USER_MIN_IDLE_TIME=3000

END=$(($(date +%s%N)/1000000+WAIT_FOR_USER_IDLE))

while [  $(($(date +%s%N)/1000000)) -lt $END ]
do
    if [ $(xprintidle) -gt $USER_MIN_IDLE_TIME ]; then
        eval "$* &"
        PID=$!
        #echo "background process started with pid = $PID"
        while kill -0 $PID >/dev/null 2>&1
        do
            if [ $(xprintidle) -lt $USER_MIN_IDLE_TIME ]; then
                kill $PID
                echo "interrupt"
                exit 1
            fi
            sleep 1
        done
        echo "success"
        exit 0
    fi
    sleep 1
done

当用户空闲时,它将接受所有参数并将它们作为另一个命令执行。如果用户将与 X 服务器交互,那么正在运行的任务将被kill命令杀死。

一个限制 - 您将运行的任务不应与 X 服务器交互,否则它将在启动后立即被终止。

于 2020-08-24T15:44:21.737 回答
0

我想要类似的东西,xprintidle但在我的情况下不起作用(Ubuntu 21.10,Wayland)

我使用以下解决方案来获取空闲电流值(没有鼠标/键盘输入的时间):

dbus-send --print-reply --dest=org.gnome.Mutter.IdleMonitor /org/gnome/Mutter/IdleMonitor/Core org.gnome.Mutter.IdleMonitor.GetIdletime

它应该以毫秒为单位返回 uint64 时间。例子:

$ sleep 3; dbus-send --print-reply --dest=org.gnome.Mutter.IdleMonitor /org/gnome/Mutter/IdleMonitor/Core org.gnome.Mutter.IdleMonitor.GetIdletime
method return time=1644776247.028363 sender=:1.34 -> destination=:1.890 serial=9792 reply_serial=2
uint64 2942 # i.e. 2.942 seconds without input
于 2022-02-13T18:25:34.350 回答