Tomcat+SQL Server에서 돌아가는 CMS 튜닝

개요

CMS를 도입하여 돌리고 있는데 날이갈 수록 점점 느려진다. 로드테스트를 하며 원인을 파악해보자.

시스템 구조

  • OS : Windows 2012 R2
  • CPU : 16Cores
  • Memory : 32GB
  • Web Server : Apache httpd 2.4
  • WAS : Apache Tomcat 7

계획

목표 : 동접 500을 커버할 수 있는 실헙계획

  1. 느린 페이지를 하나 잡에서 URL을 땀
  2. 1에서 딴 URL로 동시 부하 테스트
  3. 초당 응답 수 확인. TPS 500 이상만족하면 종료
  4. 잘 안되면 시스템 접속하여 로그/메트릭 확인 후 수정. 2번으로.

부하테스트 및 로그 확인

Locust[1]를 설치하고, 이것 저것 많이 붙어있는 인덱스 페이지에 get을 날려본다.

1) locust설치 후 아래와 같은 스크립트를 짜서,

import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
from locust import HttpLocust,TaskSet,task,between
class MyTaskSet(TaskSet):
@task
def index(self):
self.client.get("", verify=False)
class MyLocus(HttpLocust):
task_set = MyTaskSet
wait_time = between(1,2)

2) 아래와 같이 실행시키고

# locust -f load_to_index.py --port 12345

3) 웹브라우저에서 localhost:12345로 접속해서 테스르를 날린다. 인풋은 심플하게

  • Number of total users to simulate : 동시 접속자 수
  • Hatch rate : 초당 증가할 유저 수
  • Host : 부하를 걸 URL 주의 : 처음 테스트할 때 도메인으로 요청을 날렸는데 리디렉션 응답만 받아서 테스트가 망함 잘 되는 줄 알았는데 비즈니스 로직이나 스태틱 파일 하나 다운로드 받지 않고 302만 받았다. URL에 신쳥쓰자.

4) RPS가 100밖에 안나온다 뭐지? 유저랑 스폰을 조금씩 더 바꿔서 몇번 더 돌려봐도 100~110선에서 안 움직인다. 이전에 다른 시스템을 튜닝할 때 250선에서 멈췄던 적이 있었는데 그때는 httpd의 동시 접속 설정 기본 값(mpm-prefork-serverlimit)이 256이어서 멈췄던 기억이 있는데, 이번에도 비슷한 이슈일까?

로그 확인

톰캣로그

톰캣로그를 뒤졌더니 다음과 같은 에러가 보인다.

ERROR [Canonical.Name.Of.My.Java.Class] ERROR:
org.apache.catalina.connector.ClientAbortException: java.net.SocketException: Software caused connection abort: socket write error
.
.
.

스택오버플로우[2]의 글을 읽어보면

참조

[1] https://bcho.tistory.com/1369 [2] https://stackoverflow.com/questions/2126607/official-reasons-for-software-caused-connection-abort-socket-write-error [3] https://docs.microsoft.com/en-us/previous-versions/ms832256(v=msdn.10)?redirectedfrom=MSDN