웹 기반의 시스템에서 성능에 영향을 줄만한 세팅은 크게 웹 서버, WAS 서버, DB 서버, 장비 세팅으로, 시스템에 가장 적절한 설정값은 반드시 성능 테스트를 통해서 찾아내야 한다.
아파치 웹 서버 설정
- 웹 서버를 WAS 서버 앞에 두지 않으면 정적인 리소스를 처리하느라 WAS 서버의 스레드를 점유하게 된다.
- 따라서, 반드시 상용 웹 서버나 아파치 웹 서버를 WAS 앞 단에 두고 운영해야 한다.
httpd.conf
- 아파치 웹 서버는 여러 개의 프로세싱 모듈 기반의 서비스를 제공한다. (MPM)
- 아파치 웹 서버의 설정을 바구는 방법은, 설치 폴더 하단의 conf 디렉터리에 있는 httpd.conf 파일을 수정하는 것
ThreadsPerChild 250
MaxRequestsPerChild 0
- ThreadsPerChild는 웹 서버가 사용하는 스레드의 개수를 지정한다.
- 위와 같이 지정하면, 아파치 프로세스 하나당 250개의 스레드가 만들어진다.
- 만약 이 값이 작게 지정되어 있다면, 서버가 더 많은 사용자의 요청을 처리할 수 있도록 값을 늘려주어야 한다.
- MaxRequestsPerChild는 최대 요청 개수를 지정한다.
- 0이면 그 수에 제한을 두지 않겠다는 의미
- 기본값인 0으로 두고 사용하는게 좋다.
httpd-mpm.conf
- httpd.conf 파일에서 `Include conf/extra/httpd-mpm.conf`의 주석을 해제하면 세밀한 스레드 설정 정보를 httpd-mpm.conf를 통해서 지정할 수 있다.
- 스레드 방식을 사용하기 위해서는 worker 부분을 수정해 주어야 한다.
- StartServers: 서버를 띄울 때 프로세스의 개수를 지정한다. 보통 child 프로세스의 개수를 이야기한다.
- MaxClients: 최대 처리 가능한 클라이언트의 수를 지정한다.
- MinSpareThreads: 최소 여유 스레드 수를 지정한다.
- MaxSpareThreads: 최대 여유 스레드 수를 지정한다.
- ThreadsPerChild: 프로세스당 스레드 수를 지정한다.
- MaxRequestsPreChild: 최대 요청 개수를 지정한다.
여기에서는 프로세스 수가 2개이고, 프로세스당 스레드 수가 25이므로, 기본적으로 50개의 요청을 처리할 수 있다.
또한 최대 여유 스레드가 100개 이므로, 최대 사용 가능한 클라이언트 수는 200이 된다.
그 이상의 요청은 서버 리소스에 여유가 있어도 처리를 안한다.
Keep Alive
- 아파치 웹 서버의 경우, httpd.conf 파일에 keepAlive On 설정이 없으면 해당 설정을 한 줄 추가한다.
- 웹 서버와 웹 브라우저가 연결되었을 때 KeepAlive 기능이 켜져 있지 않으면, 매번 HTTP 연결을 맺었다 끊었다 하는 작업을 반복한다.
- 초기화면에서 많은 이미지와 CSS, 자바스크립트 등의 파일을 받아야 하는 사이트에서 초기 화면을 띄우는데 시간이 오래 걸린다.
- KeepAlive 기능이 켜져 있으면 두 개 정도의 연결을 열어서 끊지 않고, 연결을 계속 재사용한다.
- 연결을 위한 대기시간이 짧아지기 때문에 사용자가 느끼는 응답 속도도 빨라진다.
- 또한, KeepAlive 설정을 할때 KeepAliveTimeout 설정도 같이 해주어야 한다.
- 초 단위로 KeepAlive가 끊기는 시간을 설정하기 위한 부분으로, 마지막 연결이 끝난 이후에 다음 연결이 될 때까지 얼마나 기다릴지를 지정한다.
- 만약 사용자가 너무 많아 접속이 잘 안될 경우, 이 설정을 5초 정도로 짧게 주는 것도 서버의 리소스를 보다 효율적으로 사용할 수 있는 방법이다.
※ CDN
- 사용자의 접근이 많은 사이트에서는 이미지나 CSS와 같이 정적인 파일들을 일반적인 웹 서버에서 처리하지 않고, CDN이라고 하는 서비스를 사용한다.
- 별도의 URL에서 해당 컨텐츠들을 내려받도록 설정하고, 동적인 컨텐츠들은 WAS에서 처리하도록 하면 Web-WAS 서버의 부담도 줄어들게 된다.
DB 커넥션 풀 및 스레드 개수 설정
- DB 커넥션 풀과 스레드 개수는 메모리와 관련있으며, 많이 사용할수록 메모리를 많이 점유하게 된다.
- 메모리를 위해서 개수를 적게 지정하면, 서버에서는 많은 요청을 처리하지 못하고 대기할 수 밖에 없다.
- 대부분의 WAS에서는 DB 커넥션 풀의 개수를 최소치, 증가치, 최대치 등으로 자세하게 지정할 수 있다.
- 최소치는 서버가 기동될 때 연결을 수행하는 개수로, 개발자용 PC에서는 이 값은 최소한으로 지정하는 것이 좋다.
- 최소 개수가 많으면 많을수록 서버를 기동하는 시간이 오래 소요되므로, 디버그를 위해서 여러 번 재기동할 때는 좋지 않다.
- But, 운영 중에는 최소 및 최대값을 동일하게 하는 것이 좋다.
- 사용자 수가 갑자기 증가하면 DB 커넥션 풀의 개수도 증가되어야 하고, 증가할 때 대기시간이 발생할 확률이 크기 때문
- 만약 DB 서버의 리소스가 부족하면 최소값을 적게 해놓는 것도 방법이 될 수 있다.
- 대부분의 WAS에서 두 설정 값의 기본 개수는 10~20개 정도로, 기본값으로 서비스를 오픈하면 서버가 원하는 요청량을 처리하지 못하게 된다.
- DB 커넥션 풀은 보통 40~50개로 지정하며, 스레드 개수는 이보다 10개 정도 더 지정한다.
대기시간
- DB 커넥션 풀의 개수를 넘어 섰을 때 애플리케이션이 기다리는 시간
- MyBatis에서는 poolTimeToWait이라는 값으로 이 대기시간을 결정하며, 기본은 20초
- DB 연결을 못하고 기다리는 사용자들이 적어도 20초는 대기해야 한다는 뜻
- 그렇다고 대기시간을 아주 짧게 주는 경우, DB 연결을 하려고 대기하는 순간 Full GC가 발생하면 그 순간에 대기하고 있는 모든 스레드는 DB와 연결을 못했다고 Timeout을 발생시킨다.
- 결론적으로 DB와 연동하는 프레임워크를 설정할 때는 Pool의 개수, Wait과 관련된 값이 들어간 값, Timeout 관련 설정들을 시스템의 상황에 맞게 설정해야 한다.
Session Timeout 시간 설정
- 이 설정은 WAS에 종속적인 설정이 아닌 web.xml 파일에서 설정하며, 서블릿 스펙에 정의된 표준 설정값이다.
<session-timeout>30</session-timeout>
- 세션 종료 시간 설장값은 분 단위로, 설정되어 있는 분만큼 요청이 없으면 세션을 메모리에서 제거한다.
- 이 설정을 하지 않은 상태에서 WAS에서 따로 설정한 바가 없거나 세션 객체의 invalidate() 메서드가 수행되지 않으면 세션은 삭제되지 않는다.
'Java > Java Tuning' 카테고리의 다른 글
reflection (0) | 2022.03.28 |
---|---|
Garbage Collector (GC) (0) | 2022.01.31 |
JVM (Java Virtual Machine) (0) | 2022.01.31 |