학습(구)/Java(구)

자바 성능 튜닝 - 서버 세팅

잉아당 2021. 6. 9. 16:34
728x90

성능테스트를 통해서 병목 지점을 미리 파악하는 것이 좋은데 문제가 될만한 세팅 값을 먼저 진단하는 것이 효율적입니다.

- 웹 서버 세팅

- WAS 서버 세팅

- DB 서버 세팅

- 장비 세팅

 

웹 서버 설정

- 웹 서버는 WAS 앞에 두어야 합니다. 정적인 부분은 웹 서버에서 처리해야 합니다. 그렇지 않으면 WAS 에서 웹 서버 역할까지 수행해야 하므로 많은 리소스들이 낭비되게 됩니다.

- 아파치 웹 서버는 MPM을 사용하는데 MPM은 Multi - Processing Module의 약자로 여러 개의 프로세싱 모듈 기반의 서비스를 제공한다는 의미입니다.

- 설정 파일에 ThreadsPerChild는 웹 서버가 사용하는 스레드의 개수를 지정하며 아파치 프로세스 하나당 지정한 수만큼 스레드가 생성됩니다.

- 설정 파일에 MaxRequestsPerChild는 최대 요청 개수를 지정하는 부분으로서 0이면 그 수 제한을 두지 않고 수를 지정하면 해당 값이상의 처리는 하지 않게 됩니다. 가급적 0으로 설정하는것이 좋습니다.

- StartServers : 서버를 띄울 때 프로세스의 개수를 지정하는데 보통 child프로세스의 개수를 이야기함

- MaxClients : 최대 처리 가능한 클라이언트 수를 지정

- MinSpareThreads : 최소 여유 스레드 수를 지정

- MaxSpareThreads : 최대 여유 스레드 수를 지정

- ThreadsPerChild : 프로세스당 스레드 수를 지정

 

GC를 할때는 JVM이 멈추게 되는데 GC를 하는 동안 WAS가 멈추기 때문에 새로운 연결을 할 수 없습니다. Tomcat에서는 AJP Connector라는 웹서버와 WAS 사이의 커넥터에 설정한 backlog라는 값의 영향을 받게 되는데 기본 값으로 100을 가지고 있고 WAS가 응답하지 않을 경우 100개의 요청까지 큐에 담아 둔다는 의미입니다. 100개가 넘을 경우 503에러를 보냅니다. 

=> 해결방안

- 서버 늘리기 

- 서비스 튜닝

- GC 튜닝

- 각종 옵션튜닝

 

웹서버와 웹브라우저가 연결되었을 때 KeepAlive 기능이 켜져 있지 않으면 매번 HTTP 연결을 맺었다 끊었다 하는 작업을 반복합니다.  초기 화면이 간단할 경우 차이는 없지만 복잡한 페이지의 경우 KeepAlive 기능이 켜져 있지 않으면 오래 걸립니다. KeepAlive 기능을 사용할 경우 대기 시간이 짧아지기 때문에 사용자가 느끼는 응답 속도도 빨리지게 됩니다.

KeepAlive-Timeout 설정의 경우 초단위로 KeepAlive 끊기는 시간을 설정하는데 사용자가 많을 경우 짧게 주는 것도 리소스를 효율적으로 사용하는 방버입니다.

상황에 맞게 KeepAlive를 사용하는 것이 좋습니다.

 

DB Connection Pool과 스레드의 개수는 메모리과 관련이 많고 적절히 설정해 주어야 합니다. Connection Pool에서 최소치가 높을 수록 서버 기동하는 시간이 오래 걸리므로 개발 중에는 적절히 설정하고 서비스 운영시 최소치와 최대치를 맞워 주는 것이 좋습니다. 스레드의 개수를 Connection Pool 보다 높게 설정하는데 반대로 Connection Pool의 개수를 높게 설정하면 스레드 개수 만큼만 사용되고 나머지는 사용되지 않기 때문입니다.

또한 스레드는 DB연결 뿐만 아니라 다른 작업에도 사용되기 때문에 여유를 갖고 지정하는 것이 좋습니다.

 

DB Connection Pool 적정 개수 찾기

- 적정 수를 잡았을 때 DB의 CPU의 점유율이 100% 이게 되면 CPU 사용이 많은 쿼리를 찾아 튜닝해야합니다. 

- DB의 CPU 사용량은 50% 이고 WAS의 CPU 사용량은 100%에 도달하게 되면 WAS의 어플리케이션을 튜닝해야고 이미 튜닝된 상태라면 서버의 DB Conncetion Pool의 개수를 약간 여유 있게 지정하는 것이 좋습니다.

 

대기 시간도 성능에 있어서 중요합니다.

대기 시간은 DB Connection Pool이 모두 사용되어 지고 있을 때 기다리는 시간입니다. 너무 길게 설정해도 오래기다려야 하고 너무 짧게 설정해도 문제가 생기게 됩니다. 

 

WAS의 인스턴스 개수를 늘리게 되면 CPU가 처리하는 양이 많아지게 됩니다.  자원의 리소스에 맞춰 인스턴스를 생성하고 성능에 따라 일정 수준만 생성하는것이 좋습니다.

세션의 종료 시간을 설정해 상황에 맞춰 없애주는 것이 좋습니다.