CPU 친화도 이해와 nice 및 renice를 이용한 프로세스 우선순위 설정

이 글은 Linux에서 CPU 친화도와 프로세스 우선순위 관리에 대해 다룹니다. `taskset`을 사용하여 프로세스를 특정 CPU 코어에 바인딩하여 성능 향상을 얻는 방법과, `nice` 및 `renice` 명령어를 사용하여 실행 우선순위를 효과적으로 관리하는 방법을 알아보세요. 이러한 필수 Linux 관리 기술을 숙달하여 시스템의 응답성과 리소스 할당을 최적화하세요.

37 조회수

CPU 친화도 이해 및 nice, renice를 이용한 프로세스 우선순위 설정

리눅스 시스템 관리 영역에서 성능 최적화는 지속적인 노력입니다. 이를 위해 시스템 관리자가 활용하는 두 가지 기본적인 기술은 CPU 친화도 관리와 프로세스 우선순위 조정입니다. CPU 바인딩으로도 불리는 CPU 친화도는 프로세스를 특정 CPU 코어에서 실행하도록 지시할 수 있게 합니다. 이는 컨텍스트 전환 오버헤드를 줄이고 캐시 활용도를 향상시켜 성능을 크게 향상시킬 수 있습니다. 이를 보완하는 것은 nicerenice와 같은 명령어를 사용하여 프로세스 우선순위 관리를 통해 다른 프로세스에 비해 프로세스가 소비할 수 있는 CPU 시간을 제어하는 ​​능력입니다. 이 글에서는 두 가지 개념을 모두 깊이 있게 다루고, 구현 방법과 이점에 대한 실질적인 지침을 제공할 것입니다.

이러한 도구들을 이해하면 관리자는 시스템 동작을 세밀하게 조정하여 중요한 애플리케이션이 적절한 리소스를 확보하고 폭주하는 프로세스가 전반적인 시스템 안정성에 영향을 미치지 않도록 할 수 있습니다. 성능 병목 현상을 해결하거나, 고성능 컴퓨팅 환경을 구성하거나, 단순히 더 반응성이 뛰어난 시스템을 목표로 하든, CPU 친화도와 프로세스 우선순위를 마스터하는 것은 필수적인 기술입니다.

CPU 친화도: 특정 코어에 프로세스 바인딩

CPU 친화도는 운영 체제가 프로세스 또는 스레드를 특정 CPU 또는 CPU 세트에 묶을 수 있도록 하는 메커니즘입니다. 프로세스가 CPU 코어에 바인딩되면 해당 코어에서만 실행됩니다. 이는 다음과 같은 여러 성능 영향을 미칩니다:

  • 캐시 무효화 감소: 최신 CPU는 자주 액세스되는 데이터를 저장하는 다단계 캐시(L1, L2, L3)를 가지고 있습니다. 프로세스가 다른 CPU 코어 간에 마이그레이션하면 이전 코어의 캐시에 있는 데이터가 무효화되고, 새 코어에 대해 새로운 데이터를 가져와야 합니다. 프로세스를 단일 코어에 바인딩하면 데이터가 해당 코어의 캐시에 유지되어 더 빠른 액세스 시간을 제공합니다.
  • 컨텍스트 전환 최소화: 스케줄러가 코어에서 다른 프로세스를 실행하기로 결정하면 현재 프로세스의 상태가 저장되고(컨텍스트 전환), 새 프로세스의 상태가 로드됩니다. 프로세스가 코어 간에 자주 이동하면 이러한 컨텍스트 전환과 관련된 오버헤드가 누적될 수 있습니다. CPU 친화도는 프로세스를 동일한 코어에 유지함으로써 이러한 오버헤드를 줄일 수 있습니다.
  • NUMA 아키텍처: 비균일 메모리 액세스(NUMA) 시스템에서는 메모리 액세스 시간이 CPU 코어와 메모리 컨트롤러에 대한 근접성에 따라 달라집니다. 프로세스를 특정 코어에 바인딩하면 로컬 메모리에 액세스하도록 보장하여 대기 시간을 줄일 수도 있습니다.

CPU 친화도 설정 방법

리눅스 커널이 CPU 친화도를 자동으로 관리하는 경우가 많지만, 관리자는 이를 수동으로 조정할 수 있습니다. 이를 위한 주요 도구는 taskset입니다.

