ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 간단한 리눅스 서버 성능 향상
    소프트웨어 & 잡다 2016. 4. 4. 20:02

    renice 혹은 setpriority() 를 이용한 프로세스 우선순위 스케쥴링이 원하는 대로 되지 않는 문제로 구글링을 하다가 발견한 내용을 공유한다.


    다수의 서버 애플리케이션을 하나의 노드에 올려야 할 일이 있어서, 중요도에 따라 스케쥴링을 하기 위해 renice와 setpriority 함수를 이용하여 테스트 코드를 작성 하였다. 테스트 결과, 동일 터미널 내에서는 우선순위가 제대로 적용 되나 다수의 다른 터미널에서 실행하면 예상했던것과 다르게 적용 되는 것을 확인 하였다. 


    예를 들어, 동일한 우선순위를 가진 무한루프 프로세스를 터미널A 에서 4개 돌리고 터미널B 에서 1개 돌리면, 각각 20%를 점유하는 것이 아니라  터미널 B에서 돌린 1개가 CPU 1개를 100% 점유하고, 터미널A 에서 돌린 프로세스 4개가 그 나머지를 공유하는 것이다. 이 현상은 우선순위가 달라도 동일하게 적용 된다.


    이는 2010년 리눅스 커널에 새로운 기본 스케쥴링으로 CFS(Completely Fair Scheduler)가 적용되었기 때문이다. (https://en.wikipedia.org/wiki/Completely_Fair_Scheduler). 이 알고리즘에 의하면, 각각의 TTY가 동일한 CPU 점유 기회를 갖기 때문에, 하나의 터미널에서 프로세스를 수백개 돌린다 하더라도 다른 터미널에게 심각한 악영향을 끼치지 않는다는 장점이 있다. 특히 GUI 환경에서, 무거운 백그라운드 프로그램을 실행함으로써 화면이 뚝뚝 끊기는 현상을 최소화 할 수 있는 스케쥴링이다.


    그런데 이 스케쥴링 방식 때문에, 프로세스 간의 우선순위 지정이 몹시 어렵게 된다. 왜냐하면 터미널간의 우선순위가 동일하면 CPU 점유 기회가 균등하기 때문에 다음과 같은 스케쥴링이 불가능하다.


    프로그램 A : Any Task 우선순위 중

    프로그램 B : Task Type A는 우선순위 상, Task Type B는 우선순위 하


    표면적으로는 Task Type A가 최 우선으로 처리 되어야 하지만, 실제로는 프로그램 A의 Any Task와 균등한 기회를 얻게 된다. 심지어 Task Type B때문에 더 방해를 받게 되어 결과적으로는 Any Task 보다 더 낮은 기회를 갖게 되는 것이다.


    이는 최고의 성능까지 뽑아내야 하는 서버 애플리케이션에게는 좋지 않은 영향을 미칠 수 있으며, 이 기능을 끄는것을 고려해 볼 필요가 있다. 


    옵션이 설정 되어 있는지 확인하는 방법

    cat /proc/sys/kernel/sched_autogroup_enabled 


    옵션을 끄는 방법은

    sudo sysctl kernel.sched_autogroup_enabled=0


    실제로 위의 옵션을 끈 후, 프로세스간의 스케쥴링이 원하는대로 되는것을 확인 하였다.


    추가로, sched_migration_cost_ns 옵션도 함께 조절함으로써 상당한 성능 향상을 얻을 수 있다고 한다.

    자세한 내용은 아래 원문을 참고할것.


    원문: http://www.postgresql.org/message-id/50E4AAB1.9040902@optionshouse.com

    댓글

Designed by Tistory.