サーバーの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などを無効にしましたが、なぜまだここにいますか?
ベストアンサー1
@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 ,...]
説明共通カーネルSMPバランシングおよびスケジューラアルゴリズムでcpu_number値で定義された指定されたCPUを削除します。 「解放された」CPUの内外にプロセスを移動する唯一の方法は、CPUアフィニティシステムコールを使用することです。 cpu_numberは0から始まるため、最大値はシステムのCPU数より1未満です。
このオプションは、CPUを取り外すのに好ましい方法です。別の方法は、システムのすべてのジョブに対してCPUマスクを手動で設定することです。これは問題を引き起こし、ロードバランサーのパフォーマンスを低下させる可能性があります。
興味深いことに、このカーネルパラメータを使用すると、後で使用できるようにCPUを取得したり、プロセスを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への割り当ては強制され、isolcpusがそれを除外しない場合、4番目のCPUはまだ他のユーザーモードプロセスに対応できます。
PS。興味深いことに、isolcpus
現場で/を使用した最良の例はSSLフロントエンドです。taskset
とても忙しいWebサイトは数週間ごとに不安定になり、Ansibleを介してリモートでssh
アクセスできなくなります。
上記の技術を適用しましたが、それ以来非常に安定した方法で動作しています。