본문 바로가기

AWS 기본 환경 실습/AWS 부하 테스트

2. 웹 서버 병목 원인과 대책

웹 서버가 병목인 경우 다음과 같은 내용을 위에서부터 순차적으로 확인한다. 이 순서는 대책 방안을 적용했을 대 영향도가 큰 순서로 정렬한 것이다.

 

웹 서버를 튜닝하고 병목을 제거하면 웹 서버 Throughput이 향상 되기 때문에 웹 서버보다 저렴한 인스턴스와 더 작은 인스턴스 수로도 시스템 전체로 보게 되면 같은 성능을 낼 수 있게 된다.

 

- 운영체제와 미들웨어 설정 문제

- 웹 프레임워크 문제

- 애플리케이션 문제

- 서버 리소스 성능 부족

 

ㅁ 운영체제와 미들웨어 설정 문제

 

Apache와 Nginx 등의 HTTP 서버나 사용 중인 프로그래밍 언어 설정을 수정한다.

 

ㅇ TCP 포트 부족

 

 테스트 도구와 같이 웹 서버에서 외부 서버(DB 서버나 웹 서버)와 통신을 할 때 많은 부하가 장시간 발생하면 TCP 포트가 부족하게 되어 신규 접속이 불가능해지는 경우가 있다. 이럴 땐 운영체제 설정을 변경해야 한다.

더보기

[Windows]

클라이언트 TCP/IP 소켓 접속에 동적으로 할당된 임시 포트 제한을 설정

 

ㅁ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 에 아래 값 등록

   값 이름: MaxUserPort

   값 종류: DWORD

   값 데이터: 5,000 ~ 65,534 사이의 10진수

 

클라이언트 TCP/IP 소켓 접속 타임아웃 값을 기존값 240초보다 짧게 설정

 

ㅁ HKEY_LOCAL_MACHINE\SYSTEM\CurrentcontrolSet\Services\Tcpip\Parameters

  값 이름: TcTimedWaitDelay

  값 종류: DWORD

  값 데이터: 30~240 사이의 10진수

 

[Linux]

 

Linux계 OS에서 TCP 관련 커널 파라미터를 설정하려면 /etc/sysctl.conf에 설정값을 넣고 root 권한으로 다음과 같이 실행하면 설정하면 설정한 값이 반영된다.

 

$ sysctl -p

추천 설정은 아래와 같다.

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30

net.ipv4.tcp_tw_reuse=1은 TIME_WAIT 상태 연결을 새로운 연결에 재사용한다는 의미이다. 

ㅇ HTTP 서버의 불필요한 기능 사용 중

 

대부분 정적 파일만 처리하고 있는 환경에서 전체 throughput이 나오지 않는 경우에는 먼저 HTTP 서버 기능을 확인한다. Apache나 Nginx에서는 많은 기능을 제공하고 있고 불필요한 기능은 사용하지 않도록 한다.

 

ㅇ HTTP 서버 기동 파라미터 설정 부족

 

Apache의 MaxClients 설정 등이 사용중인 인스턴스 타입과 맞는지 확인한다. 클라우드에서는 인스턴스 타입 변경으로 메모리 용량이나 CPU 파워를 느릴 수 있지만, 설치하여 사용하고 있는 미들웨어 설정 등은 자동 변경되지 않는다. 

 

 ㅇ 크기가 큰 데이터 이용으로 많은 네트워크 사용

 

콘텐츠 데이터 크기가 큰 경우 네트워크 대역을 점유할 수 있어 전체 Throughput이 낮아질 수 있다. 이런 경우에는 HTTP 서버 쪽 압축을 사용하면 네트워크 대역 병목을 피할 수 있다.

 

예를 들어 Apache에서는 mod_deflate를 사용하면 자동으로 압축 전송을 할 수 있다.

 

 ㅇ 웹 가속기 사용

 

웹 가속기란 애프리케이션 코드를 실행할 때 최적화를 통해 프로그램 실행 속도를 개선하는 미들웨어를 말한다. 특히 무거운 웹 프레임워크를 사용할 때 큰 효과를 볼수 있다. 웹 가속기 도입만으로 웹 서버 자체의 Througput이 3배 이상 향상되는 효과를 볼 수 있다.

 

PHP로 만들어진 애플맄이션을 최적화 하는 가속기는 일반적으로 PHP accelerator라고 부르며 다음과 같은 종류가 있다.

- Zend optimizer

- eAccelerator

- APC

- OPcache

 

 ㅇ 낮은 버전의 프로그래밍 언어 사용 

 

ㅁ 웹 프레임워크 문제

 

ㅇ 웹 프레임워크 자체가 무겁고 느림

 

같은 애플리케이션으로 구축된 시스템이지만, 사용하는 웹 프레임워크에 따라 throughut이 2~10배가까이 변하기 때문에 웹 프레임워크를 사용할 때는 시스템에 맞는지 확인하고 사용해야 한다.

 

또 웹 프레임워크를 변경해야 할 경우 변경 후에 개발에 많은 영향을 미치게 되므로 최초 사용 시 프로토타입으로 부하 테스트를 해보고 벤치 마크를 해보는 것을 추천 한다.(이게 말이 쉽지 가능할까..)

 

ㅇ 프레임워크의 불필요한 기능 사용

 

웹 프레임워크에서 제공하는 기능을 잘 활용하면 보다 안전한 애플리케이션을 빠르게 개발할 수 있고 높은 유지 보수성을 확보할 수 있다. 그러나 기본 설정 상태에서는 불필요한 기능들도 포함되어 있어 전체 시스템의 Throughput을 크게 떨어뜨릴 수 있다.

 

