Tomcat+SQL Server에서 돌아가는 CMS 튜닝
개요
CMS를 도입하여 돌리고 있는데 날이갈 수록 점점 느려진다. 로드테스트를 하며 원인을 파악해보자.
시스템 구조
- OS : Windows 2012 R2
- CPU : 16Cores
- Memory : 32GB
- Web Server : Apache httpd 2.4
- WAS : Apache Tomcat 7
계획
목표 : 동접 500을 커버할 수 있는 실헙계획
- 느린 페이지를 하나 잡에서 URL을 땀
- 1에서 딴 URL로 동시 부하 테스트
- 초당 응답 수 확인. TPS 500 이상만족하면 종료
- 잘 안되면 시스템 접속하여 로그/메트릭 확인 후 수정. 2번으로.
부하테스트 및 로그 확인
Locust[1]를 설치하고, 이것 저것 많이 붙어있는 인덱스 페이지에 get을 날려본다.
1) locust설치 후 아래와 같은 스크립트를 짜서,
import urllib3urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)from locust import HttpLocust,TaskSet,task,betweenclass MyTaskSet(TaskSet):@taskdef index(self):self.client.get("", verify=False)class MyLocus(HttpLocust):task_set = MyTaskSetwait_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