본문 바로가기

프로젝트/고민

낙관적 락을 이용한 성능 개선 with JMeter

문제상황

성능 테스트를 진행하던 도중 재고의 증가 감소 로직이 비관적 락으로 구현해도 되는지 고민을 하게 되었다. 동시에 여러 사용자가 같은 상품을 주문하거나 취소할 가능성은 굉장히 적다고 생각이 들어 이를 낙관적 락으로 교체하는게 낫다는 판단이 들었다.

 

성능은 개발에 있어서 정말 중요한 부분이다.

 

고메즈(Gomez)에 따르면, 사용자의 40%가 3초 동안 기다리게 되면 사이트를 이탈하는 것으로 나타났다. 월마트(Walmart)는 페이지 속도를 100ms까지 개선하면 수익이 1% 증가한다는 사실을 발견했다. 

 

Walmart pagespeed-slide

Walmart proves the obvious, devknob wonders why people don't understand why page speed matters. This has been true and known to be true since the beginning of …

www.slideshare.net

 

준비사항

먼저 성능 테스트는 JMeter를 통해 하였다.

 

artillery, nGrinder 등 여러 성능테스트의 도구중 내가 JMeter를 사용한 이유는 다음과 같다.

 

1. 오픈소스: JMeter는 오픈소스 프로젝트로서, 무료로 사용할 수 있다. 또한, 커뮤니티의 지원을 받으며, 다양한 플러그인을 제공하여 다양한 기능을 확장할 수 있다.

2. 사용이 쉽고 유연한 UI: JMeter는 사용자 친화적인 UI를 제공한다. 사용자는 UI에서 빠르게 테스트 계획을 구성할 수 있으며, 다양한 구성 요소를 쉽게 추가/수정/삭제할 수 있다.

이 밖에도 JMeter의 장점은 여러가지가 있지만 나는 위에 적은 장점으로 인해 해당 툴을 사용하였다. 

 

사용법은 다음의 웹사이트에 친절하게 설명되어 있으므로 보고 참고하도록 하자

https://jmeter.apache.org/usermanual/index.html

 

Apache JMeter - User's Manual

 

jmeter.apache.org

 

다음은 고민에 대한 결과를 구현하는 과정이다.

 

이전 결과

먼저 기존의 재고 변경시 성능을 확인해보도록 하자.

 

콘솔창의 쿼리에 for update라며 조회시 락이 걸린 것을 확인할 수 있다.

다음은 JMeter로 1초당 1번씩 20번 테스트를 한 결과이다.

 

 

최소 24ms가 걸리고 최대 90ms가 걸리는 것을 확인할 수 있다. 

 

개선 후

다음은 낙관적 락으로 코드를 수정한 결과이다.

 

이전과는 다르게 콘솔창에 for update라는 락이 걸리지 않은 것을 확인할 수 있다.

다음은 JMeter로 1초당 1번씩 20번 테스트 한 결과이다.

무려 성능이 최소 시간은 2ms, 최대 시간은 40ms 감소한 것을 확인할 수 있다. 최악의 경우 성능이 80% 증가 했다.

 

 

느낀점

트랜잭션 충돌이 자주 발생하지 않을 경우 낙관적 락을 사용할 때 성능이 더 좋다는 것을 알고 있었다. 하지만 성능테스트 도구를 통해 이를 직접 눈으로 검증하니 감회가 새롭게 느껴졌으며 이를 활용 해 성능 개선이 필요한 부분에 대해 검증해볼 생각이다.