타임 슬라이스
리눅스 스케줄러의 타임 슬라이스 개념을 실습과 분석을 통해 이해하고, 프로세스의 실행 우선도와 CPU 자원 분배의 상호작용을 살펴본다.
그림으로 배우는 리눅스 구조 정리한 내용
타임 슬라이스
•
리눅스 스케줄러는 실행 가능한 프로세스에 대해 일정한 시간단위(타임슬라이스)로 CPU 자원을 분배한다.
•
이는 다중 프로세스가 하나의 논리 CPU를 공유하는 환경에서 효율적인 자원 할당을 위해 설계되었다.
기본 타임 슬라이스 동작 확인
실습: 논리 CPU에서 타임 슬라이스 확인
논리 CPU에서 동시 실행 가능한 프로세스를 지정하고, 스케줄러가 타임 슬라이스 단위로 CPU 자원을 프로세스에 할당하는 동작을 관찰한다.
•
실습코드: sched.py
for i in 1 2 3; do ./sched.py $i; done
Bash
복사
단일 프로세스 타임 슬라이스 결과
프로세스 2개 타임 슬라이스 결과
프로세스 3개 타임 슬라이스 결과
•
단일 프로세스 실행:
◦
CPU 자원을 독점적으로 사용하여 일정하게 진척도가 진행하였다.
•
여러 프로세스 실행:
◦
CPU 자원이 타임 슬라이스 단위로 각 프로세스에 교대로 할당되었다.
◦
프로세스 개수가 증가할 수록 개별 프로세스가 할당 받는 타임 슬라이스는 짧아진다.
◦
이는 리눅스 스케줄러가 동적 타임 슬라이스 조정을 통해 각 프로세스에 공평하게 CPU를 할당하도록 설계되었기 때문이다.
타임 슬라이스와 우선도(nice)
실습: nice 값에 따른 CPU 자원 할당 변화 관찰
nice값을 조정하여 우선도가 다른 프로세스에 대해 CPU 자원 할당이 어떻게 변화하는지 확인한다.
•
실습코드: sched-nice.py
./sched-nice.py 5
Bash
복사
•
부하처리0: 기본우선도(0) / 부하처리1: 낮은우선도(5)
•
부하처리0이 부하처리1 보다 더 많은 타임 슬라이스를 할당받았다.
•
이는 nice값이 높을수록 우선도가 낮아지고, CPU 자원 할당이 감소하기 때문이다.
실습: 낮은 우선도 프로세스의 CPU 사용률 확인
우선도를 낮춘 프로세스의 CPU 사용률을 관찰하고 %nice필드의 변화를 확인한다.
•
실습코드: inf-loop.py
# nice -n 5 taskset -c 0 ./inf-loop.py &
[1] 75517
# sar -P 0 1 1
# kill 75517
Bash
복사
•
%nice: nice값이 기본값(0)보다 큰 프로세스가 사용자 모드에서 실행된 시간비율
•
%nice값이 거의 100이 되었다. 이는 프로세스 대부분의 시간을 낮은 우선도로 실행했음을 의미한다.
타임 슬라이스와 스케줄링 구조
1.
타임 슬라이스 결정 요인:
•
kernel.sched_latency_ns: 타임 슬라이스 길이를 결정하는 목표 레이턴시 값.
•
타임 슬라이스 = kernel.sched_latency_ns ÷ 실행 가능한 프로세스 개수.
•
논리 CPU 개수와 프로세스 우선도(nice 값)도 영향을 미침.
2.
타임 슬라이스 동적 조정:
•
리눅스 커널 2.6.23 이전에는 고정된 타임 슬라이스(100ms)를 사용.
•
현대 스케줄러는 실행 가능한 프로세스 수에 따라 타임 슬라이스를 동적으로 조정.
3.
스케줄러의 한계와 진화:
•
스케줄링 매개변수(kernel.sched_latency_ns 등)는 커널 버전에 따라 변동 가능.
•
커널 설정은 호스트 환경과 컨테이너 환경에서 다르게 작동할 수 있음.
실습 코드
plot_sched.py
sched.py
sched-nice.py
마무리
본 실습과 분석을 통해 리눅스 스케줄러의 타임 슬라이스 동작 방식과 프로세스 우선도가 CPU 자원 분배에 미치는 영향을 확인했다. 타임 슬라이스는 CPU 자원을 효율적으로 분배하며, 프로세스 개수와 우선도에 따라 동적으로 조정된다. 이를 통해 시스템에서 다중 프로세스를 효과적으로 처리하는 리눅스 스케줄러의 설계를 이해할 수 있었다.
스케줄러 구현에 대해 더 자세히 알고 싶다면 다음 홈페이지 검색해서 공부해보길 바란다.
Q&A
Q. 타임 슬라이스란 무엇인가요?
Q. 타임 슬라이스는 왜 필요한가요?
Q. 타임 슬라이스는 고정값인가요?
Q. 타임 슬라이스 길이는 어떻게 결정되나요?
Q. kernel.sched_latency_ns 값은 어떻게 조정하나요?
Q. Docker 컨테이너에서 kernel.sched_latency_ns를 확인할 수 없던 이유는 무엇인가요?
Q. 여러 프로세스 실행 시 타임 슬라이스는 어떻게 작동하나요?
Q. 왜 단일 프로세스 실행에서는 타임 슬라이스가 중요하지 않나요?
Q. 타임 슬라이스 길이가 짧아지는 것은 성능에 어떤 영향을 미치나요?
Q. nice 값이 프로세스 스케줄링에 어떻게 영향을 미치나요?
Q. nice 값의 범위는 어떻게 설정되나요?
Q. nice 값이 CPU 자원 할당에 미치는 영향은 무엇인가요?
Q. %nice 필드의 의미는 무엇인가요?
Q. sar 명령어에서 %user와 %nice의 차이는 무엇인가요?