개발

Clutch와 EEVDF 스케줄러를 구분해서 기억하기

처음에는 둘 다 deadline이라는 말을 쓰니까 비슷한 계열의 스케줄러처럼 보였다. Clutch도 EDF를 말하고, EEVDF도 virtual deadline을 말한다. 그런데 자료를 확인해 보니 둘은 같은 단어를 전혀 다른 위치에서 쓰고 있었다.

내가 헷갈렸던 지점은 “deadline을 쓴다”가 아니라 “무엇의 deadline인가”였다. Clutch는 Apple XNU에서 QoS bucket, thread group, thread 순서로 내려가며 고른다. EEVDF는 Linux에서 runnable task의 lag와 virtual deadline을 계산해 다음 task를 고른다. 하나는 workload의 의미를 보존하려는 쪽이고, 하나는 task 사이의 공정성을 deadline 모델로 계산하는 쪽이다.

Clutch와 EEVDF 스케줄러 비교

내가 이해한 개념

Clutch는 스레드 하나만 보지 않으려는 스케줄러다. Apple의 Clutch 문서는 기존 Mach 스케줄러가 스레드 우선순위와 decay 중심으로 동작하면서, 여러 스레드가 어떤 상위 사용자 작업에 묶여 있는지 잃기 쉽다는 문제의식에서 출발한다. 그래서 Clutch는 thread group을 스케줄링의 중요한 단위로 둔다.

내 말로 바꾸면 Clutch는 “이 스레드가 몇 점짜리인가”만 보는 대신, “이 스레드는 어떤 앱이나 사용자 작업의 일부인가”를 같이 보는 방식이다. UI, 멀티미디어, 백그라운드 작업처럼 사용자 체감이 다른 일을 같은 줄에 세우면 이상해지니, 먼저 일의 성격을 나누고 그 안에서 다시 고른다.

EEVDF는 fair scheduler 쪽의 계산 모델이다. Linux 문서는 EEVDF를 같은 우선순위의 runnable task 사이에서 CPU 시간을 나누는 방식으로 설명한다. 각 task가 받아야 할 몫보다 덜 받았는지 더 받았는지를 lag로 보고, 실행 자격이 있는 task 중 virtual deadline이 가장 빠른 것을 고른다.

내 말로 바꾸면 EEVDF는 “이 task가 CPU를 받을 빚이 있는가”를 먼저 확인하고, 받을 자격이 있다면 “누가 가장 먼저 처리되어야 하는가”를 virtual deadline으로 판단하는 방식이다.

핵심 흐름

  • Clutch는 Scheduling Bucket -> Thread Group -> Thread 순서로 내려간다.
  • Scheduling Bucket은 QoS에 대응되는 상위 단계다. 여기서 EDF를 쓰고, bucket마다 WCEL을 이용해 deadline을 잡는다.
  • Thread Group 단계에서는 같은 bucket 안에서 어떤 앱이나 workload 묶음을 먼저 돌릴지 고른다.
  • Thread 단계에서는 마지막으로 실제 실행할 thread를 고른다. 이 단계에는 기존 Mach의 time-sharing priority decay 성격이 남아 있다.

Clutch의 deadline은 task 하나를 직접 고르는 값이라기보다, 상위 bucket이 너무 오래 밀리지 않게 하기 위한 정책 장치에 가깝다. 여기에 warp 같은 장치가 붙어 높은 QoS 쪽 작업이 일정 범위 안에서 앞으로 당겨질 수 있다.

  • EEVDF는 runnable task마다 lag를 계산한다.
  • lag가 양수라는 것은 공정한 몫보다 덜 받았다는 뜻이다.
  • 실행 자격이 있는 task, 즉 lag >= 0인 task를 후보로 본다.
  • 그 후보 중 virtual deadline이 가장 빠른 task를 고른다.

EEVDF의 deadline은 task 선택 자체에 붙어 있다. fair share를 기준으로 누가 덜 받았고, 그중 누가 가장 급한지를 계산하는 값이다. 그래서 Clutch의 QoS bucket deadline과 EEVDF의 virtual deadline을 같은 층위의 개념으로 보면 헷갈린다.

특히 다른 포인트

  • Clutch의 중심 질문은 “이 일은 사용자에게 어떤 의미인가”다.
  • EEVDF의 중심 질문은 “이 task는 공정한 CPU 몫을 덜 받았는가”다.
  • Clutch는 workload와 thread group이라는 맥락을 보존하려 한다.
  • EEVDF는 task 또는 sched entity 단위의 공정성을 계산한다.
  • Clutch에서 EDF는 주로 bucket 선택 단계에 있다.
  • EEVDF에서 virtual deadline은 다음 task를 고르는 핵심 기준이다.

이 차이 때문에 Clutch는 사용자 체감과 QoS를 보존하는 정책에 더 가까워 보인다. EEVDF는 task 사이의 fairness와 latency를 함께 계산하는 모델에 더 가까워 보인다.

확인한 자료

  • Apple XNU의 sched_clutch.md는 Clutch가 Scheduling Bucket, Thread Group, Thread의 3단계 구조로 동작한다고 설명한다.
  • Linux kernel의 EEVDF 문서는 lag가 0 이상인 task 중 earliest virtual deadline을 가진 task를 고른다고 설명한다.
  • 두 문서에 직접 나온 구조만 단정했고, 성능 우열이나 실제 기기별 체감 차이는 다루지 않았다.

결론 및 리마인드

Clutch와 EEVDF를 구분할 때는 deadline이라는 단어에 먼저 끌려가면 안 된다. Clutch는 workload 의미를 살리기 위해 상위 bucket과 thread group을 고르는 스케줄러이고, EEVDF는 fair share 관점에서 task의 lag와 virtual deadline을 계산하는 스케줄러다.

나중에 다시 헷갈리면 이 한 줄만 먼저 보면 된다.

Clutch는 “어떤 종류의 일인가”를 먼저 보고, EEVDF는 “누가 CPU를 덜 받았는가”를 먼저 본다.