実際にプロセスの優先順位を設定したり、Linux にプロセスの優先順位を尊重させる方法はありますか?

実際にプロセスの優先順位を設定したり、Linux にプロセスの優先順位を尊重させる方法はありますか?

他のオペレーティング システムと同様に、プロセスの優先度が -20 (最高優先度) から 19 (最低優先度) まであることは知っていますが、Linux ではそれが無視されるようです。

ちょうど今、私はバックグラウンドでカーネルを構築していました (makeプロセスの優先度は 0 ですが)。かなり時間がかかったので、何か見ることにしました。そこで、かなり負荷の高い H264 ビデオ (Core2 2.6GHz の CPU 時間の約 30%) を VLC で開いたところ、ティアリング、フレームの損失、視覚的なアーティファクト (おそらく前の結果によるもの) が発生していましたが、オーディオは問題ないように見えました。

そこで、 を使用して VLC の優先順位を変更することにしましたrenice。具体的には、PulseAudio が-11同等になっていることを確認して、 を実行しましたsudo renice -11 -p VLC_PROC_#

同じことが起こり続けたので、-20 に設定しましたが、視覚的なアーティファクトがまだ表示され続けました。

それで、Linux が -20 プロセスを 0 プロセスよりも優先して、必要なものをすべて与えなかったのはなぜでしょうか。Linux で実際にプロセスを優先する方法はあるのでしょうか。

関係があるかもしれないので、ここでは 64 ビット Arch を実行しており、デスクトップ環境として XFCE を使用しています。

編集:カーネルのコンパイルは、/tmp私が持っているtmpfsソースとすべてがすでに RAM にある状態で実行されました。RAM の使用率は 60% にも達せず、ページング操作も行われていませんでした。

上記のシナリオは、テストケース私がもっと興味があるのは、Linux がなぜそのように動作したのか、そして実際の優先順位を取得する方法があるかどうかです。

答え1

reniceプロセスの優先度に影響します。しかし、すでに経験したように、プロセスの優先度が高いからといって、必要なリソースがすべて得られるというわけではありません。優先度が高いと、プロセスがリソースを獲得する機会が増えるだけです。

reniceCPU時間にのみ影響します。したがって、2つ以上のプロセスがCPU時間を奪い合っている場合にのみ効果があります。制限要因がCPU時間ではなくI/O帯域幅である場合、nice値は影響しません。おそらく、コンパイルが多くのディスク帯域幅を使用していて、vlcがディスクから十分な速度でデータを読み取れない可能性があります。ionice代わりに、またはに加えてnice

これを頻繁に行う場合は、ビデオとコンパイルが別のディスクにあると、より良い結果が得られます。また、ビデオをディスク キャッシュにプリロードすると ( cat /path/to/video.file >/dev/null、またはtail -c +456m | head -c 123m /path/to/video.file >/dev/nullオフセット 456 MB から 123 MB を読み取る)、より良い結果が得られる場合がありますが、RAM が十分にない場合は、コンパイルによってキャッシュ領域が要求される可能性があります。ビデオをメモリ内に確実に保存したい場合は、ramdisk を作成し、そこにビデオをコピーします。

答え2

プロセスの優先度は、調整する際に考慮される唯一の要素ではありません。ユーザー体験カーネルのコンパイルは、I/O負荷の高い作業です。小さなファイルからの読み書きが大量に発生するため、ファイルシステムがかなり拡張される可能性があります(それ自体がベンチマークとして使用される)、特にマルチプロセッサマシンでは、カーネルをコンパイルする際に大きな問題になります。十分なRAMがある場合は、カーネルをtmpfsでコンパイルすることをお勧めします。少なくとも部分的には、ソースツリーをそこに置くか(これはキャッシュにプリフェッチするのと同じ効果があります)、出力をtmpfsに送信するかのいずれかです。

make O=/dev/shm ...

または、カーネル オブジェクト ファイルを保持するのに十分な大きさのインスタンスをマウントする場所にも配置できますtmpfs(カーネル オブジェクト ファイルは簡単にギガバイト単位になることがあります)。

それ以外にも、VLC にキャッシュ機能があるかどうかを確認することもできます (私の推測では、あると思います。たとえば、MPlayer にはオプションがあります-cache)。この機能を使用すると、内部でデータをキャッシュすることを要求できます。その後、必要なときにデータを取得するのではなく、データが利用可能になったときに取得する必要があります。

もう 1 つは、表示が X サーバーを介して行われることです。その優先度も上げる必要があります (質問の下の Wumpus Q. Wumbley のコメントを参照してください)。

さらに2つのオプションは、cgroupsとRTスケジューラの使用です(最初のオプションについては、たとえばcgroups を使用してアプリケーションの優先度を制御する後者については、例えばGentoo の説明)。

最後に、不要なサービスをオフにして、システムを少し最適化することをお勧めします。個人的には、まずは PulseAudio から始めることをお勧めします。

しかし、あなたが説明していることは、優先度の高い I/O が発生しているように聞こえます。私の推測では、大量のスワップが発生したのだと思います。tmpfs が強制的にスワップ アウトされていないことは確かですか? その場合、少なくとも iorenice はあまり役に立たないと思います。

答え3

他の人が言っているように、メモリ帯域幅など、影響を受ける可能性のあるシステムの部分は多数あり、システムのこれらの他の部分にも独自のスケジュールと優先順位があります。

chrt -i 0コンパイルに真のアイドル優先度を与えるために、 常に を使用できます。http://linux.die.net/man/1/chrt

または、cgroups を使用してコンパイルを制限します。 http://kennystechtalk.blogspot.co.uk/2015/04/throttling-cpu-usage-with-linux-cgroups.html

あるいは、あらゆる手段を講じる:

eatmydata cgexec -g cpu:throttled chrt -i 0 ionice -c3 nice -n19 /path/to/compile-script >/dev/null

注:が使用されたnice -n19場合、違いは生じませんchrt -i 0が、何も害はありません。

私の古い P4 でも、VLC が混乱することなく同じことができます。

関連情報