홈으로 돌아가기

sched_ext: Linux 6.12의 BPF 스케줄러

Linux 6.12의 sched_ext는 로직을 커널에서 분리한 동적 BPF 작업 스케줄링 정책을 도입합니다. enqueue/dispatch 훅 설명, scx_horoscope/lavd/rusty 예제, 벤치마크 및 사용 사례.

Linux의 BPF sched_ext 정책: 실험에서 프로덕션까지
Advertisement 728x90

Linux 커널 6.12의 sched_ext: BPF를 활용한 동적 스케줄러

Linux 커널 6.12 릴리스에서 sched_ext 스케줄러 클래스가 도입되었습니다. 이는 BPF 프로그램을 통해 태스크 스케줄링 로직을 동적으로 교체할 수 있게 해주며, 알고리즘 실험 시 패치나 커널 재빌드의 필요성을 없앱니다. 정책은 사용자 공간에서 로드되며, 실패 시 SCHED_NORMAL로 폴백하는 메커니즘으로 커널이 안전성을 보장합니다.

sched_ext 클래스는 책임을 분리합니다: 커널은 디스패치 큐(DSQ), 태스크 마이그레이션, 상태 관리를 담당하고, BPF 정책은 분류, 랭크, 타임 슬라이스를 결정합니다. 태스크 웨이크업 시 enqueue() 훅이 호출되며, 커널 디스패치 시 dispatch()가 호출됩니다.

sched_ext에서의 태스크 생명주기

태스크는 try_to_wake_up()을 통해 웨이크업되며, 정책은 웨이크업 패턴, CPU/입출력 사용량, cgroup, 실시간 정책(SCHED_FIFO, SCHED_RR)의 존재 등의 특성을 분석합니다. 정책은 태스크를 전역 또는 로컬 큐에 배치하며, 우선순위를 위해 가상 시간을 사용합니다.

Google AdInline article slot

dispatch()에서 태스크는 디큐되어 나노초 단위 타임 슬라이스와 함께 scx_bpf_dispatch()를 통해 커널에 전달됩니다. 로드 밸런싱이나 캐시 지역성 위해 scx_bpf_kick_cpu()로 마이그레이션이 트리거됩니다.

DSQ 큐는 삽입 방법에 따라 FIFO 또는 우선순위 모드로 작동합니다:

  • scx_bpf_dispatch() — FIFO 의미론.
  • scx_bpf_dispatch_vtime() — vtime 기준 정렬.

정책의 내부 랭크(점수)는 커널 우선순위(nice, prio)에 영향을 주지 않습니다.

Google AdInline article slot

예제: scx_horoscope를 통한 기능 데모

scx_horoscope 프로젝트는 점성술 데이터를 사용해 타임 슬라이스를 조정하며, sched_ext 패턴을 보여줍니다. 60초마다 행성 위치, 역행, 달 위상을 계산해 계수를 생성합니다.

태스크 분류 기준:

  • 실시간 정책.
  • 웨이크업 패턴.
  • CPU/입출력 사용량.
  • cgroup.

기본 타임 슬라이스는 승수로 조정됩니다: 황도대 별자리는 태스크 유형에 따라 슬라이스를 증감시키고, 역행은 50% 페널티를 부과하며, 보름달은 상호작용 태스크에 보너스를 줍니다. 슬라이스는 min_slice_nsmax_slice_ns로 제한됩니다.

Google AdInline article slot

이는 교육적 예제입니다: 안정적 작동과 실제 계산이지만, 프로덕션 사용에 과학적 근거는 없습니다.

sched_ext 기반 실용 스케줄러

scx 생태계에는 프로덕션 지향 정책이 포함됩니다:

  • scx_lavd (Latency-Aware Virtual Deadline): 웨이크업 패턴 기반 가상 데드라인으로 데스크톱에서 CFS 대비 99 백분위 지연을 15–30% 줄임.
  • scx_rusty: 서버용 NUMA 최적화, 마이그레이션 최소화, 열 제한 인식.
  • scx_flash: 공유 메모리를 통한 사용자 공간 ML 예측.

개발 주기가 몇 시간으로 단축되었습니다: 빌드, 로드, 메트릭, 반복—리부트 불필요.

벤치마킹 도구

평가 방법:

  • /sys/kernel/sched_ext/ — 디스패치 및 마이그레이션 메트릭.
  • bpftrace — 이벤트 추적.
  • perf sched — 컨텍스트 스위치 지연.
  • cyclictest — 꼬리 지연.

평균이 아닌 백분위에 초점: 꼬리가 반응성에 중요합니다.

사용 사례:

  • 게임 서버: 게임 로직에 보장 슬라이스, 백그라운드 태스크 격리.
  • 임베디드 시스템: 스위치 빈도 줄이기 위한 태스크 그룹화.
  • 클라우드: cgroup을 넘어선 대역폭 보장.
  • 오디오/비디오: 코어 예약, 지터 최소화.

제한사항 및 개발

높은 스위치율에서 디스패치 호출 오버헤드가 증가합니다. 논리 오류는 패닉 없이 성능을 저하시킵니다. API는 진화 중이며, 기능은 실험적입니다.

주요 포인트:

  • 6.12의 sched_ext (CONFIG_SCHED_CLASS_EXT 포함).
  • 빠른 프로토타이핑을 위한 BPF 정책.
  • 실패 시 SCHED_NORMAL 폴백.
  • 벤치마크에서 백분위 초점.
  • 지연 민감 및 NUMA 시나리오 적용.

— Editorial Team

Advertisement 728x90

다음 읽기