Linux의 쿼드 코어 프로세서에서 CPU 코어 비활성화


14

3 개의 CPU 코어를 비활성화하고 프로세서를 단일 코어에서 실행하고 싶습니다. 나는 명령을 사용했다 : maxcpus=1. 그러나 이것 이후 나는이 명령을 실행했다 ls /sys/devices/system/cpu. 여전히 표시 cpu0,cpu1,cpu2,cpu3됩니다.

나도 시도했지만 : echo 0 > /sys/devices/system/cpu3/online다음과 같은 오류가 발생 no such file or directory합니다.


maxcpus=1 명령을 어디에 넣었는지 확실하지 않습니까? 해당 문자열을 grub.cfg부팅 옵션으로 넣었습니까 ? (댓글에 답하는 대신 질문을 업데이트하십시오).
Anthon

리눅스 OS에서 프리 스케일 IMx6 sabreauto 보드를 사용하고 있습니다. 터미널 에뮬레이터 "gtkterm"에서 명령을 실행했습니다
user3818847

echo 0> / sys / devices / system / cpu3 / online 명령으로 cpu3 종료를 볼 수 있습니다. 이제 내가 알고 싶은 것은 변경 사항을 적용하기 위해 시스템을 재부팅하거나 재부팅하지 않고 계속할 수 있다는 것입니다.
user3818847

AFAIK 커널에 대한 매개 변수로 maxcpus = 1을 지정해야합니다 (예 : grub 상태 일 때). '/ etc / defaults / grub'을 편집하여 커널 매개 변수에 추가하고 'update-grub'을 실행 한 후 재부팅하십시오. 즉, Linux 시작시 하나의 CPU만으로도 일이 지속됩니다.
Anthon

2
@ user3818847 어떤 배포판을 사용하고 있습니까? 부팅 매개 변수 수정 (전달 maxcpus=1)은 배포판에 따라 다릅니다. 또한 /sys당신이 가진 경로는 단순히 잘못된 경로입니다 /sys/devices/system/cpu/cpu3/online. 올바른 경로는 입니다.
Patrick

답변:


28

패트릭이 의견에서 지적 했듯이 경로가 /sys잘못되었습니다.

echo 0 > /sys/devices/system/cpu/cpu3/online

다음을 제외한 모든 CPU를 끄려면 cpu0:

for x in /sys/devices/system/cpu/cpu[1-9]*/online; do
  echo 0 >"$x"
done

maxcpus=1쉘 프롬프트에서 입력해도 효과가 없습니다. 보다 정확하게는 변수 maxcpus1해당 쉘 의 값 으로 설정하는데 다른 효과는 없습니다. 커널 매개 변수maxcpus 로 전달하여 부팅시 CPU 수를 설정할 수 있습니다 . 이를 위해서는 부트 로더 구성을 변경해야합니다 (예 : U-Boot에서 커널 명령 줄 변경).


제안 해 주셔서 감사합니다. 그것은 당신이 제안한 명령으로 작동했습니다
user3818847

이것은 적어도 커널에 따라 다릅니다. 커널 3.6.6을 실행 중이며 그러한 파일이 없습니다. 대신 단일 /sys/devices/system/cpu/online./offline파일을 사용하여 모든 코어를 제어하십시오.
Daniel Griscom

@Gilles-켜고 끄는 데 걸리는 시간을 알 수있는 방법이 core있습니까?
Chetan Arvind Patil

@ChetanArvindPatil 시간입니다. 관련 코드가 L2 캐시에 없으면 코어 액세스를 해제 할 때까지 RAM 액세스가 시간이 지배적이라고 생각하지만 CPU와 OS에 따라 크게 달라집니다.
Gilles 'SO- 악마 그만해'

