라벨이 최적화인 게시물 표시

한대의 서버를 최대한 능력치로 끌어올리는 방법

 서버 한대에서 서비스를 하고자 할 때 보통 최대한 능력으로 사용하지 않는다. 이런 서버를 여러대 운영하다 보면 비효율적이란 생각이 든다. X86 서버 한대에 웹서비스를 운영한 경험이 있다. 1초에 한번씩 API를 호출하는 안드로이드 앱이 6천대 정도가 실행되는 환경이었다. 서버는 단 한대...., 보안 때문에 비용 때문에 각각의 이유로.... 그러한 서비스를 받아줄 서버는 X86 서버 한대 뿐이었다. 일단 API 서비스를 만들었다. 경량웹서비스인 Perfect 웹 프레임워크를 이용해서 만들었다. 스위프트 언어를 사용할 수 있어서 고차함수를 사용하면 아무래도 서비스를 좀 더 효율적으로 만들 수 있는 장점이 있다. 그리고 아이폰 개발자에게 좀 더 쉽게 다가갈 수 있었다. 또한 많이 사용하는 프레임워크가 아니라 보안에 우수한 장점이 있다. 웹서비스를 포트로 여러개를 만들어서 컴파일 했다. web_perfect_8100, web_perfect_8101,.... 이런 식으로... 필요한 서비스를 확장시켰다. 그리고 서버에 haproxy 를 설치했다. 외부에서 접속하는 것은 443 포트만 열었으며 나머지는 닫았다. haproxy 설정에서 각 서비스를 체크해서 분기하도록 설정했다. 서버의 상태를 보면서 이 서비스를 확장시켰다. 최대한 사용하도록 했더니 한대로 서비스를 해도 충분했다. 6천대가 사용하는데 동시접속은 거의 1천대 정도 되었으며 세션은 항상 10만개 정도 붙어 있었다. 그 이상 더 늘릴 수 있는데 못한 것은 데이터베이스 서버가 그 이상을 늘렸을 경우 응답속도가 급격히 저하되었다. 다음에 시간이 되면 데이터베이스 최적화한 경험을 이야기 해볼까 한다.

아파치 웹서버 최적화 하기

잘 되던 웹서버가 갑자기 느려졌다. 원인이 무엇일까 ? 원인보다는 느려진 것을 빠르게 설정하는 게 우선이다. 보통 디폴트로 설치하면 프로세스 모드로 설치된다. 여러가지 설정 중에 KeepAliveTimeOut 이 가장 영향을 많이 미치는 거 같다. extra/httpd-mpm.conf 파일에서 <IfModule mpm_prefork_module>   StartServers  5   MinSpareServers 5   MaxSpareServers 10   MaxClients 150   MaxRequestsPerChild 0 </IfModule> 위 설정에서 특히 MaxRequestsPerChile 를 2000으로 하면 좋다는 글을 보고 무심코 설정했다가 웹서버가 마비되었다. extra/httpd-default.conf 파일에서 TimeOut 300 KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeOut 5 위 값은 될 수 있으면 지켜야 한다. 특히 KeepAliveTimeOut 을 디폴트 15로 하라는 조언때문에 마비되었다. 위 값들에서 조금씩 변경해보면서 최적화 값을 찾아야 겠다. 그보다 다시 컴파일 해서 스레드 모드로 돌리는 방법과 NginX 를 앞단에서 처리하고 그 뒤에 아파치가 처리하는 방법도 같이 검토해봐야겠다. 접속자가 점점 많아지는데 대비하지 않으면 언젠가 장애는 온다.