Web Server/Apache Tomcat

Tomcat > 성능 튜닝 > 기본

Krevis 2023. 12. 1. 11:31

테스트 대상 애플리케이션의 정보

  • TPS: 10
  • 평균 응답 속도: 1초 이하
  • DB 접속 등 외부 통신 없음

튜닝 가능 설정 값

maxConnections

기본값: 8192

 

톰캣을 만든 사람들이 기본값을 아무 값이나 정했을리는 없을 것이다. 하나의 톰캣 인스턴스가 요청 8192 건은 충분히 받을수 있다는 말이 아닐까? (받을 수 있다는 거지 처리할 수 있다는 건 아닐 수 있다.)

acceptCount

기본값: 100

 

조대협님의 블로그에는 10 내외의 값을 권하고 있다.

maxThreads

기본값: 200

 

하나의 톰캣 인스턴스가 요청 8192 건은 충분히 처리할 수 있다는 말이 아닐까? (해당 요청의 작업 속도에 따라 다를 것이다.)

튜닝 목적

기본 값 사용 시 얼마나 많은 동시 요청을 처리할 수 있을지에 대한 테스트를 해보고 최적의 값을 찾는다.

부하 도구는 Apache JMeter를 사용하였다.

테스트 1. maxConnections 8192, acceptCount: 100, maxThreads: 200, acceptCount: 100, Concurrent request 3

3개 요청 동시 처리 가능

테스트 2. maxConnections 8192, acceptCount: 100, maxThreads: 200, acceptCount: 100, Concurrent request 10

10개 요청 동시 처리 가능

테스트 3. maxConnections 8192, acceptCount: 100, maxThreads: 200, acceptCount: 100, Concurrent request 20

20개 요청 동시 처리 가능

 

테스트 4. maxConnections 8192, acceptCount: 100, maxThreads: 200, acceptCount: 100, Concurrent request 100

100개 요청 동시 처리 가능

 

테스트 5. maxConnections 8192, acceptCount: 100, maxThreads: 200, acceptCount: 100, Concurrent request 101

100개 요청 동시 처리 가능. 1개 실패

 

동시 요청 수가 acceptCount의 값보다 커지게 되면 실패가 생기게 된다.

대상 애플리케이션이 TPS 10을 만족하기만 하면 된다면, 동일 초에 100개의 요청이 들어오더라도 소화해낼 수 있음을 의미한다.

 

여기까지는 acceptCount의 기본값을 사용하였고, 조대협님의 의견처럼 acceptCount를 10 정도의 적은 수로 설정했을 때의 테스트를 해보겠다.

테스트 6. maxConnections 8192, acceptCount: 10, maxThreads: 200, Concurrent request 10

10개 요청 동시 처리 가능

테스트 7. maxConnections 8192, acceptCount: 10, maxThreads: 200, Concurrent request 11

11개 요청을 동시 처리 못하기 시작한다. (하지만 성공할 때도 있다.)

테스트 8. maxConnections 8192, acceptCount: 10, maxThreads: 200, Concurrent request 11 x 2

보다시피 11개 요청을 처리할 때도, 못할 때도 있다.

고민 1. 그러면 acceptCount를 TPS에 맞게 늘리는 것이 좋을까? 아니면 10 정도로 짧게 주는 것이 좋을까?

경험이 풍부하지 못한 내가 단정지을 수는 없지만, 마침내 이런 결론을 내리게 되었다. 틀리다면 댓글로 가르침을 주셨으면 한다.

 

만약 해당 애플리케이션이 요청에 대해서 실패를 허용하지 않는 게 중요하고 재(요청)시도 불가하다면, acceptCount를 TPS만큼 올려주어 동시 병렬 요청을 처리할 수 있게 한다.

 

위의 경우가 아니고 여러 곳에서 요청을 받을 수 있고 영향도가 널리 퍼질 수 있는 애플리케이션이라면, acceptCount를 10 정도로 짧게 주어 요청 실패를 클라이언트에게 빠르게 응답하게 한다. 각 클라이언트는 요청 실패에 대해서 재시도 요청 처리하여 원하는 바를 이루면 될 것이다.

 

TPS가 기본 acceptCount 100보다 작다면, 그냥 기본값을 쓰도록 내버려두는 것도 괜찮을 것 같다.

테스트 코드

참고