cfs scheduler 4 & load balancing preliminary concepts ( 스케쥴러 로드 분산) cfs 스케쥴러

 
   "  음양이 상마하여 길흉이 결정된다.
        이에 군자는 그 마음을 평안히 하여 대의를 구현하며,   그 주어진 명을 따른다 "




  cfs 스케쥴러를 좀 더 깊게 이해하기 위해서는  로드 분산에 대한 기본개념과 이와 관련된 몇가지 개념을
 숙지해야 합니다.
 이 번에는 로드 분산을 위한 기본 개념과
 이에 필요한 metric을 살펴보겠습니다.


 각각의 cpu는  cpu 별로 별도의 실행큐의 트리를 갖고 있습니다.

  각 cpu 별로 전통적인 struct rq 구조체를 갖고  rq는 그 멤버로 cfs_rq 구조체를  갖습니다.

 각 cpu별로 최적의 실행 환경은 한쪽 cpu에 다수의 프로세스가 대기하지 않고  평균적으로 동등한 로드를 갖는 상황입니다.
 cpu 1에 대기 중인 프로세스가 10개이고 cpu2에는 2개인 경우, 그리고 각 각의 프로세스가 동일한 priority를 갖고,  실행주기가
 10ms 인 경우..
 cpu 1에 있는 프로세스들은 time slice는 1ms이며 9m를 기다려야 실행 될 수 있고 cpu 2는 5ms, 5ms마다 실행될것 입니다.
 프로세스의 응답 시간이 저조한 특성들을 갖게 됩니다.

 cfs에서는 프로세스의 중요도를 판단하는 특성은  nice 값에 근거한 load.weight값 입니다.

 cpu 1에 프로세스 a ( 10000 ) 만 있고 , cpu 2에  b(1024) , c(1024)가 존재하는 상황이라면,
 cpu 1이 더 많은 로드를 갖는것으로 간주되며 , 런큐상에 존재하는 프로세스의 수에 따라 로드를 판단하지 않습니다.

 우선 cfs_rq 구조체를 살펴 보겠습니다.

 struct cfs_rq {
    struct load_weight load;
    unsigned long nr_running, h_nr_running;

    u64 exec_clock;
    u64 min_vruntime;
    .....
}
로 load 멤버는 큐상에 존재하는 sched_entity->load.weight의 합을 갖고 있습니다.

로드 밸런스를 수행하는 함수를 load_balance( cfs_rq a , cfs_rq b)라고 하면
a.load.weight 와 b.load.weight의 평균값을 취한 후 , 더 큰 로드를 갖는 큐에서 평균값의 차 만큼의 sched_entity를
더 적은 로드를 갖는 cpu의 큐로 이동시켜주게 됩니다.

여기서 유의할 사항은  cpu에서 다른 cpu로 프로세스를 옮기는 작업은 ,  로컬 cpu의 캐쉬값 무효화등의 댓가를 치뤄야합니다.
그리고  cpu와 cpu의 평균값에서의 차만을  load balancing의 판단기준으로 삼을때  , ping pong 현상이 나타날 수 있습니다.

예를 들어 보죠!
 cpu A에   프로세스 a(1024) b(1024) c(1024)의 
 cpu B에   프로세스 d(1024) e(1024) 가 있는 상황에서
주기적으로 실행되는 로드 밸런싱은
 1차시   A -> B 로 c를  이동(migration)시키고
 2차시   A <- B 로 c를  다시 이동시키는 과정을 계속 반복하게 됩니다.

load balancing ping pong을 미연에 방지하기 위해 , 로드 발랜싱을 수행하기 위한 임계치를 두게 됩니다.
그 방법은 cpu 1과 2의 로드값의 차가 %이상이어야 load balancing을 수행하는 조건을 두는 겁니다.
즉 if( a.load < 0.5*(b.load) ) 라는 조건을 두어서
cpu a의 로드가 b의 50% 이하이면 수행하는 조건을 두게 됩니다.
실제 코드상에서는 floating point 연산을 피하기 위해, normalized된 값들을 곱해 int 연산으로 처리합니다.

실제 코드상에서 이러한 기법들이 여러 곳에서 보이게 됩니다.



덧글

  • sana 2016/04/28 15:18 # 삭제 답글

    스케줄러 관련된 블로그 내용 어떤 책을 기반으로 작성하셨는지 알 수 있을까요?
  • 솔개가하늘을가르네 2016/04/30 06:41 # 답글

    책보다는 , 소스코드를 분석하면서 필요한 자료를 찾아가며 작성했습니다.
  • 지나가는 행인 2017/02/21 20:47 # 삭제 답글

    감사합니다. 너무나 큰 도움을 받았네요!!
    로드밸런싱하는 코드를 찾아보려고 하던 중이었는데, 이 글을 보고 분석을 하게되서 훨씬 수월해질 것 같습니다. 감사합니다~~~
  • 솔개가하늘을가르네 2017/03/31 12:40 # 답글

    네 도움이 되서 저도 기쁩니다^.^
댓글 입력 영역