web-dev-qa-db-ja.com

個々のコアをプロセスに割り当てます

私が実装しようとしているのは、Debianを搭載したRaspberry Pi2の独自のコアでpythonスクリプトを実行することです。tasksetを使用してプロセスを特定のコアにバインドできます。しかし、このコアには、OSと他のプロセスの負荷が同時にないようにする必要があります。どうすればよいですか?

5
Leonid

このスレッド全体 役立つはずです。

'init'プロセスをCPU1での実行に制限する方法を探します。

一般的に、最後の単語は「1を除くすべてのCPUで実行」である必要があります。いくつか使用できると思います カーネルパラメータ ; irqaffinityisolcpusは有望に見えます。


編集:

カーネルパラメータのドキュメントisolcpusについて:

このオプションは、CPUを分離するための推奨される方法です。別の方法(システム内のすべてのタスクのCPUマスクを手動で設定する)は、問題を引き起こし、ロードバランサーのパフォーマンスを最適化しない可能性があります。

私はいくつかのテストをしました。結果:

  • カーネルパラメータisolcpusは、initプロセスを制限し、CPUを分離するために使用できるパラメータです。

  • カーネルパラメータirqaffinityは分離されたCPUに影響を与えなかったように私には思えました。おそらくこのパラメータは必要ありません。

  • CPU0を分離したとき、完全にアイドル状態にはなりませんでした。そのシステムまたはハードウェアは、分離されているにもかかわらず、それを使用して何らかの計算を行う必要がありますか? - 知りません。

  • CPU1またはCPU7を分離したとき 固体として 岩のように遊んでいます。

CPU1を分離するには、次のようにisolcpus=1grub.cfgを追加します。
linux /vmlinuz-(…ここにあるすべての現在のパラメータ…)isolcpus=1


元の回答の続き:

または、システムの起動後に、現在実行中のすべてのプロセスのアフィニティを再割り当てできますが、それはあまり洗練されていないようです。

私はそれがあまりエレガントではないように見えることに同意しますが、それでも十分に機能する可能性があります(編集:上記のように、問題や最適ではないロードバランサーのパフォーマンスを引き起こす可能性があります)。私のDebianで動作する迅速で汚いワンライナーがあります:

Sudo bash -c 'cd /proc ; for i in [1-9]* ; do taskset -a -p fffffffe $i ; done'

一部のpidでエラーが発生しましたが、それでもhtopは、その後1つのコアが事実上アイドル状態であることを示しています。もちろん、後でスクリプトを実行するか、何らかの方法でスクリプトを除外するか、単に再割り当てする必要があります。

taskset -a -p 1 PID

CPUアフィニティは継承されるため、新しいプロセスをカバーするために、前述のワンライナーを繰り返す必要はないと思います。

6

パッケージCpusetの場合:

# cset shield -c 42 -k on

タスク用にCPU#42を予約し(CPUのグループを予約できます)、次に

# cset shield -e your_script

予約済みのCPUでyour_scriptを起動します。 (オプション--userおよび--groupも参照してください。)

完了したら、次のコマンドでCPUを解放します(「シールドをリセット」)。

# cset shield -r

このツールには、はるかに多くのものがあります。例:以前に実行していたプロセスを予約済みCPUに接続する:

# cset shield -s -p <PID> --threads

コマンドラインヘルプ:

# cset help

オンラインヘルプ/チュートリアル

3
L. Levrel