개요

Double Scheduling은 두개의 스케쥴러가 stack을 이룬 경우를 말한다. VM환경에서 host scheduler랑 guest scheduler가 서로 stack을 이루게 되면, host scheduler가 guest scheduler에 대한 시맨틱 정보가 없기 때문에, 잘못된 결정을 내리는 경우가 생길수도 있다. 예를 들어서 guest vCPU가 critical task를 진행하고 있는 중에서 evicted되면, 이 eviction을 처리하기 위한 나머지 모든 vCPU가 block되기 때문에 치명적인 성능저하를 가져올 수 있다.

종류

Lock holder preemption

LHP (Lock holder preemption)은 lock을 holding vCPU가 preempted (schedule out)되었을 경우 다른 모든 CPU들이 이 useless한 lock waiting을 위해서 낭비되는 현상을 말한다. memory intensive한 환경에서 거의 90%의 preemption이 바로 이 LHP때문에 발생 하는 것으로 알려져 있다. 보통 lock을 걸면 interrupt를 disable시켜서 lock이 처리되는 동안은 schedule out되지 않도록 막는데, 바로 이 blocking이 적절하게 일어나지 않을 경우에 발생한다.

Lock watier preemption

바로 다음 waiter가 lock을 획득하지 못한채 선점되는 경우를 말한다. 이러한 경우는 ticket lock에서 볼수 있는데, lock이 release되었지만, next waiter의 ticket lock 우선순위가 높지 못하여, 다른 높은 우선순위를 가진 vCPU들이 useless한 연산을 낭비하는 경우를 말한다. Lock stealing이 가능하도록 구현하면 쉽게 이 문제를 해결할 수 있다.

Blocked waiter wakeup

만약 어떤 스레드가 blocked되면 보통 이 스레드가 할당된 코어는 다른 것으로 할당 되거나 halted되게 된다. 일반적인 상황에서는 만약 다음에 스케쥴되어야 하는 환경이 되면 (unblock되면) IPI를 통해서 halted된 코어를 깨우는데, 만약 VM환경에서 이 코어가 de scheduled되면 보다 복잡한 명령어 즉 VM-Enter와 같은 VmTrap 명령어를 사용해야 하는 경우가 생기는 현상을 말한다.

Readers preemption

Reader writer lock에서 read lock를 가지고 있는 lock들이 preempted되면 writer lock의 latency가 길어지는 현상을 말한다.

이 밖에도 VM환경에서 lock으로 인해서 생기는 문제는 RCU reader preemption, Interrupt context preemption등이 있다.

참고

  1. https://gts3.org/assets/papers/2020/kashyap:thesis.pdf