절대적인 성능 튜닝 절차는 없다.

📌 성능 튜닝을 위한 기초적인 법칙

1 Core에서 20시간 소요되는 시간 중 1시간은 절대 개선할 수 없다면, 20배 이상의 성능 향상은 불가능하다.
P = 개선 가능한 부분의 비율, S = 개선된 정도
성능개선율=1(1P)+PS 성능 개선율 = \frac{1}{(1-P) + \frac{P}{S}}
ex) P = 1 (개선 가능한 부분 100%), S = 2 (성능 2배 향상)
1(11)+12=1112=2\frac{1}{(1-1) + \frac{1}{2}} = \frac{\frac{1}{1}}{\frac{1}{2}} = 2
ex) P = 0.9 (개선 가능한 부분 90%), S = 2 (성능 2배 향상)
1(10.9)+0.92=10.1+0.45=1.8\frac{1}{(1-0.9) + \frac{0.9}{2}} = \frac{1}{0.1 + 0.45} = 1.8
아래와 같이 성능 개선에는 한계가 생길 수 밖에 없다. 서버를 늘리면 Linear하게 성능이 개선되거나 확장이 가능하다는 얘기는 100% 거짓말이라고 한다. 증가하는 추세가 꺾이는 부분까지 테스트를 하지 않은 것뿐이기 때문이다.

📌 step by step

성능 튜닝의 절대적인 절차는 없다는 것을 명심하자.
1.
원인 파악 : 제대로 원인을 파악하려면 오랜 시간이 소요된다. 첫 단추를 잘꿰야 한다. 첫 단추를 잘꿰야 다시 튜닝하는 작업이 발생하지 않기 때문이다.
2.
목표 설정 : 성능 개선뿐만 아니라, 향후 유지보수까지 모두 고려해서 설정하자.
3.
튜닝 실시 : 프로파일링 툴이나 APM 같은 툴을 사용하는 것이 좋다. 개선이 얼마나 되었는지 JMH나 캘리퍼와 같은 성능 비교 도구를 사용하면 큰 도움이 될 수 있다.
4.
개선율 확인 : 얼마나 개선되었는지 확인하는 단계이다. 만족스럽지 않다면 위 단계로 다시 넘어가서 진행하고, 원인부터 제대로 파악하지 못한다면 원하는 결과를 얻을 수 없을 수 있다.
5.
결과 정리 및 반영 : 정리하는 습관은 매우 중요하다. 무의미한 데이터는 모두 제거하고, 되도록 필요한 사항들만 정리하자.

📌 성능 튜닝 팁

1.
하나만 보지 말자.
서버 장비 : CPU, Network, Dist, Memory 등
서버 OS : OS 커널, OS 설정, 수행중인 프로세스 등
자바 애플리케이션 : 스레드 풀 설정, DB Connection Pool 설정, Cache 설정, GC 설정, Heap 크기 설정, 검증되지 않은 프레임워크의 버그, 개발된 애플리케이션 등
웹 서버 : 프로세스 개수 설정, Connector 설정, 개발된 모듈의 버그 등
네트워크 : 사용자의 네트워크 종류, 사용자의 위치, L4 및 Switch 등 네트워크 장비, 방화벽 등
클라이언트 : 클라이언트 장비의 CPU, Network, Dist, Momory, OS 등의 성능, 클라이언트 애플리케이션, 클라이언트 장비에서 수행 중인 프로세스 등
2.
큰 놈을 없애자.
가장 큰 성능 저하가 발생하는 부분을 찾아 튜닝해야 한다.
부하 테스트 툴이나 간단히 스레드를 만들어서 부하를 주어 성능 측정을 해봐야 한다.
요청 수의 상위 80%에 해당하는 부분들은 측정하고, 문제를 꼭 잡자.
3.
깊게 알아야 한다.
대충 알면 대충 튜닝할 수밖에 없다. 하나라도 전문가가 돼보자.
4.
결과 공유는 필수다.
개요 : 튜닝을 실시한 배경
튜닝 환경 : 튜닝을 실시하고 성능을 측정한 서버, 툴에 대한 상세 내용
튜닝 결과 : 튜닝 전과 후 결과 비교
결론 : 어느 부분을 어떻게 변경하는 것이 가장 큰 효과를 줄지, 튜닝 작업을 진행한 담당자의 의견 등을 포함
5.
그래프는 신중하게 그리자
의미 없는 그래프 30개보다, 하나로 모든 상황을 볼 수 있는 그래프가 좋다.
타이틀은 반드시 추가.
그래프의 라벨은 가능하면 X축 하단에 추가.
산포도를 보여줄 때, 각 점은 작게 표현하자.
Y축
정수 값인 경우 1,000단위에 콤마를 추가하자.
소수까지 내려가는 값일 경우 적어도 3자리는 보여주기.
주 단위를 표시하는 경우 4개 이상 표시되지 않게 하기.
X 축
주 단위는 10개 내외.
주 단위를 선이나 눈금은 상황에 맞게 결정하기.
TOP