Linux

如何禁用一個 CPU

  • March 6, 2018

我正在嘗試禁用我的伺服器的一些 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 ,… $$ 說明 從通用核心 SMP 平衡和調度程序算法中刪除由 cpu_number 值定義的指定 CPU。將程序移入或移出“隔離”CPU 的唯一方法是通過 CPU 關聯繫統呼叫。cpu_number 從 0 開始,因此最大值比系統上的 CPU 數量少 1。

此選項是隔離 CPU 的首選方法。另一種方法是手動設置系統中所有任務的 CPU 遮罩,這可能會導致問題和負載平衡器性能欠佳。

有趣的是,這個核心參數的使用可以留出一個 CPU,以便稍後使用 CPU 親和性到一個程序/將一個程序固定到一個 CPU,從而確保沒有更多的使用者程序在該 CPU 上執行。

此外,還可以使伺服器更穩定,保證負載非常高的特定程序將擁有自己的 CPU 來玩。在意識到這種設置之前,我已經看到 Meru 使用他們的基於 Linux 的控制器執行此操作。

然後將程序分配給第四個 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是一個非常繁忙的站點的 SSL 前端,它每隔幾週就會不穩定,Ansible/ssh不會再讓我遠端進入。

我應用了上面討論的技術,從那以後它一直以非常穩定的方式工作。

引用自:https://unix.stackexchange.com/questions/417672