CPUを集中的に使用するタスクをバックグラウンドで実行しているときに、Linuxデスクトップエクスペリエンスをスムーズかつインタラクティブに保つ方法を調査しています。これは、CPU負荷をシミュレートするために使用しているサンプルプログラム(Javaで記述)です。
public class Spinner {
public static void main(String[] args)
{
for (int i = 0; i < 100; i++) {
(new Thread(new Runnable() {
public void run() {
while (true);
}
})).start();
}
}
}
これをコマンドラインで実行すると、デスクトップアプリケーション(テキストエディタなど)の対話性が大幅に低下することに気付きます。私はデュアルコアマシンを持っているので、これには驚いていません。
これに対抗するために、私の最初の考えは、でプロセスを改善renice -p 20 <pid>
することでした。しかし、これはあまり影響がないことがわかりました。代わりに、すべての子プロセスをls /proc/<pid>/task | xargs renice 20 -p --
、はるかに大きな効果を持つようなもので放棄する必要があります。
スレッドが独自のプロセスIDを持っているとは思わないので、私はこれに非常に混乱しています。renice
彼らがそうしたとしても、私はプロセスのメインスレッドだけでなく、プロセス全体に作用することを期待していました。
ここで何が起こっているのかを明確に理解している人はいますか? 各スレッドは実際には別個のプロセスであるように見えます(少なくとも有効なPIDがあります)。歴史的にLinuxがこのように機能することは知っていましたが、NPTLはその数年前に修正されたと思いました。
RHEL 5.4(Linuxカーネル2.6.18)でテストしています。
(余談ですが、sched_setscheduler(<pid>, SCHED_BATCH, ..)
この対話性の問題を解決するために使用しようとすると、同じ効果に気付きます。つまり、表示されるすべての「子」プロセスに対してこの呼び出しを行う必要があります。/proc/<pid>/task
一度実行するだけでは不十分です。メインプログラムpidで。)