프로세스 스케줄링
스케줄러는 실행 가능한 태스크에 CPU 시간을 배분한다. Linux에서는 스레드도 스케줄링 대상이다. 디스크나 네트워크 응답을 기다리는 태스크는 단순히 우선순위를 높인다고 즉시 실행을 마칠 수 없다.
교과서 알고리즘과 실제 정책 구분하기
FCFS·SJF·Round Robin은 스케줄링 특성을 배우기 좋은 모델이다. 이를 목록으로 외운 뒤 현재 Linux가 그중 하나만 사용한다고 생각하면 실제 동작을 설명하기 어렵다. Linux는 일반 태스크와 실시간 태스크 등 서로 다른 정책을 제공한다.
공정 스케줄링 영역도 버전에 따라 바뀐다. 커널 문서는 Linux 6.6부터 EEVDF로의 전환을 설명한다. 시스템의 커널 버전과 정책을 확인하지 않고 모든 Linux가 같은 CFS 구현을 쓴다고 단정하지 않는다.
실행 상태를 먼저 관찰하기
procps 도구가 있는 Linux에서 실행한다.
ps -eo pid,ppid,stat,ni,pcpu,comm --sort=-pcpu | head
STAT는 태스크 상태, NI는 nice 값, %CPU는 도구가 계산한 CPU 사용률이다. 사용률 계산 구간은 순간적인 실행 상태와 다르다. 필요하면 top처럼 주기적으로 갱신되는 관찰과 함께 본다.
nice 값을 낮추면 일반적으로 더 높은 우선순위를 요청하지만, CPU 시간을 고정 비율로 예약하거나 응답 시간을 보장하지는 않는다. cgroup CPU quota·weight, CPU affinity와 다른 태스크의 부하도 영향을 준다.
CPU가 바쁜 문제인지, 실행 대기가 긴 문제인지, I/O를 기다리는 문제인지 구분한 다음 정책 변경을 검토한다. 관찰 없이 서비스 전체를 실시간 정책으로 바꾸는 것은 다른 작업을 굶길 수 있다.
자료: Linux EEVDF 스케줄러, sched(7)