본문 바로가기

프로그래밍

간단한 리눅스 서버 성능 향상

안녕하세요 asbear입니다. ^^ 10년간 변함없이 곰같은 블로그에 방문해 주셔서 늘 감사합니다!
[해외취업 첫걸음, 꿈이 현실로!]로 오셔서 그룹에 조인 하시면 저와 소통 하실 수 있습니다.
또한 제가 지난달부터 해외취업 전문 블로그 포쉬포우 in 런던(https://poshpaws.tistory.com) 을 함께 운영하고 있습니다. 개발자와 디자이너의 영국취업 스토리와 좀더 전문적인 칼럼 글도 연재 하고 있으며 진로상담과 전문 컨설팅도 제공합니다. 해외 취업에 관심이 있는 분들의 방문을 기다립니다!

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