ㅇ 많은 로그를 남기고 있다.

 

웹 프레임워크가 발생시키는 로그 양은 너무 많아 시스템 전체 throughput을 떨어트리는 경우가 있다. 다음과 같은 상태가 발생했을 대 이 상황이 아닌지 확인해 볼 필요가 있다.

 

* top 명령어로 모니터링 했을 때 CPU 전체 사용량은 아주 크지 않지만 sys 사용량이 늘어난다.

 

이 상태는 과도하게 파일 I/O가 발생하는 상황이라고 볼 수 있다.

 

ㅁ 애플리케이션 문제

 

ㅇ 디버그 모드에서 동작

 

디버그 모드에서는 디버그를 위한 거대한 오브젝트를 생성하여 메모리나 CPU 리소스를 더 쓰거나 남아 있는 로그 때문에 대량의 파일 I/O를 발생 시키기 때문에 정확한 부하 테스트 결과를 확인할 수 없게 된다. 또 프로파일러를 도입한 상태에서도 프로파일러 동작은 애플리케이션에 있어서 무시할 수 없는 큰 부하이다.

 

부하테스트를 위해 발생시키는 요청은 서비스 환경의 릴리즈 때와 마찬가지로 디버그 모드를 비활성화한 상태에서 해야만 한다.

 

ㅇ 애플리케이션의 리소스 낭비

 

실제 애플리케이션을 동작시키면서 불필요한 루프와 메모리의 과도한 이용, 비효율적인 오브젝트등은 없는지 확인해야 한다.  필자의 과거 경험에서 볼 때 같은 오브젝트를 호출할 때마다 새롭게 생성되어 전체 처리 단계가 늘어나느 환경을 많이 보았다. 같은 오브젝트라면 같은 요청안에서 재사용되어야 하며 캐시를 사용하여 요청 간에 공유해서 사용하는 방법을 고려해야 한다.

 

이런 프로그램 확인은 프로파일러를 도입하면 쉽게 할 수 있지만, 부하테스트에서의 요청은 프로파일러를 사용하면 안된다. 테스트 도구에서 발생시키는 요청과는 별도로 요청을 발생시켜 그 결과를 프로파일링해야 한다.

 

ㅇ 임의의 파일 I/O 발생

 

CPU 전체 사용량은 높지 않은데 sys 사용률이 높아지는 경우 웹프ㄹ임워크에서 의도치 않게 세션과 로그가 생성되는 것과 마찬가지로 애플리케이션에서도 불필요한 파일 I/O가 발생하는지, 로그가 생성되고 있지 않은지 확인해야 한다.

 

ㅁ 서버 리소스 성능 부족

 

서버 리소스 부족의 주요 원인은 다음과 같다.

 

* CPU 리소스 부족

* 메모리 부족

* 스토리지 성능 부족

 

다른 문제를 전부 해결한 상태라면 CPU 리소스가 100% 가까이 사용될 때 스케일 업이나 스케일 아웃으로 정상적으로 시스템이 확장된 상태임을 볼 수 있다.

 

메모리 부족현상에서 SWAP을 사용하기 시작했거나 CPU 사용률 중에서도 usr 사용률은 비교적 적고 sys 사용률이 많이 늘어난 상태에선 다른 대응 방안이 필요할 때가 있다.

 

온프렘 환경에서 RAID 컨트롤러의 Write Cache 기능 활성화 시 Write I/O Throughput이 증가해야 하지만 반대로 떨어 지는 경우도 있어 사용 방법과 파일 시스템에 따라  특성이 달라진다.

 

최종적으로 서버 리소스 자체 부족에 대한 대응은 서버의 스케일 아웃 또는 스케일 업을 해야 한다. 웹 서버 확장 방법은 스케일 아웃/스케일 업 중 어떤 방법을 써도 되지만, 스케일 아웃에서는 서비스 중이라도 서비스 중지 없이 확장할 수 있어 일반적으로 스케일 아웃을 쓴다.

 

ㅁ 참고표

 

원인 구분 원인 상세 주요 증상 대책
미들웨어 설정문제 HTTP 서버의 불필요한 기능을 사용 중   불필요한 기능은 사용하지 않는다.
HTT 서버 기동 파라미터 설정 부족   MaxClients 설정을 확인하거나 prefork 설정 확인 등
큰 크기의 데이터 사용으로 많은 네트워크 사용 서버에서의 Outbound Throughput이 증가 파일 압축
전송(mod_deflaste)등 검토
CDN 사용 검토
웹 가속기를 미사용 웹 서버 CPU 리소스가 100% 가까이 사용됨 PHP인 경우 OPcache 등의 가속기 이용 검토
낮은 버전의 프로그래밍 언어 사용   언어 버전 업그레이드 검토
웹 프레임워크 문제 웹 프레임워크 자체가 느림   웹 프레임워크 검토
웹 프레임워크의 필요 없는 기능 사용   불필요한 기능 미사용
애플리케이션 문제  디버그 모드에서 동작   디버그 모드 중지
애플리케이션의 리소스 낭비   불필요한 루프 처리를 수정하고 콘텐츠와 오브젝트에 대한 효율적인 캐시 이용 검토
랜덤한 파일 I/O가 발생
로컬 파일 시스템 위에 세션을 사용하고 있는 경우 발생
웹 서버 CPU 리소스중 sys 사용 비율 증가  
서버 리소스 성능 부족 웹 서버 CU 리소스를 100% 가까이 사용 정상적으로 요청이 처리되고 있다면 문제 없음 스케일 업
슼일 아웃