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


5

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


おそらく、リアルタイムの優先度にも設定しますか?
悲しみ

@Leonidas私はいくつかのテスト結果で答えを広げました。見てみな。
カミルマシオロウスキ

回答:


5

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

「init」プロセスをCPU 1で実行するように制限する方法を探します。

一般的に、最後の単語は「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それにもかかわらず、S htop1つのコアはその後、事実上アイドルであることを示しています。もちろん、後でスクリプトを実行するか、何らかの形で除外するか、単に再割り当てする必要があります。

taskset -a -p 1 PID

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


3

パッケージCpusetの場合:

# cset shield -c 42 -k on

タスク用にCPU#42を予約するには(CPUのグループを予約できます)、その後

# cset shield -e your_script

your_script予約済みのCPUで開始します。(また、オプションを参照してください--user--group。)

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

# cset shield -r

このツールにはさらに多くの機能があります。たとえば、以前に実行したプロセスを予約済みのCPUに接続します。

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

コマンドラインヘルプ:

# cset help

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


有望に見えます。回答を展開し、予約を解除してデフォルト状態に戻すコマンドを投稿できますか?
カミルマシオロウスキ

@KamilMaciorowski:リクエストに追加したコマンドについてフィードバックをお願いします。
L.レヴレル16年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.