CPU 선호도 이해 및 nice와 renice를 사용한 프로세스 우선순위 설정
Linux `taskset`, `nice`, `renice`를 사용하여 중요한 작업을 굶주리지 않으면서 CPU 선호도와 프로세스 우선순위를 조정합니다.
CPU 선호도 이해 및 nice와 renice를 사용한 프로세스 우선순위 설정
Linux 호스트가 바쁠 때, "스케줄러가 결정하도록 두는 것"보다 더 많은 제어가 필요할 수 있습니다. CPU 선호도는 프로세스가 실행될 수 있는 위치를 제어하는 반면, nice와 renice는 프로세스가 CPU 시간을 얼마나 강력하게 경쟁하는지에 영향을 미칩니다.
이 가이드는 실제 예제와 프로덕션 워크로드를 변경하기 전에 주의해야 할 절충점을 통해 taskset, nice, renice를 사용하는 방법을 보여줍니다.
CPU 선호도: 특정 코어에 프로세스 바인딩
CPU 선호도는 운영 체제가 프로세스나 스레드를 특정 CPU 또는 CPU 집합에 연결할 수 있도록 하는 메커니즘입니다. 프로세스가 CPU 코어에 바인딩되면 해당 코어에서만 실행됩니다. 이는 몇 가지 성능상의 영향을 미칩니다.
- 캐시 무효화 감소: 최신 CPU는 자주 액세스하는 데이터를 저장하는 다중 레벨 캐시(L1, L2, L3)를 가지고 있습니다. 프로세스가 다른 CPU 코어 간에 마이그레이션되면 이전 코어의 캐시에 있는 데이터가 무효화되고 새 코어를 위해 새 데이터를 가져와야 합니다. 프로세스를 단일 코어에 바인딩하면 데이터가 해당 코어의 캐시에 유지되어 액세스 시간이 빨라집니다.
- 컨텍스트 스위칭 최소화: 스케줄러가 코어에서 다른 프로세스를 실행하기로 결정하면 현재 프로세스의 상태가 저장되고(컨텍스트 스위치) 새 프로세스의 상태가 로드됩니다. 프로세스가 코어 간에 자주 이동하면 이러한 컨텍스트 스위치와 관련된 오버헤드가 누적될 수 있습니다. CPU 선호도는 프로세스를 동일한 코어에 유지하여 이 오버헤드를 줄일 수 있습니다.
- NUMA 아키텍처: NUMA(Non-Uniform Memory Access) 시스템에서 메모리 액세스 시간은 CPU 코어와 메모리 컨트롤러와의 근접성에 따라 다릅니다. 프로세스를 특정 코어에 바인딩하면 로컬 메모리에 액세스하여 지연 시간을 줄일 수도 있습니다.
CPU 선호도 설정 방법
Linux 커널은 종종 CPU 선호도를 자동으로 관리하지만, 관리자는 수동으로 영향을 미칠 수 있습니다. 이를 위한 주요 도구는 taskset입니다.
taskset 사용하기
taskset 명령을 사용하면 실행 중인 프로세스의 CPU 선호도 마스크를 검색하거나 설정하거나 지정된 선호도로 새 명령을 시작할 수 있습니다.
구문:
실행 중인 프로세스의 CPU 선호도를 보려면:
taskset -p <PID>실행 중인 프로세스의 CPU 선호도를 설정하려면:
taskset -p <mask> <PID><mask>는 허용된 CPU의 비트마스크를 나타내는 16진수입니다. 예를 들어,0x1(이진0001)은 CPU 0,0x2(이진0010)는 CPU 1,0x3(이진0011)은 CPU 0과 1을 의미합니다.특정 CPU 선호도로 새 명령을 시작하려면:
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로 실행 중이고 선호도 마스크로 제한하려는 경우:
taskset -p 1 12345
해당 명령은 16진수 마스크를 사용하므로 1은 CPU 0을 의미합니다. 프로세스를 CPU 1로 이동하려면 CPU 번호와 함께 -c를 사용하십시오.
taskset -cp 1 12345
팁: nproc를 사용하거나 /proc/cpuinfo를 검사하여 사용 가능한 CPU 수를 확인할 수 있습니다.
경고: CPU 선호도를 잘못 설정하면 성능이 저하될 수 있습니다. 이점을 확인하려면 선호도 설정 유무에 관계없이 애플리케이션을 벤치마킹하는 것이 가장 좋습니다.
nice 및 renice를 사용한 프로세스 우선순위 관리
CPU 선호도가 프로세스가 실행되는 위치를 결정하는 반면, 프로세스 우선순위는 다른 프로세스에 비해 얼마나 많은 CPU 시간을 얻는지를 결정합니다. Linux는 "niceness" 개념을 사용하여 스케줄링 우선순위를 제어합니다. niceness 값의 범위는 -20(가장 높은 우선순위, 가장 많은 CPU 시간)에서 +19(가장 낮은 우선순위, 가장 적은 CPU 시간)입니다. 프로세스의 기본 niceness는 0입니다.
niceness 값이 높을수록 프로세스가 다른 프로세스에 "더 친절"하여 더 많은 CPU 시간을 양보한다는 의미입니다. 반대로 niceness 값이 낮을수록 프로세스가 덜 "친절"하여 더 많은 CPU 시간을 차지하려고 시도합니다.
nice 명령
nice 명령은 수정된 niceness 수준으로 프로그램을 실행하는 데 사용됩니다. 일반적으로 새 프로세스를 시작할 때 사용됩니다.
구문:
nice -n <niceness_level> <command>
-n <niceness_level>: niceness 값을 지정합니다(지정하지 않으면 기본값은 10).
예시:
my_background_task를 낮은 우선순위(높은 niceness 값 15)로 실행하려면:
nice -n 15 my_background_task
my_critical_app을 높은 우선순위(낮은 niceness 값 -10)로 실행하려면:
nice -n -10 my_critical_app
중요 참고 사항: 루트 사용자만 음수 niceness 값(우선순위 증가)을 할당할 수 있습니다. 일반 사용자는 자신의 프로세스에 대해서만 niceness 값(우선순위 감소)을 증가시킬 수 있습니다.
renice 명령
renice 명령은 이미 실행 중인 하나 이상의 프로세스의 niceness 수준을 변경하는 데 사용됩니다.
구문:
renice -n <niceness_level> -p <PID>
-n <niceness_level>: 새 niceness 값입니다.-p <PID>: 수정할 프로세스의 프로세스 ID입니다.
예시:
프로세스 12345의 우선순위를 낮추려면(niceness 증가) 10으로:
renice -n 10 -p 12345
프로세스 54321의 우선순위를 높이려면(niceness 감소) -5로(루트 권한 필요):
sudo renice -n -5 -p 54321
renice는 사용자(-u) 또는 프로세스 그룹(-g)별로 프로세스를 대상으로 지정할 수도 있습니다.
예시:
사용자 www-data가 소유한 모든 프로세스를 niceness 5로 설정하려면:
sudo renice -n 5 -u www-data
팁: top 또는 htop을 사용하여 실행 중인 프로세스의 niceness 값(NI 열)을 확인하고 우선순위 조정 대상 후보를 식별하십시오.
경고: 프로세스에 매우 높은 우선순위(낮은 niceness 값)를 부여하면 다른 프로세스가 굶주릴 수 있고 시스템이 응답하지 않을 수 있습니다. 특히 프로덕션 시스템에서는 주의해서 사용하십시오.
실제 시나리오 및 모범 사례
CPU 선호도 시나리오:
- 데이터베이스 서버: 데이터베이스 프로세스를 특정 코어에 바인딩하면 데이터가 CPU 캐시에 유지되어 쿼리 성능을 향상시킬 수 있습니다.
- 고빈도 거래 애플리케이션: 이러한 애플리케이션은 종종 최소 지연 시간과 예측 가능한 성능을 필요로 하므로 CPU 바인딩이 중요합니다.
- 가상화 호스트: 특정 코어를 가상 머신 또는 호스트 자체에 전용으로 할당하여 격리 및 성능을 향상시킵니다.
프로세스 우선순위 시나리오:
- 배치 작업/백그라운드 작업: 이러한 작업은 높은 niceness 값(
nice -n 15)으로 실행되어 대화형 사용자 작업이나 중요 서비스를 방해하지 않도록 할 수 있습니다. - 대화형 애플리케이션: 백그라운드 작업이 모든 CPU 리소스를 소비하지 않도록 하여 데스크톱 애플리케이션이나 셸의 응답성을 유지합니다.
- 긴급 리소스 할당: 드문 경우지만 중요한 시스템 프로세스가 어려움을 겪고 있다면
renice를 사용하여 우선순위를 일시적으로 높일 수 있습니다(루트 권한 필요).
모범 사례:
- 먼저 벤치마킹: CPU 선호도 또는 우선순위 변경을 적용하기 전후에 항상 성능을 측정하십시오. 이득이 항상 보장되는 것은 아니며 애플리케이션에 따라 다를 수 있습니다.
- 하드웨어 이해: CPU 선호도를 설정할 때 CPU 토폴로지(코어, 소켓, NUMA 노드)를 알고 있어야 합니다.
top/htop사용: CPU 사용량, niceness 값 및 프로세스 상태를 모니터링하여 성능 문제를 식별하고 변경 사항을 테스트하십시오.- 우선순위 증가를 위한 루트 권한: 루트만 niceness 값을 낮출 수 있다는 점을 기억하십시오(우선순위 증가). 이 권한을 신중하게 사용하십시오.
- 보수적으로 시작: 우선순위 조정의 경우 극단적인 값(-20 또는 +19)으로 가기 전에 적당한 niceness 값(예: 5, 10)부터 시작하십시오.
- NUMA 인식 고려: NUMA 시스템의 경우
numactl과 같은 도구가 CPU 및 메모리 바인딩에 대한 고급 제어를 제공합니다.
요점
NUMA에 민감한 서비스나 격리된 배치 작업과 같이 배치가 중요할 때 CPU 선호도를 사용하십시오. 문제가 스케줄링 우선순위일 때 nice와 renice를 사용하십시오. 작은 변경부터 시작하고, 읽기 쉬운 CPU 목록을 위해 taskset -c를 선호하며, 튜닝 규칙을 영구적으로 만들기 전에 벤치마킹하십시오.