一般化する

一般化する

サーバーの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 disablegrep
ここに画像の説明を入力してください。

うまくいくようです。

今、他のプロセスが無効になっているので、すべてのプロセスが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=3GRUB_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

tasksetPIDは、指定された実行中のプロセスの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/online5番目のCPU / CPU 4を無効にすると、割り当てられたプロセスに対して引き続き機能しますが、CPU 4に新しいプロセスは割り当てられません。

taskset -c 3 ./MyShell.shMyShell.sh4番目のCPU / CPU 3への割り当ては強制され、isolcpusがそれを除外しない場合、4番目のCPUはまだ他のユーザーモードプロセスに対応できます。

PS。興味深いことに、isolcpus現場で/を使用した最良の例はSSLフロントエンドです。tasksetとても忙しいWebサイトは数週間ごとに不安定になり、Ansibleを介してリモートでsshアクセスできなくなります。

上記の技術を適用しましたが、それ以来非常に安定した方法で動作しています。

おすすめ記事