8

プログラムの RAM 消費量が多いため、Ubuntu 8.10 ボックスがアイドル状態のときにのみ、Folding@homeクライアントを実行したいと考えています。

「アイドル」とは、ユーザー アクティビティ (キーボード、マウスなど) がない状態を意味します。F@H の CPU 優先度が最も低いため、他の (おそらく重い) プロセスがその時点で実行されても問題ありません。要点は、ユーザー エクスペリエンスを向上させ、誰もマシンを使用していないときに重い作業を行うことです。

これを達成する方法は?

4

9 に答える 9

12

問題のマシンがデスクトップの場合、開始/停止スクリプトをスクリーンセーバーにフックして、スクリーンセーバーが非アクティブのときにプロセスが停止されるようにすることができます。

于 2009-03-07T20:19:37.457 に答える
4

システムがアイドル状態のときにのみプロセスが存在するように調整するのは面倒です。

実際にそのような状況でプログラムを開始することは、難しいことではありません。プログラムが完全にシャットダウンされるように手配し、それをいつどのように行うかを考え出す必要があります。

そのプロセス自身の CPU 使用率と、実行中の可能性のある他のプログラムの CPU 使用率を区別して、システムが適切に「アイドル状態」であるかどうかを判断できる必要があります。

システムがアイドル状態のときにのみプロセスをスケジュールする方がはるかに簡単です。「nice」コマンドを使用して、Folding@Home クライアントを起動するだけです。

ただし、RAM 不足の問題は解決しません。スワップ スペースが有効になっている場合、システムは優先度の低いプロセスをスワップ アウトして実際のリソースを消費しないようにする必要がありますが、Folding@Home クライアントが毎回ディスク I/O に大きな影響を与えることに注意してください。 RAM のスワップインとスワップアウト。

PS RAMは現在非常に安価です...

pps この記事を参照

于 2009-03-07T20:06:36.957 に答える
2

「アイドル」を判断するためにいくつかのことを確認し、sysinfo()呼び出しも調査する必要があります (リンクは、さまざまなカーネル バージョン間で設定される構造の違いを示しています)。

Linux は、一般的な方法でメモリを管理しません。負荷だけを見るのではなく、メモリを見てください。特に、/proc/meminfo には、Committed_AS で始まる素晴らしい行があり、カーネルが実際に他のプロセスに約束したメモリ量を示しています。これを sysinfo から学んだことと比較すると、1 分間の負荷平均が 0.00 であっても、256MB のメモリを割り当てたいプログラムを実行する時間ではないことに気付くかもしれません。sysinfo() によって埋められたすべての値は /proc 経由で利用できることに注意してください。sysinfo() はそれらを取得するためのより簡単な方法です。

また、ブート以降、各コアが IOWAIT に費やした時間も確認する必要があります。これは、I/O リソースを占有する必要があるかどうかのさらに強力な指標です。/proc/stat でその情報を取得します。最初の行には、すべての CPU の合計数が含まれています。IOWAIT は 6 番目のフィールドにあります。もちろん、単一の CPU にアフィニティを設定する場合は、その CPU のみが重要になります (USER_HZ 単位または通常は 100 分の 1 秒の 6 番目のフィールドです)。/proc/stat にもある btime に対する平均値です。

要するに、負荷平均だけを見ないでください。

編集

ユーザー入力の欠如がアイドル状態を意味すると想定しないでください.. cron ジョブは実行される傾向があります.. 公共サービスは時々課税されます. .

編集2

/proc/sys/vm のノブの値を見ると、ユーザーが何をアイドル状態と考えているか、特に swappiness がよくわかります。あなたが自分のボックスでのみこれを行っていることは承知していますが、これは権威のあるwikiであり、質問のタイトルは一般的です:)

于 2009-03-07T20:20:21.277 に答える
1

GNOME を使用している場合は、次を参照してください。

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

于 2009-10-05T15:59:46.123 に答える
1

ファイル/proc/loadavgには、システムの現在の負荷が含まれています。それをチェックするためにbashスクリプトを書くだけで、それが低い場合はコマンドを実行できます。次に、それを /etc/cron.d に追加して定期的に実行できます。

このファイルには、システム負荷に関する情報が含まれています。最初の 3 つの数値は、システム上でアクティブなタスク (実際に実行されているプロセス) の数を、過去 1、5、および 15 分間の平均で表します。次のエントリは、実行可能なタスク (システム コールでブロックされるのではなく、現在実行がスケジュールされているプロセス) の現在の瞬間的な数と、システム上のプロセスの総数を示しています。最後のエントリは、最後に実行されたプロセスのプロセス ID です。

出力例:

0.55 0.47 0.43 1/210 12437
于 2009-03-07T19:54:57.750 に答える
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コマンドによって強制終了されます。

1 つの制限 - 実行するタスクはX サーバーとやり取りしてはなりません。そうしないと、開始直後に強制終了されます。

于 2020-08-24T15:44:21.737 に答える