![일반화하다](https://linux55.com/image/125781/%EC%9D%BC%EB%B0%98%ED%99%94%ED%95%98%EB%8B%A4.png)
서버의 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에서 네 번째 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 기반 컨트롤러를 사용하여 이 작업을 수행하는 것을 보았습니다.
네 번째 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는 여전히 다른 사용자 모드 프로세스를 수용할 수 있습니다.
추신. 흥미롭게도 isolcpus
현장에서 /를 사용한 가장 좋은 예는 SSL 프런트엔드입니다.taskset
아주 바쁜웹사이트는 몇 주마다 불안정해지며 Ansible을 통해 ssh
더 이상 원격으로 액세스할 수 없습니다.
위에서 설명한 기술을 적용했는데 그 이후로 매우 안정적인 방식으로 작동하고 있습니다.
답변2
몇 가지 테스트를 거쳐 다음과 같은 결과를 얻었습니다.
echo 0 > /sys/devices/system/cpu/cpu4/online
네 번째 CPU는 실제로 비활성화되었습니다.
"4번째 CPU 비활성화"는 후속 프로세스가 더 이상 4번째 CPU에 할당되지 않음을 의미합니다. 즉, "4번째 CPU 비활성화" 이전에 4번째 CPU에 있던 프로세스는 CPU가 비활성화될 때 해당 CPU 밖으로 이동되지 않습니다.
CPU가 4개(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가 활성화됩니다.