taskset 사용법

taskset 명령은 실행 중인 프로세스의 CPU 친화도 마스크를 검색하거나 설정하거나, 지정된 친화도로 새 명령을 실행할 수 있게 합니다.

구문:

  • 실행 중인 프로세스의 CPU 친화도를 확인하려면:
    bash taskset -p <PID>

  • 실행 중인 프로세스의 CPU 친화도를 설정하려면:
    bash taskset -p <mask> <PID>
    <mask>는 허용된 CPU의 비트마스크를 나타내는 16진수입니다. 예를 들어, 0x1(2진수 0001)은 CPU 0을, 0x2(2진수 0010)는 CPU 1을, 0x3(2진수 0011)은 CPU 0과 1을 의미하며, 나머지도 마찬가지입니다.

  • 특정 CPU 친화도로 새 명령을 실행하려면:
    bash taskset -c <cpu_list> <command>
    <cpu_list>는 쉼표로 구분된 CPU ID 또는 범위 목록입니다(예: 0, 0-3, 1,3).

예시:

계산 작업인 my_program을 실행하고 CPU 코어 3에 바인딩하고 싶다고 가정해 봅시다:

taskset -c 3 ./my_program

my_program이 PID 12345로 이미 실행 중이고, 이를 CPU 코어 1로만 이동시키고 싶다면:

taskset -p 1 12345

팁: nproc을 사용하거나 /proc/cpuinfo를 확인하여 사용 가능한 CPU 수를 알아낼 수 있습니다.

경고: CPU 친화도를 잘못 설정하면 성능 저하로 이어질 수 있습니다. 이점 확인을 위해 친화도 설정 유무에 따라 애플리케이션을 벤치마킹하는 것이 가장 좋습니다.

nicerenice를 이용한 프로세스 우선순위 관리

CPU 친화도가 프로세스가 어디서 실행될지를 결정하는 반면, 프로세스 우선순위는 다른 프로세스에 비해 얼마나 많은 CPU 시간을 할당받을지를 결정합니다. 리눅스는 스케줄링 우선순위를 제어하기 위해 "나이스(niceness)" 개념을 사용합니다. 나이스 값은 -20(가장 높은 우선순위, 가장 많은 CPU 시간)부터 +19(가장 낮은 우선순위, 가장 적은 CPU 시간)까지 범위에 있습니다. 프로세스의 기본 나이스 값은 0입니다.

나이스 값이 높을수록 프로세스가 다른 프로세스에 대해 "더 나이스"하다는 것을 의미하며, 다른 프로세스에 더 많은 CPU 시간을 양보합니다. 반대로, 나이스 값이 낮을수록 프로세스가 "덜 나이스"하며 더 많은 CPU 시간을 차지하려고 시도합니다.

nice 명령어

nice 명령은 수정된 나이스 수준으로 프로그램을 실행하는 데 사용됩니다. 일반적으로 새 프로세스를 시작할 때 사용됩니다.

구문:

nice -n <niceness_level> <command>
  • -n <niceness_level>: 나이스 값을 지정합니다 (지정하지 않으면 기본값은 10입니다).

예시:

my_background_task를 낮은 우선순위(나이스 값 15)로 실행하려면:

nice -n 15 my_background_task

my_critical_app을 높은 우선순위(나이스 값 -10)로 실행하려면:

nice -n -10 my_critical_app

중요 참고: 오직 root 사용자만이 음수 나이스 값(우선순위 증가)을 할당할 수 있습니다. 일반 사용자는 자신의 프로세스에 대해 나이스 값(우선순위 감소)만 증가시킬 수 있습니다.

renice 명령어

renice 명령은 하나 이상의 이미 실행 중인 프로세스의 나이스 수준을 변경하는 데 사용됩니다.

구문:

renice -n <niceness_level> -p <PID>
  • -n <niceness_level>: 새로운 나이스 값.
  • -p <PID>: 수정할 프로세스의 프로세스 ID(들).

예시:

프로세스 12345의 우선순위를 낮추려면(나이스 값 증가) 10으로:

renice -n 10 -p 12345

프로세스 54321의 우선순위를 높이려면(나이스 값 감소) -5로 (root 권한 필요):

