web-dev-qa-db-ja.com

単一プロセス専用のコア全体

Linuxで1つのCPUコアを特定の特定のプロセスに割り当てる方法はありますか。このコアで他のプロセスや割り込みハンドラーをスケジュールすることはできませんか?

Linuxのプロセスアフィニティについて読んだことがありますtasksetユーティリティを使用してCPUにプロセスをバインドしますが、与えられたプロセスをそのコアにアフィンしようとするだけですが、このコアで他のプロセスがスケジュールされる可能性があります。これは避けたいものです。

スケジューリングのためにカーネルコードを変更する必要がありますか?

47
akp

はいあります。実際、それを行うには2つの別々の方法があります:-)

今、あなたが望むことを達成するための最良の方法は、以下を行うことです:

  1. ブート時にブートローダーからLinuxカーネルコマンドラインにパラメーターisolcpus = [cpu_number]を追加します。これは、CPUアフィニティを使用して特に要求されない限り、そのCPUで通常のタスクを実行しないようにLinuxスケジューラーに指示します。

  2. IRQアフィニティを使用して、すべての割り込みを処理するように他のCPUを設定し、分離されたCPUが割り込みを受け取らないようにします。

  3. CPUアフィニティを使用して、特定のタスクを分離されたCPUに修正します。

これにより、Linuxが提供する、CPUの分離に関して、ツリー外および開発中のパッチなしで提供できる最高のものが提供されます。

タイマーティック割り込みやスケジューラコード、他のCPUからのIPI、ワークキューカーネルスレッドなどのタスクなど、他のタスクを含むLinuxコードによって、タスクは時々中断されますが、中断は最小限に抑える必要があります。

(ほぼ)完全な割り込みソースのリストについては、 https://github.com/gby/linux/wiki にある私のページをチェックしてください。

別の方法は、よりエレガントで動的なcpusetsを使用することですが、この時点でいくつかの弱点があります(たとえば、タイマーの移行はありません)。

Linuxコミュニティは現在、これらすべての問題に対処するための作業を行っており、さらに優れた分離を実現していることに注意してください。

60
gby

Redhatの記事 について話しています。ブートパラメータisolcpusを変更します。

そして 古い記事 Robert Loveによって書かれました。そして、その記事には解決策があります。

プロセスのすべての子は、親と同じCPUアフィニティマスクを受け取ります。

次に、必要なのは、initを1つのプロセッサにバインドするだけです。他のすべてのプロセスは、initがプロセスツリーのルートであり、したがってすべてのプロセスの親であるため、同様に1つのプロセッサにバインドされます。

6
louxiu

CPUコア全体を特定のプログラム専用にする

タスクセットを使用すると、特定のプログラムを特定のCPUに割り当てることができますが、それらのCPUで他のプログラムやプロセスがスケジュールされないという意味ではありません。これを防ぎ、CPUコア全体を特定のプログラム専用にしたい場合は、ブート時にCPUコアを予約できる「isolcpus」カーネルパラメーターを使用できます。

ブート中にカーネルパラメーター「isolcpus =」をブートローダーに追加するか、GRUB=構成ファイル。Linuxスケジューラーは、特別に要求されない限り、予約されたCPUコアで通常のプロセスをスケジュールしません。たとえば、CPUコア0および1を予約するには、「isolcpus = 0,1」カーネルパラメーターを追加します。ブート時に、tasksetを使用して予約済みCPUコアをプログラムに安全に割り当てます。

ソース

  1. http://xmodulo.com/2013/10/run-program-process-specific-cpu-cores-linux.html
  2. http://www.linuxtopia.org/online_books/linux_kernel/kernel_configuration/re46.html
5
Vasu

Gbyの答えの手順に従ったとしても、カーネルタスクは分離されたCPUコアで実行されます。これを改善するため、Linux RT_PREEMPTリアルタイムプロジェクトで作業が進行中です。そのため、RP_PREEMPTからの最先端のリアルタイムカーネルを使用していない場合、CPUコアを完全に分離することができない可能性があります。

3
bofh.at

ドキュメント

Linuxスケジューラは、指定されたCPUアフィニティを尊重し、プロセスは他のCPUで実行されません。

特定のプロセッサが排他的に処理するために与えられるという言及はありません。

0
Sergei Nikulov