Linux CFSは2018 4.9カーネルでプロセスとスレッドをどのように公平に予約しますか?

Linux CFSは2018 4.9カーネルでプロセスとスレッドをどのように公平に予約しますか?

Linuxスケジューラは進化し続けています。今日のカーネルはプロセスとスレッドをどのように予約しますか?自動グループ化が必要ですか?

以前の同様のスタックオーバーフローの質問長年が経ちました。そして古いものかもしれません。

2018年のデフォルト値は次のとおりです。完全に公正なスケジューラ慢性疲労症候群)O(1)または他のスケジューラの代わりに。

Linuxでは、一部のドキュメントではオペレーティングシステムのジャグリングについて言及しています。仕事無関心に表現するプロセスまたはワイヤープロセスの区別や明確な区別はありませんが、スケジュール管理には重要です。

明確に言えば、プロセスはプログラムを実行し、マルチスレッドのときに1つ以上のスレッドを生成できます。私にとって違いは、プロセスのすべてのスレッドが同じ仮想アドレス空間を使用することです。ただし、CPU のスケジューリングの場合、これらの区別は不適切です。

Pプロセスを実行すると、それぞれ異なるTp数のスレッドがあります。

  • プロセス公平性:複数のスレッドを持つプロセスがすべてのリソースを消費せず、スレッドが1つのプロセスを圧倒しないようにする方法は?正式な公平なスケジューリングは、プロセスPがCPUリソースの1/Pthを取得し、この1/PthをP 1/(Pth*Tp)の各スレッドに均等に配布する必要があることを意味します。 CFSは基本的にこれを保証しますか?
  • 自動グループ化が必要ですか??自動グループ化により、プロセスはワークグループを一緒にスケジュールできます。基本的に1セットありますが、2番目のスレッドをスピンするとCPUは1/2になり、10をスピンすると各スレッドセットは1/10になります。簡単です(ギャング派遣を参照)。
  • マルチコア:私はマルチコアロードバランシングとコア間プロセスの移行に関する考慮事項にあまり興味がないので、答えは混乱しています。

実験結果:CFSはプロセス間で公平なようです。

4.9.27では、小規模プロセスと複数のスレッドを持つ長期実行プロセスの実行時を監視しようとしています。私のカーネルのスケジューラは、スレッドではなくプロセスごとにスケジュールを取るようです。したがって、小さなプロセスは公正に処理され、CPUの50%を占めます。 2つの長期実行プロセスを使用すると、33%が得られます。減速はそれぞれ2.2倍と3.4倍です。

このカーネルは自動グループにコンパイルされていないようです。 setid() は動作しますが、何もしないようで、/proc/*/autogroup が存在しないため、CFS を使用するときに自動グループを使用しようとしています。〜らしい正しいことをするのは費用がかかることです。しかし、他のいくつかのデータポイントは、時々、これらの動作がプロセスに不当であることを示すようです。

追加の質問

あるプロセスが他のすべてのプロセスよりも頻繁に実行されるようにする方法はありますか? LD_LIBRARY_PATHを使用しているため、リアルタイムで昇格できないようです。それにもかかわらず、システムを監視するために/ procを読み取るため、システム容量が大幅に超えると、まだ深刻な遅延が発生する可能性があると考えられます。

ありがとうございます!

ベストアンサー1

SCHED_OTHERスケジューリングポリシーに基づいて同じコアで同時に実行されるCPUバインドされたタスクへの回答


プロセス(UNIXシステムから継承された用語の意味では)は予約エンティティではありません。スレッドのみが存在し、CFSは親の考慮事項に関係なくスレッドを予約します。 man sched 引用:

   The thread to run is chosen from the static priority 0 list based
   on a dynamic priority that is determined only inside this list.
   The dynamic priority is based on the nice value (see below) and
   is increased for each time quantum the thread is ready to run,
   but denied to run by the scheduler.  This ensures fair progress
   among all SCHED_OTHER threads.

したがって、どのマルチスレッドアプリケーションでもできる何度も実証されているように、同じコアで同時に実行されるシングルスレッドアプリケーションよりもグローバルに多くのCPUパフォーマンスが得られます。(§3からお読みください)期間。1


Linuxカーネル制御グループのサポート:

適切に構成されている場合(CONFIG_CROUPS = y)、カーネルはジョブをグループ化する機能を提供します。推測してみてください。タスクフォース! :-P また、他のプログラム (データ構造の塗りつぶし) (たとえば、メモリ コントローラともちろん CFS) にこれらのグループ化について通知します。

次に、適切に構成されている場合(CONFIG_CGROUP_SCHED = y)、CFSはすべての既存のワークグループ間の公平性を確保するためにCPU帯域幅割り当てを制御します。2

この場合(CONFIG_CROUPS=y && CONFIG_CGROUP_SCHED=y)、上記のステートメントを再定式化できます。

どのマルチスレッドアプリケーションでも構いません。〜するシングルスレッドアプリケーションよりも全体的に多くのCPUパフォーマンスを実現します。同じワークグループに属しているただし、共存している他のワークグループに割り当てられているCPUパフォーマンス以上ではありません。サム


自動グループ化

タスクをグループ化するには、明示的なユーザータスク(初期の特定のシステム構成ではない場合)が必要で、ほとんどの一般的なデスクトップユーザーはこのタスクに気を付けたくありませんが、ユーザーが自分のセッションで何をしているかに関係なく、デスクトップは応答します保持したいので、カーネルはセッションごとにワークグループを自動的に作成して入力する機能を提供します。
CONFIG_SCHED_AUTOGROUPが設定されている場合、セッションごとにワークグループが作成され、このセッションで開始されたすべてのジョブはこのワークグループに属します。 4


あなたの付加的な質問(「あるプロセスが他のすべてのプロセスよりも頻繁に実行されるようにするためのトリックはありますか?」)SCHED_NORMALスレッドを予約するために使用されるアルゴリズムは決定的であり、可能な限り最良の結果を保証するので、ほとんど非合理的なようです。定格。この場合、達成は期待できません。「より多くの規則性」またはそれ以下定格一部のスレッドでは、割り込みを望まない限り...定格
ただし、スレッドを多少頻繁に予約することもできます。この場合、適切な値を調整してください。


1:恵みの言葉: 別途管理せずに chromium -j64 ビルド時にリリースされたビデオを楽しむことはできません :-P

2:いいえ!構成タグが提案するものとは異なり、CFS はワークグループの予約を開始しません。それでもスレッドをスケジュールしますが、選択時に同じワークグループに属する他のすべてのスレッドに割り当てられたCPU時間の合計を考慮して、他の既存のワークグループに属するスレッドに割り当てられた合計時間を超えないようにします。

サム:恵みの言葉:Chromeバージョンとビデオプレーヤーが同じワークグループに属しないように特別な注意を払っている場合は、コア2でもmake -j64と並列にビデオを実行することをお勧めします。そうでなければ、make -j64と並行して実行されるこのビデオが好きです。 ... 1に移動:-P

4:恵みの言葉:クロムバージョンとプレイヤーを2つの異なるセッションで実行することに注意を払ったら、楽しんでください。同じセッションで開始すると... 1:-Pに移動します。

おすすめ記事