sudo renice -n -5 -p 54321

renice는 사용자(-u) 또는 프로세스 그룹(-g)별로 프로세스를 대상으로 할 수도 있습니다.

예시:

사용자 www-data가 소유한 모든 프로세스의 나이스 값을 5로 설정하려면:

sudo renice -n 5 -u www-data

팁: top 또는 htop을 사용하여 실행 중인 프로세스의 나이스 값(NI 열)을 확인하고 우선순위 조정 대상을 식별하세요.

경고: 프로세스에 매우 높은 우선순위(낮은 나이스 값)를 부여하면 다른 프로세스가 자원을 고갈당하고 시스템이 응답하지 않을 수 있습니다. 특히 프로덕션 시스템에서는 주의하여 사용하십시오.

실용적인 시나리오 및 모범 사례

CPU 친화도 시나리오:

  • 데이터베이스 서버: 데이터베이스 프로세스를 특정 코어에 바인딩하면 데이터가 CPU 캐시에 유지되도록 하여 쿼리 성능을 향상시킬 수 있습니다.
  • 고빈도 거래 애플리케이션: 이들은 종종 최소한의 지연 시간과 예측 가능한 성능을 요구하므로 CPU 바인딩이 중요합니다.
  • 가상화 호스트: 가상 머신 또는 호스트 자체에 특정 코어를 전용으로 할당하여 격리 및 성능을 향상시킬 수 있습니다.

프로세스 우선순위 시나리오:

  • 배치 작업/백그라운드 작업: 대화형 사용자 작업이나 중요 서비스에 방해가 되지 않도록 높은 나이스 값(nice -n 15)으로 실행할 수 있습니다.
  • 대화형 애플리케이션: 백그라운드 작업이 모든 CPU 리소스를 소비하지 않도록 하여 데스크톱 애플리케이션이나 셸이 반응성을 유지하도록 보장합니다.
  • 긴급 리소스 할당: 드문 경우지만, 중요한 시스템 프로세스가 어려움을 겪고 있다면 renice를 사용하여(root 권한으로) 우선순위를 일시적으로 높일 수 있습니다.

모범 사례:

  1. 먼저 벤치마킹: CPU 친화도 또는 우선순위 변경을 적용하기 전과 후에 항상 성능을 측정하십시오. 성능 향상이 항상 보장되는 것은 아니며 애플리케이션에 따라 달라질 수 있습니다.
  2. 하드웨어 이해: CPU 친화도를 설정할 때는 CPU 토폴로지(코어, 소켓, NUMA 노드)를 인지하십시오.
  3. top/htop 사용: CPU 사용량, 나이스 값, 프로세스 상태를 모니터링하여 성능 문제를 식별하고 변경 사항을 테스트하십시오.
  4. 우선순위 증가를 위한 Root 권한: root만이 나이스 값을 줄여(우선순위 증가) 다른 프로세스에 부여할 수 있음을 기억하십시오. 이 권한을 신중하게 사용하십시오.
  5. 보수적으로 시작: 우선순위 조정 시에는 극단적인 값(-20 또는 +19)으로 가기 전에 중간 나이스 값(예: 5, 10)부터 시작하십시오.
  6. NUMA 인식 고려: NUMA 시스템의 경우 numactl과 같은 도구가 CPU 및 메모리 바인딩에 대한 더 고급 제어를 제공합니다.

결론

CPU 친화도와 프로세스 우선순위는 성능 튜닝을 위한 리눅스 시스템 관리자의 강력한 도구입니다. taskset을 사용하여 프로세스를 특정 CPU 코어에 전략적으로 바인딩함으로써 캐시 사용을 최적화하고 컨텍스트 전환을 줄일 수 있습니다. nicerenice로 프로세스 우선순위를 조정함으로써, 중요한 애플리케이션이 필요한 CPU 리소스를 받도록 보장하고, 덜 중요한 작업은 시스템 반응성에 영향을 주지 않으면서 백그라운드에서 실행되도록 할 수 있습니다. 이러한 기술을 효과적으로 사용하려면 작업 부하, 하드웨어 및 신중한 테스트에 대한 이해가 필요하지만, 시스템 성능 및 안정성 측면에서 상당한 이점을 얻을 수 있습니다.