[Tiketeer] 락별 성능 비교 분석 (2)

Chaeyun·2024년 5월 7일
0

Web개발

목록 보기
4/8

개요

앞서 [Tiketeer] 락별 성능 비교 분석 (1) 에서 대부분의 티켓 구매 시나리오에서 낙관적 락이 성능이 더 뛰어난 것을 확인했습니다.

의문점

그런데 티켓 구매는 여러개의 공유 자원에 여러 명이 동시에 접근하는 상황입니다.
따라서 랜덤 쿼리를 통해 경합율을 낮추는 것이 가능하여 낙관적 락의 효율성을 높일 수 있었습니다.

그렇다면 하나의 공유 자원(또는 아주 적은 공유 자원)에 여러 명이 동시에 접근하면 낙관적 락의 성능이 어떻게 될지 궁금증이 들었습니다.

따라서 추가 시나리오를 배정하여 성능을 분석해보았습니다.

테스트 시나리오

이번 테스트 시나리오는 다음과 같이 설정하였습니다.
(낙관적 락, 분산 락에 대한 시나리오는 이전 글과 동일하게 설정함)

  • vus: [1, 2, 5]
  • tickets: [1, 2]

vus(virtual user)는 동시에 자원을 이용하려고 접근하는 사용자(요청)의 수이고, tickets은 사용자가 접근하려고 하는 공유 자원의 개수입니다.

테스트 결과 분석

아래는 (vus, tickets) 케이스 별로 duration이 짧은 순으로 3개를 추출한 표입니다.

  • (1, 1), (1, 2), (2, 2) 케이스에서는 낙관적 락이 가장 duration이 짧은 케이스입니다.
  • (2, 1), (5, 2) 케이스에서는 비관적 락이 가장 duration이 짧은 케이스입니다.
  • (5, 1) 케이스에서는 분산 락이 가장 duration이 짧은 케이스입니다.

이번에는 (lock, vus, tickets) 별로 duration의 평균값을 계산해 비교해보았습니다.

주목할 점

낙관적 락의 duration 평균값이 (1, 1) -> (2, 1) -> (5, 1) 순으로 최소 2배 이상씩 증가하는 것을 확인할 수 있습니다.

그리고 (1, 1), (1, 2)를 제외한 다른 케이스에서는 낙관적 락의 평균 성능이 다른 락에 비해 떨어지는 것으로 나타났습니다.

즉 공유 자원이 여러 개 있는 경우에는 랜덤 쿼리를 통해 경합율을 낮출 수 있었으나, 그렇지 못한 상황에서는 경합율을 낮추지 못해 성능이 떨어지는 것으로 판단하였습니다.

추가 분석

위의 분석 결과에 따르면,
앞선 성능 분석 글에서 테스트한 (50, 10), (30, 10)과 같은 경우도 경합율이 많이 높아 낙관적 락의 성능이 더 낮아야 할 것으로 보입니다.

하지만 실제로는 낙관적 락의 성능이 가장 우수한 것으로 드러났습니다.
이는 낙관적 락의 경합이 거의 발생하지 않았다는 뜻입니다.

어떻게 낙관적 락의 경합이 거의 발생하지 않았을까요?

DB Connection Pool Size

저희는 그 원인을 DB Connection pool size로 보았습니다.
현재 connection pool size는 10으로 설정되어있어 한번에 DB에 접근 가능한 요청이 10개 이하입니다.

따라서 실제 경합율이 추측보다 떨어진 것으로 예상하고, connection pool size를 아래와 같이 수정하여 다시 테스트를 진행했습니다.

재 테스트 결과

connection pool size를 최소 30, 최대 50개로 늘려 다시 테스트를 진행했을 때
낙관적 락의 duration 평균값은 다음과 같았습니다.

connection pool size가 10일 때의 결과와 비교해봅시다.

(30, 10) 시나리오의 낙관적 락 duration 평균값은 154.31 -> 343.34,
(50, 10) 시나리오의 낙관적 락 duration 평균값은 226.83 -> 464.02
최소 2배 이상씩 증가한 것을 볼 수 있습니다.

또한, connection pool size를 늘린 후에는 비관적 락이 낙관적 락보다 효율적인 것을 확인할 수 있었습니다.

결론

하나의 공유 자원에 대한 경합율이 낮을 때는 낙관적 락이 다른 락에 비해 효과적입니다.

하나의 공유 자원에 대한 경합율은 접근할 수 있는 공유 자원의 선택지가 다양한 경우 랜덤 선택을 통해 낮출 수 있습니다.

하지만 접근할 수 있는 공유 자원의 선택지가 적거나 공유 자원의 수보다 접근하려는 요청의 수가 훨씬 많을 때는 경합율이 높아집니다.

따라서 이런 경우에는 비관적 락이 더 좋은 방안일 수 있습니다.

분산 락은 일반적으로 낙관적 락과 비관적 락에 비해 성능이 떨어지는 편이지만 분산 DB를 사용하는 경우 좋은 선택지가 될 수 있습니다.

0개의 댓글