我只想在我的 Ubuntu 8.10机器上运行Folding@home客户端,因为该程序的 RAM 消耗量很大。
“空闲”是指没有用户活动(键盘、鼠标等)时的状态。由于 F@H 具有最低的 CPU 优先级,因此此时运行其他(可能很重的)进程是可以的。重点是改善用户体验,在无人使用机器的情况下做繁重的工作。
如何做到这一点?
我只想在我的 Ubuntu 8.10机器上运行Folding@home客户端,因为该程序的 RAM 消耗量很大。
“空闲”是指没有用户活动(键盘、鼠标等)时的状态。由于 F@H 具有最低的 CPU 优先级,因此此时运行其他(可能很重的)进程是可以的。重点是改善用户体验,在无人使用机器的情况下做繁重的工作。
如何做到这一点?
当有问题的机器是桌面时,您可以将启动/停止脚本挂接到屏幕保护程序中,以便在屏幕保护程序处于非活动状态时停止进程,反之亦然。
安排进程仅在系统空闲时才出现是很繁琐的。
实际上在这些条件下启动程序并不难。您必须安排程序彻底关闭,并弄清楚如何以及何时执行此操作。
您必须能够区分该进程自己的 CPU 使用率和可能正在运行的其他程序的 CPU 使用率,以便您可以判断系统是否正确“空闲”。
仅在系统空闲时才安排进程要容易得多。只需使用“nice”命令启动 Folding@Home 客户端。
但是,这并不能解决内存不足的问题。如果您启用了交换空间,系统应该能够交换任何低优先级的进程,这样它们就不会消耗实际资源,但要注意每次 Folding@Home 客户端都会对磁盘 I/O 造成重大影响换入和换出 RAM。
ps RAM现在很便宜...
pp看这篇文章
可能是您需要通过 nice 设置空闲任务的最低优先级。
您将需要查看一些确定“空闲”的内容并探索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 中的旋钮值还可以很好地指示用户认为什么是空闲的,特别是交换性。我意识到你只在你自己的盒子上这样做,但这是一个权威的维基,问题标题是通用的:)
文件/proc/loadavg具有系统当前负载。您可以编写一个 bash 脚本来检查它,如果它很低,则运行该命令。然后您可以将其添加到 /etc/cron.d 以定期运行它。
此文件包含有关系统负载的信息。前三个数字代表系统上活动任务的数量——实际运行的进程——在过去 1、5 和 15 分钟内的平均值。下一个条目显示当前可运行任务的瞬时数量 - 当前计划运行而不是在系统调用中被阻止的进程 - 以及系统上的进程总数。最后一项是最近运行的进程的进程 ID。
示例输出:
0.55 0.47 0.43 1/210 12437
如果您使用的是 GNOME,请查看以下内容:
https://wiki.gnome.org/Attic/GnomeScreensaver/FrequentlyAskedQuestions
有关检查系统何时空闲(通过 gnome 屏幕保护程序)的 perl 脚本,请参阅此线程。
您可以在怠速开始和停止时运行命令。
我将它与一些脚本一起使用,以在空闲时更改 BOINC 首选项
(为 BOINC 提供更多内存和 cpu 使用率)。
您可以使用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 服务器交互,否则它将在启动后立即被终止。
我想要类似的东西,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