1
@Xofo 커널이 코어를 끄면 해당 코어는 커널 코드를 실행하므로 해당 시점에 특정 코어에 스레드가 예약되지 않습니다. 코어가 꺼진 후에는 해당 코어에서 스레드가 더 이상 예약되지 않습니다. 스레드의 선호도가 스레드를 모두 해제 된 코어 세트로 제한하면 어떻게되는지 모르겠습니다.
Gilles 'SO- 악마 그만해

1

코어를 반드시 거나 비활성화 할 필요는 없습니다 .

당신이 사용하는 것이 CPUSETStaskset를

http://man7.org/linux/man-pages/man7/cpuset.7.html

CPU 세트는 CPU 및 메모리 노드 목록을 정의합니다 ...

cpuset 파일 시스템은 프로세스의 프로세서 배치 및 메모리 배치를 제어하는 ​​데 사용되는 커널 cpuset 메커니즘에 대한 의사 파일 시스템 인터페이스입니다. 일반적으로 / dev / cpuset에 마운트됩니다.

cpusets를 기본적으로 지원하도록 컴파일 된 커널이있는 시스템에서 모든 프로세스는 cpuset에 연결되며 cpusets는 항상 존재합니다. 시스템이 cpusets를 지원하면 / proc / filesystems 파일에 nodev cpuset 항목이 있습니다. 관리자는 cpuset 파일 시스템을 마운트하여 (아래 예 섹션 참조) 시스템에서 프로세서 및 해당 시스템 프로세스의 메모리 배치를 제어하도록 cpusets를 구성 할 수 있습니다. 기본적으로 시스템의 cpuset 구성이 수정되지 않거나 cpuset 파일 시스템이 마운트되지 않은 경우 cpuset 메커니즘은 존재하지만 시스템 작동에 영향을 미치지 않습니다.

시스템의 CPU는 패키지 내의 다중 프로세서 코어 및 프로세서 코어 내의 하이퍼-스레드를 포함하여 프로세스가 실행될 수있는 모든 논리 처리 장치를 포함한다. 메모리 노드에는 주 메모리의 모든 고유 뱅크가 포함됩니다. 소형 및 SMP 시스템에는 일반적으로 모든 시스템의 기본 메모리를 포함하는 하나의 메모리 노드 만 있고 NUMA (비 균일 메모리 액세스) 시스템에는 여러 개의 메모리 노드가 있습니다.

당신은 당신이 CPUSETS을 구성하고 당신의 프로세스를 시작 것 1 CPU를 가진 6 개의 코어가있는 경우 즉, cpuset에 단 하나 개의 코어에 구성되어, 예를 들어 핵심 # 3을 말한다. 병렬 프로세스 인 경우, 코어가 하나만 지정된 특정 CPU에서 4 개의 프로세스를 시작한 경우 4 개의 프로세스 각각이 코어 # 3에서 25 %의 CPU 사용률을 갖도록 모두 하나의 코어로 제한됩니다.

이를 바탕으로 일반적으로 발생하는 CPU 세트 는 다음과 같이 구성됩니다.

  • 예를 들어 200 개 이상의 코어 시스템에서 cpusetA는 코어 0..60이며, cpusetB는 코어 61..70입니다. cpusetC는 코어 71..80이고; 그러나 관리자 / 건축가는 구성을 선택합니다.
  • cpusetA는 특정 사용자 및 / 또는 특정 소프트웨어 프로그램에 할당됩니다. cpusetB는 다른 사용자 / 프로그램에 할당됩니다. 등등.
  • 사용자 는 주어진 cpuset 내에서 N 코어를 요청하는 작업 (프로세스)을 시작 하고 이제 여러 (병렬) 프로세스가 주어진 cpuset에 제한 됩니다. 그리고 주어진 CPU 세트에 국한된 N 개의 병렬 처리에 대해, 이들 프로세스 각각은 프로세서 친화력 또는 CPU 친화력 을 사용해야 하므로 병렬 처리는 CPU 내부의 다른 코어에서 쓰러지지 않습니다.

또한 : https://linux.die.net/man/1/taskset

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.