サーバーの一部のCPUを無効にしようとしています。
このリンクが見つかりました: https://www.cyberciti.biz/faq/debian-rhel-centos-redhat-suse-hotplug-cpu/linux-turn-on-off- cpu-core-commands / 、これは私に以下のような方法を提供します:
ここに_numactl --hardware
_が私に与えたものがあります:
16から63までのすべてのCPUを無効にしたいので、次のように_opCPUs.sh
_という名前のスクリプトを記述します。
_#!/bin/bash
for i in {16..63}; do
if [[ "$1" == "enable" ]]; then
echo 1 > /sys/devices/system/cpu/cpu$i/online
Elif [[ "$1" == "disable" ]]; then
echo 0 > /sys/devices/system/cpu/cpu$i/online
else
echo 'illegal parameter'
fi
done
grep "processor" /proc/cpuinfo
_
次に、それを実行します:_./opCPUs.sh disable
_そして、スクリプトでgrep
の結果を確認できます。
動作するようです。
現在、他のプロセスが無効になっているため、すべてのプロセスがCPU 0〜15にあるはずです。
そこで、既存のプロセスdbus
を使用して、以下のように確認します。ps -Lo psr $(pgrep dbus)
psr
は、プロセスが実行されているCPUを教えてくれます。もしそうなら、私はCPU 60、CPU 52などを無効にしました、なぜ彼らはまだここにいるのですか?
@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_number値で定義されているように、指定されたCPUを、一般的なカーネルSMPバランシングおよびスケジューラーのアルゴリズムから削除します。プロセスを「分離された」CPUに移動したり、分離したりする唯一の方法は、CPUアフィニティsyscallsを使用することです。 cpu_numberは0から始まるため、最大値はシステム上のCPUの数よりも1少なくなります。
このオプションは、CPUを分離するための推奨される方法です。代わりに、システム内のすべてのタスクのCPUマスクを手動で設定すると、問題が発生し、ロードバランサーのパフォーマンスが最適化されない可能性があります。
興味深いことに、このカーネルパラメータの使用は、CPUを1つのプロセスにアフィニティを使用するために脇に置いたり、CPUにプロセスを固定したりすることができるため、両方ともそのCPUで実行されているユーザープロセスがないことを確認します。
さらに、非常に高い負荷の特定のプロセスが独自のCPUを使用できることを保証して、サーバーをより安定させることもできます。 Meruがこのセットアップに気付く前に、Linuxベースのコントローラーでそれを行っているのを見てきました。
次に、4番目のCPU(CPU 3)にプロセスを割り当てるための関連コマンドは次のとおりです。
Sudo taskset -cp PID
taskset
は、PIDを指定して実行中のプロセスのCPUアフィニティを設定または取得するため、または特定のCPUアフィニティで新しいコマンドを起動するために使用されます。 CPUアフィニティは、システム上の特定のCPUセットにプロセスを「結合」するスケジューラプロパティです。 Linuxスケジューラは指定されたCPUアフィニティを尊重し、プロセスは他のCPUでは実行されません。 Linuxスケジューラは自然なCPUアフィニティもサポートしていることに注意してください。スケジューラは、パフォーマンス上の理由から実用的な限り、同じCPUでプロセスを維持しようとします。したがって、特定のCPUアフィニティを強制することは、特定のアプリケーションでのみ役立ちます。
この質問に適用されるいくつかのテクニックがあります:
grubでisolcpus = 4
を設定し、再起動すると、ユーザーランドプロセスの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に強制的に割り当てますが、4番目のCPUは、isolcpusが他のユーザーランドプロセスを受け入れない限り、それを受け入れることができます。
PS。事例として、フィールドでisolcpus
/taskset
を使用する最良の例は、very busyサイトのSSLフロントエンドで、数週間ごとに不安定になり続けました、Ansible/ssh
がリモートで私を許可しなくなりました。
私は上記の手法を適用し、それ以来、非常に安定した方法で動作し続けました。
いくつかのテストを行った後、次のような結果が得られました。
echo 0 > /sys/devices/system/cpu/cpu4/online
4番目のCPUは無効になります。
「4番目のCPUを無効にする」とは、以降のプロセスが4番目のCPUに割り当てられなくなることを意味します。つまり、「4番目のCPUを無効にする」前に4番目のCPUにあるプロセスは、CPUを無効にしている間はCPUから移動されません。
私が4つのCPUを持っていると言います:0、1、2、3。
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が自動的に有効になります。