강좌 & 팁
최근 시스템에서 측정되는 성능과 관련된 이슈에서 타이머에
의한 시간 오차를 생각해 보게되었습니다.
리눅스 시스템에는 기본적으로 적요되었던 HZ 라는 tick 주기에 의해
업데이트 되는 jiffies 라는 전역 변수가 있죠
시간을 구할때는 시스템에는 두가지 형태의 타이머가 존재합니다.
주기적으로 발생하는 tick 이라는 개념의 타이머와
시스템의 동작과 관련없이 무조건 흘러가는 타이머 두가지가 있습니다.
보통은 tick 에 의한 타이머에 의해서 시스템의 시간이 계산되고 스케쥴러등이 동작하고
시스템 클럭을 그대로 반영하는 타이머에서는 값을 읽어서 정밀한 계산을 할때에
사용되기도 합니다.
하지만 2.6.21에서부터는 high resolution 타이머가 도입되었고
시간 관련한 클럭의 서브시스템이 구현되면서 많은 변화가 있었습니다.
tickless 시스템이라고 이야기 하는 다음번 이벤트 즉 스케쥴링이 필요할때에 맞추어
시스템이 깨어나도록 tick 을 설정하고 잠들수 있도록 하는 것이죠
쉽게 얘기하면 다음번 이벤트가 아무것도 없는 경우에는 외부 입력이든지
네트워크의 패킷 도착, 사용자 입력등을 대기하는 상태로 시스템이 정지하게 됩니다.
사실 아무런 할일이 없는 상태에서의 tick 에서 하는 일은 타이머 값을 감소시키는 것 외에는
하는 일이 없기 때문입니다.
스케쥴러에서도 하는 일이 없고 외부 입력도 없다면 시스템은 정지 상태로 있어도 아무런 문제가 없죠
이를 구현하기 위해서 Clockevents and dyntick 이라는 주제로 LWN 에 올라온 적이 있습니다.
실제로 리눅스 커널에서 그런 형태의 코드가 있을까요?
아키텍쳐 별로 구현되어 있기는 하지만 여러분이 사용하는 커널의 예를 들어 ARM 이라면
arch/arm/kernel/process.c
void cpu_idle(void)
함수를 찾아 보시기 바랍니다.
시스템이 idle 로 진입하기 전에 다음번 tick 설정을 tickless 로 구현하는 코드가 있을 것입니다.
바로 tick_nohz_idle_enter() 와 tick_nohz_idle_exit() 입니다.