web-dev-qa-db-ja.com

1つのCPUを無効にする方法

サーバーの一部のCPUを無効にしようとしています。
このリンクが見つかりました: https://www.cyberciti.biz/faq/debian-rhel-centos-redhat-suse-hotplug-cpu/linux-turn-on-off- cpu-core-commands / 、これは私に以下のような方法を提供します:

ここに_numactl --hardware_が私に与えたものがあります:
enter image description here

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の結果を確認できます。
enter image description here

動作するようです。

現在、他のプロセスが無効になっているため、すべてのプロセスがCPU 0〜15にあるはずです。
そこで、既存のプロセスdbusを使用して、以下のように確認します。
ps -Lo psr $(pgrep dbus)

私はこれを手に入れます:
enter image description here

psrは、プロセスが実行されているCPUを教えてくれます。もしそうなら、私はCPU 60、CPU 52などを無効にしました、なぜ彼らはまだここにいるのですか?

6
Yves

@Yvesの回答の他に、実際にはisolcpusカーネルパラメータを使用できます。

DebianまたはUbuntuで4番目のCPU /コア(CPU 3)を無効にするには:

/etc/default/grubisolcpus=3GRUB_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.shMyShell.shを4番目のCPU/CPU 3に強制的に割り当てますが、4番目のCPUは、isolcpusが他のユーザーランドプロセスを受け入れない限り、それを受け入れることができます。

PS。事例として、フィールドでisolcpus/tasksetを使用する最良の例は、very busyサイトのSSLフロントエンドで、数週間ごとに不安定になり続けました、Ansible/sshがリモートで私を許可しなくなりました。

私は上記の手法を適用し、それ以来、非常に安定した方法で動作し続けました。

4
Rui F Ribeiro

いくつかのテストを行った後、次のような結果が得られました。

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が自動的に有効になります。

6
Yves