3/25/2025

분산 시스템 이해하기



우리 동네에는 꽤 인기 있는 떡볶이&오뎅&튀김 가게가 있다. 인기가 많은 관계로 포장임에도 웨이팅은 기본이다.

그리고 이렇게 긴 대기시간을 가지는 이유는 계산원이 한 명뿐인점도 한몫한다. 매장에 계산원이 더 많았으면 좋았을 텐데, 그러면 빨리 계산할 수 있지 않을까?


아마도 이 글을 읽는 여러분들도 비슷한 경험을 했을 것이다. 이런 일은 너무 자주 일어나서 이런 상황에서 분산 시스템을 도메인 영역에 어떻게 적용할 수 있는지는 잊어버리기도 한다. 왜 대기 시간이 높지? 왜 처리량이 이렇게 낮지? 등은 중요한 질문이다.


다시 원래 이야기로 돌아와서, 성능을 높이기위해서는 한 명의 계산원이 계산을 하는데 걸리는 시간을 정확하게 측정을 해야 한다. 주문을 받고, 카드를 받고, 계산하기까지의 과정에서 걸리는 시간을 측정해야 한다. 그리고 병렬로 이루어지지 않는다. 계산원은 한 번에 한 사람 이상을 서비스 하지 않는다. 시스템의 단일 CPU도 요청이 얼마나 오던간에 한 번에 하나의 작업 단위를 처리한다.


시간을 측정 했으면, 계산원을 조금 더 관찰해야 한다. 계산이 끝나고 요청한 상품을 담고 물건을 전달하기까지 시간이 필요하다. 혹은 손님이 없을때는 손님을 기다리며 쉬기도 한다.


마찬가지로, 클라이언트가 시스템에 요청하는 부분을 보면 네트워크 왕복 시간을 발생시키고, 낮은 동시성에서는 항상 비용을 지불하게 된다. 이런 유휴 상태를 제거하고 처리량을 높이려면, 단순하게 동시성을 높이면 된다. 처리량이 포화 상태가 되고 대기 시간이 증가하는 시점까지 조금씩 증가시키면서 해당 지점에 도달해야 한다. 이는 시스템의 한계를 아는 것을 의미한다. 시스템의 한계를 알았으니 더 낮은 동시성을 처리하도록 조정해야 한다.


시스템의 한계를 알았고, 처리 가능한 만큼만 처리하도록 세팅했다면, 더 많은 계산원을 고용해야 한다. 분산 시스템의 경우에는 측정한 지연 시간내에서 처리량을 확장하기 위해 아래의 공식을 적용해야 한다.


“작업자 수 = 대상 처리량 / 단일 작업자 제한”


우리는 이미 단일 작업자의 성능 한계를 알기 때문에, 필요한 총 작업자 수를 찾으려면 대상 처리량을 정의된 단일 작업자가 처리할 수 있는 양으로 나누기만 하면 된다.


생각해보자. 주문을 처리하는데 걸리는 총 시간은 상품의 수를 한 명의 계산원의 처리하는 속도로 나눈 값에 따라 결정된다. 한 명의 계산원에게 모든 요청을 하는 대신, 계산할 수 있는 다른 계산원에게 병렬로 분배하는 것이 훨씬 더 효율적이지 않을까?


여러 명의 계산원이 고용된 후에도, 때때로 계산원 뒤에 긴 줄을 선 고객이 있는 경우가 있다. 반대로 모든 계산원이 한가하고 당신은 그들 중 누구라도 선택할 수 있는 상황이 생길 수 도 있다. 당신이 주문한 것을 계산하기전, “순대도 추가해주세요.”라고 말할 수 있다. 그러면 계산원은 순대도 결제 항목에 추가하면서, 다른 사람에게 순대를 포장해달라고 요청할 수 있다.


이렇게 되면 몇 가지 문제가 발생한다.


  1. 당신의 계산을 단일 계산원을 통해 하고 있다.

  2. 다른 주문을 다른 사람에게 병렬화 했지만, 당신의 앞에 있는 계산원은 그 상품이 오기까지 기다리며 유휴 상태가 되어 지연이 발생한다.

  3. 이런 추가 주문이 많아질수록 전체 지연은 가장 느린 응답에 의해 결정된다.


즉, 위의 방식으로 코드를 짜면 대기 시간을 발생시키게 된다.


이글을 읽었다면, 이제는 왜 대기 시간이 높은가? 또는 왜 처리량이 이렇게 낮은가?와 같은 질문에 답할 수 있어야 한다. 성능을 평가할때는 작게 시작해야 한다. 이렇게 하면 비용이 최소화되고 각 단계에서 세부적인 제어가 가능하다.


“동시성 = 처리량 x 대기시간”


항상 동시성을 주시하고 불균형을 주의 깊게 살피면서 필요에 따라 완화하거나 방지해야 한다.


Share:

잠깐, 글이 유익했나요?

Donate!

0 Comments:

댓글 쓰기