私が実装しようとしているのは、Debianを搭載したRaspberry Pi 2のコアでPythonスクリプトを実行することです。taskset
プロセスを特定のコアにバインドするために使用できます。しかし、このコアには、OSや他のプロセスの負荷が同時に発生しないようにする必要があります。どうすればいいですか?
私が実装しようとしているのは、Debianを搭載したRaspberry Pi 2のコアでPythonスクリプトを実行することです。taskset
プロセスを特定のコアにバインドするために使用できます。しかし、このコアには、OSや他のプロセスの負荷が同時に発生しないようにする必要があります。どうすればいいですか?
回答:
このスレッド全体が役立つはずです。
「init」プロセスをCPU 1で実行するように制限する方法を探します。
一般的に、最後の単語は「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それにもかかわらず、S htop
1つのコアはその後、事実上アイドルであることを示しています。もちろん、後でスクリプトを実行するか、何らかの形で除外するか、単に再割り当てする必要があります。
taskset -a -p 1 PID
CPUアフィニティが継承されるため、新しいプロセスをカバーするために、前述のワンライナーを繰り返す必要はないと思います。
パッケージ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