Linux CPU 스케줄러에서 게으른 선점 구현을 위한 긴 여정

1 week ago 7

  • 커널의 CPU 스케줄러는 시스템 처리량과 응답 시간 간의 절충을 구현하는 여러 선점 모드를 제공함.
  • 2023년 9월, 스케줄링에 대한 논의에서 "게으른 선점(lazy preemption)"이라는 개념이 제안되었으며, 이는 커널의 스케줄링을 단순화하면서 더 나은 결과를 제공할 수 있음.
  • 이 개념은 한동안 조용했지만, Peter Zijlstra의 패치 시리즈로 다시 등장함.

현재 커널의 선점 모드

  • PREEMPT_NONE: 실행 중인 작업이 시간 슬라이스를 소진했을 때만 선점이 허용됨.
  • PREEMPT_VOLUNTARY: 필요할 경우 커널 내에서 선점이 가능한 많은 지점을 추가함.
  • PREEMPT_FULL: 스핀락이 걸린 경우를 제외하고 거의 모든 지점에서 선점이 가능함.
  • PREEMPT_RT: 대부분의 다른 것보다 선점을 우선시하며, 대부분의 스핀락 코드도 선점 가능하게 만듦.

게으른 선점의 도입

  • 게으른 선점 패치는 새로운 플래그 TIF_NEED_RESCHED_LAZY를 추가하여 즉시가 아닌 어느 시점에 리스케줄링이 필요함을 나타냄.
  • 게으른 선점 모드(PREEMPT_LAZY)에서는 대부분의 이벤트가 이 새로운 플래그를 설정하며, 커널에서 사용자 공간으로 돌아갈 때 두 플래그 중 하나가 설정되면 스케줄러 호출이 이루어짐.
  • 이 변경의 결과로, 게으른 선점 모드에서는 커널의 대부분의 이벤트가 현재 작업을 선점하지 않게 됨.

cond_resched() 제거

  • 이 작업의 최종 목표는 PREEMPT_LAZY와 PREEMPT_FULL 두 가지 비실시간 모드만 남기는 것임.
  • 게으른 모드는 PREEMPT_NONE과 PREEMPT_VOLUNTARY 사이의 위치를 차지하며, 이 두 모드를 대체함.
  • 현재는 cond_resched() 호출이 남아 있으며, PREEMPT_NONE 및 PREEMPT_VOLUNTARY 모드가 존재하는 한 필요함.

GN⁺의 정리

  • 게으른 선점은 커널의 스케줄링을 단순화하고 예측 가능한 지연 시간을 제공하는 데 기여할 수 있음.
  • 이 작업은 커널의 크기를 줄이고 코드를 간소화하는 데 도움이 될 수 있음.
  • 게으른 선점은 PREEMPT_VOLUNTARY와 유사한 처리량을 제공하지만, 더 많은 테스트와 최적화가 필요함.
  • 유사한 기능을 가진 다른 프로젝트로는 FreeBSD의 ULE 스케줄러가 있음.

Read Entire Article