리눅스의 CPU affinity

Out of Bedlam
3 min readDec 15, 2017

--

리눅스에서 SMP(Symmetric MultiProcessing)을 사용할 때 커널의 프로세스 스케쥴링 방식을 변경하고 싶거나 프로세스가 특정 CPU만 사용하도록 제한하고 싶은 경우가 있습니다.

이런 경우 적용할 수 있는 CPU affinity에 대해서 간략히 살펴보겠습니다.

CPU affinity란?

CPU affinity란 SMP 시스템 상에서 프로세스를 주어진 CPU 세트에 제한(bond)할 수 있는 스케쥴러 속성입니다. 리눅스 스케쥴러는 적용된 CPU affinity에 따라 프로세스가 지정된 CPU외의 다른 CPU에서 돌아가지 않도록 합니다.

기본적으로 스케쥴러는 성능적인 요인이 없는 경우 가능한 오랫동안 동일한 CPU에서 동작하도록 프로세스를 유지하려고 합니다. 따라서 특정 CPU affinity를 강제하는 것은 특정 애플리케이션에서만 유용합니다. 예를 들어 오라클의 ERP와 같은 애플리케이션이 라이센스상에 인스턴스당 허용된 CPU만 사용하도록 하는 경우, 오라클 프로세스를 특정 CPU에 제한할 수 있습니다.

taskset 명령

taskset 명령을 사용하여 실행 중인 프로세스의 PID로 CPU affinity를 조회하거나 설정할 수 있습니다. 또한 명령을 실행할 때에서 CPU affinity를 지정할 수도 있습니다. taskset은 디폴트로 설치되지 않으므로 다음과 같이 schedutils 팩키지를 설치하여야 합니다.

schedutils 설치

Debian Linux

# apt-get install schedutils

Red Hat Enterprise Linux

# up2date schedutils

또는

# rpm -ivh schedutils*

최신 버전의 Debian/Ubuntu 리눅스에서는 tasksetutil-linux 팩키지에 디폴트로 설치됩니다.

CPU affinity는 비트마스크로 표현되며, 가장 오른쪽 비트가 첫 번째 논리적인 CPU를 표시합니다. 예를 들면 다음과 같습니다.

  • 0x00000001 은 #0 프로세서입니다. (첫 번째 프로세서)
  • 0x00000003 은 #0 과 #1 프로세서입니다.
  • 0x00000004 은 #2 프로세서입니다. (세 번째 프로세서)

PID가 13545인 프로세스가 #0 (첫 번째 프로세서)만 사용하도록 affinity를 설정하려면 다 음과 같이 명령을 실행합니다.

# taskset 0x00000001 -p 13545

비트마스크를 사용하는 것이 번거롭다면 -c 플래그를 사용할 수 있습니다.

# taskset -c 1 -p 13545
# taskset -c 3,4 -p 13545

여기서 -p를 지정하면 현재 존재하는 PID에만 적용되고 새로운 프로세스를 실행하지는 않습니다. (-p를 지정하지 않으면 명령을 새롭게 실행합니다)

--

--