Linux 서버에서는 수십 개에서 수천 개의 프로세스가 동시에 실행됩니다. 웹 서버는 사용자 요청을 처리하고, 데이터베이스는 쿼리를 실행하며, 백업 프로그램과 모니터링 프로그램도 동시에 동작합니다.
하지만 CPU 코어의 개수는 제한되어 있기 때문에 모든 프로세스를 동시에 실행할 수는 없습니다. 이때 어떤 프로세스를 먼저 실행할지 결정하는 역할을 하는 것이 바로 Process Scheduler(프로세스 스케줄러) 입니다.
이번 글에서는 Linux Process Scheduler의 개념과 동작 원리, 스케줄링 정책, 그리고 실무에서 확인하는 방법까지 자세히 알아보겠습니다.
Process Scheduler란?
Process Scheduler는 CPU를 사용할 프로세스를 선택하는 Kernel의 기능입니다.
실행 가능한 프로세스가 여러 개 존재하면 Scheduler가 우선순위와 정책에 따라 CPU를 할당합니다.
간단한 구조는 다음과 같습니다.
실행 가능한 프로세스
↓
Scheduler
↓
CPU 할당
↓
프로세스 실행
↓
다음 프로세스 선택
이 과정을 매우 빠르게 반복하기 때문에 사용자는 여러 프로그램이 동시에 실행되는 것처럼 느끼게 됩니다.
Scheduler가 필요한 이유
예를 들어 CPU가 하나인데 실행 가능한 프로세스가 네 개라고 가정해 보겠습니다.
- Chrome
- MySQL
- Nginx
- Python
모두 동시에 CPU를 사용할 수는 없습니다.
Scheduler는 다음과 같이 매우 짧은 시간 단위로 CPU를 번갈아 할당합니다.
CPU
↓
Chrome
↓
MySQL
↓
Python
↓
Nginx
↓
Chrome
↓
...
이러한 방식을 시분할(Time Sharing) 이라고 합니다.
Linux의 기본 스케줄러
현재 대부분의 Linux 배포판은 CFS(Completely Fair Scheduler) 를 기본 스케줄러로 사용합니다.
CFS의 목표는 모든 프로세스가 가능한 한 공평하게 CPU 시간을 사용하는 것입니다.
특징은 다음과 같습니다.
- 공정한 CPU 분배
- 높은 응답성
- 멀티코어 지원
- 동적 우선순위 적용
데스크톱과 서버 환경 모두에서 널리 사용됩니다.
Process의 상태
Scheduler는 실행 가능한 프로세스만 선택합니다.
프로세스는 일반적으로 다음 상태를 가집니다.
New
↓
Ready
↓
Running
↓
Waiting
↓
Ready
↓
Terminated
- Ready : 실행 대기
- Running : CPU 사용 중
- Waiting : 입출력 대기
- Terminated : 종료
Waiting 상태의 프로세스는 CPU를 사용하지 않습니다.
Time Slice란?
Scheduler는 프로세스에게 일정 시간 동안 CPU를 사용할 권한을 부여합니다.
이를 Time Slice(타임 슬라이스) 또는 CPU Quantum이라고 합니다.
Process A
■■■■
↓
Process B
■■■■
↓
Process C
■■■■
Time Slice가 끝나면 Scheduler는 다른 프로세스를 선택합니다.
Priority(우선순위)
Linux는 프로세스마다 우선순위를 가지고 있습니다.
우선순위가 높은 프로세스는 CPU를 더 자주 사용할 가능성이 높습니다.
대표적인 값은 다음과 같습니다.
- Nice Value
- Real-Time Priority
Nice 값 확인
ps -el
또는
top
NI 열에서 Nice 값을 확인할 수 있습니다.
현재 Scheduler 확인
프로세스의 스케줄링 정책은 다음 명령으로 확인할 수 있습니다.
chrt -p PID
예시
chrt -p 1234
출력 예시
pid 1234's current scheduling policy: SCHED_OTHER
Scheduler 관련 정책
Linux에는 여러 가지 스케줄링 정책이 있습니다.
| 정책 | 설명 |
|---|---|
| SCHED_OTHER | 일반 프로세스 기본 정책 |
| SCHED_FIFO | 실시간 선입선출 |
| SCHED_RR | 실시간 Round Robin |
| SCHED_BATCH | 배치 작업 |
| SCHED_IDLE | 매우 낮은 우선순위 |
일반적인 서버에서는 대부분 SCHED_OTHER를 사용합니다.
CPU 사용률 확인
Scheduler 동작을 확인할 때 자주 사용하는 명령입니다.
현재 CPU 사용률
top
또는
htop
프로세스별 CPU 사용률
ps -eo pid,comm,%cpu --sort=-%cpu
CPU 코어 정보
lscpu
실시간 CPU 통계
mpstat -P ALL 1
실무 사례
예를 들어 웹 서버에서 CPU 사용률이 100%라면 다음 순서로 확인합니다.
top으로 CPU 사용률 확인- CPU를 많이 사용하는 프로세스 확인
ps로 PID 확인chrt로 스케줄링 정책 확인- 필요하면 Nice 값 조정
이러한 절차를 통해 CPU 병목 현상을 분석할 수 있습니다.
Scheduler와 Context Switch
Scheduler는 CPU를 다른 프로세스로 넘겨줄 때 Context Switch를 수행합니다.
Process A 실행
↓
Context Switch
↓
Process B 실행
Context Switch에는 일정한 비용이 발생합니다.
너무 자주 발생하면 CPU 성능이 저하될 수 있습니다.
다음 글에서는 Context Switch를 자세히 다룰 예정입니다.
실무에서 자주 사용하는 명령어
현재 CPU 상태
top
프로세스 정보
ps -ef
CPU 사용률
ps -eo pid,comm,%cpu --sort=-%cpu
Scheduler 확인
chrt -p PID
CPU 정보
lscpu
실시간 CPU 통계
mpstat -P ALL 1
자주 묻는 질문
Scheduler는 CPU마다 존재하나요?
멀티코어 시스템에서는 각 CPU 코어마다 실행 큐(Run Queue)를 관리하며, Scheduler는 코어 간 부하를 균형 있게 분산하도록 동작합니다.
CFS는 무엇의 약자인가요?
Completely Fair Scheduler의 약자이며, 현재 대부분의 Linux 배포판에서 사용하는 기본 CPU 스케줄러입니다.
Scheduler를 변경할 수 있나요?
프로세스별로 chrt 명령을 사용해 스케줄링 정책을 변경할 수 있으며, 실시간 프로세스에는 SCHED_FIFO나 SCHED_RR을 사용할 수 있습니다. 다만 운영 환경에서는 충분한 검토 후 적용해야 합니다.
마무리
Linux Process Scheduler는 CPU를 가장 효율적으로 활용하기 위해 실행 가능한 프로세스에 CPU 시간을 배분하는 Kernel의 핵심 기능입니다. 현대 Linux에서는 CFS를 기반으로 공정한 스케줄링을 제공하며, 프로세스 상태와 우선순위, Time Slice 등을 고려해 CPU를 관리합니다. Scheduler의 동작 원리를 이해하면 CPU 성능 분석과 시스템 튜닝, 장애 해결 능력을 크게 향상시킬 수 있습니다.