いくつかのテストを行った後、以下のような結果が得られました:
echo 0 > /sys/devices/system/cpu/cpu4/online
4 番目の CPU を無効にします。
「4 番目の CPU を無効にする」とは、以降のプロセスが 4 番目の CPU に割り当てられなくなることを意味します。つまり、「4 番目の CPU を無効にする」前に 4 番目の CPU に配置されていたプロセスは、CPU を無効にしている間、CPU から移動されません。
0、1、2、3 の 4 つの CPU があるとします。つまり、次のことができます。
echo 0 > /sys/devices/system/cpu/cpu1/online
echo 0 > /sys/devices/system/cpu/cpu2/online
echo 0 > /sys/devices/system/cpu/cpu3/online
./MyShell.sh
./MyShell.sh
を強制する CPU0 に割り当てられます。
ちなみに、再起動するとすべての CPU が自動的に有効になります。
@Yvesの回答に加えて、実際には isolcpus
を使用できます カーネル パラメータ
Debian または Ubuntu で 4 番目の CPU/コア (CPU 3) を無効にするには:
/etc/default/grub
で isolcpus=3
を追加 GRUB_CMDLINE_LINUX_DEFAULT
へ
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash isolcpus=3"
実行
sudo update-grub
サーバーを再起動します。
<ブロック引用>isolcpus — カーネル スケジューラから CPU を分離します。
概要 isolcpus=cpu_number [, cpu_number ,...]
説明 cpu_numbervalues で定義されているように、指定された CPU を一般的なカーネル SMP バランシングおよびスケジュール管理から削除します。プロセスを「分離された」CPU に移動したり、分離したりする唯一の方法は、CPU アフィニティ syscall を使用することです。 cpu_number は 0 から始まるため、最大値はシステム上の CPU の数より 1 少ない値です。
このオプションは、CPU を分離するための推奨される方法です。システム内のすべてのタスクの CPU マスクを手動で設定すると、問題が発生したり、ロード バランサのパフォーマンスが最適化されないことがあります。
興味深いことに、このカーネル パラメータを使用すると、後で CPU アフィニティを 1 つのプロセスに使用したり、プロセスを CPU に固定したりして、その CPU で実行中のユーザー プロセスがなくなるように、CPU を確保できます。
さらに、非常に負荷の高い特定のプロセスが独自の CPU で動作することを保証することで、サーバーをより安定させることもできます。このセットアップに気付く前に、Meru が Linux ベースのコントローラーでそれを行っているのを見たことがあります。
プロセスを 4 番目の CPU (CPU 3) に割り当てる関連コマンドは次のとおりです。
sudo taskset -cp PID
<ブロック引用>
taskset
指定された PID で実行中のプロセスの CPU アフィニティを設定または取得するか、指定された CPU アフィニティで新しい COMMAND を起動するために使用されます。 CPU アフィニティは、プロセスをシステム上の特定の CPU セットに「結合」するスケジューラ プロパティです。 Linux スケジューラは指定された CPU アフィニティを尊重し、プロセスは他の CPU では実行されません。Linux スケジューラは自然な CPU アフィニティもサポートすることに注意してください。したがって、特定の CPUaffinity を強制することは、特定のアプリケーションでのみ有効です。
まとめ
この質問にはいくつかの手法が適用されます。
isolcpus = 4
を設定 grub と再起動では、ユーザー ランド プロセスに対して 5 番目の CPU/CPU 4 を永久に無効にすることができます。
echo 0 > /sys/devices/system/cpu/cpu4/online
5 番目の CPU/CPU 4 を無効にします。これは、既に割り当てられているプロセスに対して引き続き機能しますが、新しいプロセスは CPU 4 に割り当てられなくなります。
taskset -c 3 ./MyShell.sh
MyShell.sh
を強制します 4 番目の CPU/CPU 3 に割り当てられますが、isolcpus がそれを除外していない場合、4 番目の CPU は他のユーザー ランド プロセスを受け入れることができます。
PS。余談ですが、isolcpus
を使用した私の最良の例 /taskset
フィールドでは、非常に忙しいの SSL フロントエンドでした。 Ansible/ssh
もう私をリモートで入れません。
上記で説明した手法を適用したところ、それ以来、非常に安定した方法で動作し続けました.