私が実装しようとしているのは、Debianを搭載したRaspberry Pi2の独自のコアでpythonスクリプトを実行することです。taskset
を使用してプロセスを特定のコアにバインドできます。しかし、このコアには、OSと他のプロセスの負荷が同時にないようにする必要があります。どうすればよいですか?
このスレッド全体 役立つはずです。
'init'プロセスをCPU1での実行に制限する方法を探します。
一般的に、最後の単語は「1を除くすべてのCPUで実行」である必要があります。いくつか使用できると思います カーネルパラメータ ; irqaffinity
、isolcpus
は有望に見えます。
カーネルパラメータのドキュメント のisolcpus
について:
このオプションは、CPUを分離するための推奨される方法です。別の方法(システム内のすべてのタスクのCPUマスクを手動で設定する)は、問題を引き起こし、ロードバランサーのパフォーマンスを最適化しない可能性があります。
私はいくつかのテストをしました。結果:
カーネルパラメータisolcpus
は、init
プロセスを制限し、CPUを分離するために使用できるパラメータです。
カーネルパラメータirqaffinity
は分離されたCPUに影響を与えなかったように私には思えました。おそらくこのパラメータは必要ありません。
CPU0を分離したとき、完全にアイドル状態にはなりませんでした。そのシステムまたはハードウェアは、分離されているにもかかわらず、それを使用して何らかの計算を行う必要がありますか? - 知りません。
CPU1またはCPU7を分離したとき 固体として 岩のように遊んでいます。
CPU1を分離するには、次のようにisolcpus=1
にgrub.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アフィニティは継承されるため、新しいプロセスをカバーするために、前述のワンライナーを繰り返す必要はないと思います。
パッケージ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