도구스개발

두 곳 중 덜 바쁜 쪽(최대 부하) 계산기

무작위로 한 대를 고르면 최대 부하가 평균보다 √(2λ·ln m)만큼 무거운데, 두 대를 뽑아 덜 바쁜 쪽에 보내면 ln ln m / ln d로 지수적으로 줄어듭니다. 실제로 공을 던져 보는 시뮬레이션과 나란히 놓아 그 차이를 확인할 수 있습니다.

1이면 그냥 무작위로 한 대를 고르는 것입니다.

후보를 2개 볼 때 가장 바쁜 서버

102.8개

평균 100개보다 2.79개 많을 뿐입니다. 무작위로 한 대만 고르면 37.2개가 초과되므로 13.3배 차이입니다.

평균 부하 n/m100개
후보 1개일 때 초과분 √(2λ·ln m)37.17개
후보 2개일 때 초과분2.788개 (ln ln m / ln d)
줄어든 배수13.33배
초과분이 평균의 몇 %2.788%
시뮬레이션 최대 부하 (후보 1개)134.3개
시뮬레이션 최대 부하 (후보 2개)102.2개
시뮬레이션 최소 부하95.6개

시뮬레이션은 실제로 공을 던져 본 것이며 12판의 평균입니다. 화면에서 돌리는 것이라 요청 수를 10만 개까지만 써서 돌립니다 — 어림식 쪽은 넣은 값 그대로 입니다. 씨앗을 고정해 같은 입력이면 같은 값이 나옵니다.

한 판의 서버별 부하 (앞 40대)

후보를 둘 이상 보면 막대가 거의 평평해집니다. 무작위성은 그대로인데 비교 하나가 들어갔을 뿐입니다.

후보 수를 늘려 가며

후보 d초과분최대 부하하나 더 봐서 준 몫
137.169137.17
22.788102.7934.381
31.759101.761.029
41.394101.390.365
51.201101.20.193
61.079101.080.122

1 → 2의 이득이 압도적이고 그 뒤로는 급격히 줄어듭니다. 초과분이 ln d에 반비례하기 때문입니다 — 2에서 4로 늘려야 겨우 절반이 되는데, 그러려면 부하를 읽는 왕복이 두 번 더 늘어납니다. 「둘이면 충분하다」는 말은 여기서 나옵니다.

요청이 늘어나면 (서버 1000대 고정)

요청 수평균 부하후보 1개 초과분후보 2개 초과분
1,00013.72.788
10,0001011.82.788
100,00010037.22.788
1,000,0001,000117.52.788
10,000,00010,000371.72.788

오른쪽 열이 전혀 변하지 않는 것이 이 결과의 전부입니다. 후보를 둘 이상 보면 초과분에 요청 수 n이 아예 들어가지 않습니다. 요청을 만 배로 늘려도 가장 바쁜 서버는 평균보다 여전히 같은 개수만큼 무겁습니다. 왼쪽 열은 √n에 비례해 계속 늘어납니다.

두 배가 아니라 로그가 하나 더 씌워집니다. 무작위로 한 대를 고르면 초과분이 √(2·(n/m)·ln m)인데, 두 대를 뽑아 덜 바쁜 쪽에 보내면 ln ln m / ln d가 됩니다. 「비교 한 번을 더 하니 조금 나아졌다」가 아니라 식의 꼴 자체가 바뀝니다. Azar–Broder–Karlin–Upfal이 1994년에 보인 결과입니다.
초과분에 요청 수가 들어가지 않습니다. 후보를 하나만 보면 요청이 늘수록 초과분도 √n으로 늘어나는데, 둘 이상 보면 n이 아예 식에서 사라집니다. 요청을 백만 번 보내든 십억 번 보내든 가장 바쁜 서버는 평균보다 상수만큼 무거울 뿐입니다. 규모가 커질수록 이 방식의 이득이 커진다는 뜻입니다.
셋, 넷으로 늘려도 별로입니다. 초과분이 ln d에 반비례하므로 2에서 3으로 가면 0.63배, 4로 가면 0.5배가 됩니다. 반면 후보를 하나 더 볼 때마다 부하를 읽는 왕복이 하나씩 늘어납니다. 1 → 2는 지수적 개선이고 2 → 3은 상수 개선이라, 실무에서는 둘로 끝냅니다.
무작위로 뿌린 결과가 출발점입니다. 후보를 하나만 보는 경우가 곧 「해시로 고르게 뿌리기」이며, 그때의 불균형은 샤드 부하 불균형 계산기가 다루는 그 계산입니다. 이 도구는 거기에 비교 하나를 더했을 때 무엇이 달라지는지를 봅니다.
실제로는 이론만큼 안 나옵니다. 부하 정보가 오래되었거나(방금 보낸 요청이 아직 반영되지 않음) 읽는 비용이 있기 때문입니다. 특히 여러 로드밸런서가 같은 부하 정보를 보고 동시에 「가장 한가한 서버」로 몰리면 오히려 쏠림이 생깁니다 — 가장 한가한 한 대를 고르는 것보다 둘 중 덜 바쁜 쪽을 고르는 편이 나은 이유가 이것입니다.
요청마다 무게가 같다고 봤습니다. 어떤 요청이 다른 것보다 훨씬 무거우면 개수를 세는 것만으로는 부족합니다. 그때는 개수 대신 실제 부하 (처리 중인 연결 수·응답시간)를 재서 비교해야 하며, 그것이 최소연결(least connections) 방식입니다. 후보 둘을 뽑아 그중 연결이 적은 쪽으로 보내는 방식이 실제로 널리 쓰입니다.

사용 방법

  1. 1요청 수와 서버 수를 넣습니다.
  2. 2후보를 몇 개 볼지(d) 정합니다. 1이면 그냥 무작위로 한 대를 고르는 것입니다.
  3. 3어림식이 준 초과분과 실제로 던져 본 시뮬레이션 결과를 대조합니다.
  4. 4후보 수를 늘려 가는 표에서 1 → 2의 이득이 압도적인 것을 확인합니다.
  5. 5요청을 늘리는 표에서 후보 2개 쪽 초과분이 전혀 변하지 않는 것을 봅니다.

자주 묻는 질문

지수적으로 좋아집니다. 무작위로 한 대를 고르면 최대 부하가 평균보다 √(2·(n/m)·ln m)만큼 무거운데, 두 대를 뽑아 덜 바쁜 쪽에 보내면 그 초과분이 ln ln m / ln d가 됩니다. 서버 1000대에 요청 10만 건이면 37개에서 2.8개로 줄어듭니다.

초과분에서 요청 수 n이 아예 사라지기 때문입니다. 후보를 하나만 보면 요청이 늘수록 초과분이 √n으로 늘어나는데, 둘 이상 보면 요청을 만 배로 늘려도 초과분이 그대로입니다. 규모가 커질수록 이득이 커지는 셈입니다.

거의 나아지지 않습니다. 초과분이 ln d에 반비례하므로 2에서 3으로 가면 0.63배, 4로 가면 0.5배입니다. 반면 후보를 하나 더 볼 때마다 부하를 읽는 왕복이 하나씩 늘어납니다. 1 → 2는 지수적 개선이고 2 → 3은 상수 개선이라 실무에서는 둘로 끝냅니다.

오히려 나쁠 수 있습니다. 여러 로드밸런서가 같은 부하 정보를 보고 동시에 「가장 한가한 서버」로 몰리면 그 서버가 순식간에 밀립니다. 후보 둘 중 덜 바쁜 쪽을 고르면 몰림이 흩어져 그런 진동이 생기지 않습니다.

그쪽이 이 도구의 출발점입니다. 「해시로 고르게 뿌렸을 때」의 불균형이 곧 후보를 하나만 보는 경우이며, 이 도구는 거기에 비교 하나를 더했을 때 무엇이 달라지는지를 봅니다.

이론만큼은 아닙니다. 부하 정보가 오래되었거나(방금 보낸 요청이 아직 반영되지 않음) 읽는 비용이 있기 때문입니다. 그래도 무작위로 한 곳만 고르는 것보다 나은 것은 분명해서, 후보 둘 중 연결이 적은 쪽으로 보내는 방식이 널리 쓰입니다.

개수를 세는 것만으로는 부족합니다. 그때는 처리 중인 연결 수나 응답시간처럼 실제 부하를 재서 비교해야 하며, 그것이 최소연결 방식입니다. 이 도구는 요청마다 무게가 같다고 보고 계산합니다.

전송되지 않습니다. 계산과 시뮬레이션 모두 브라우저 안에서 이루어지고 넣은 값은 이 기기에만 남습니다.

알아두면 좋은 점

  • 어림식은 상수항을 뺀 값입니다. 서버가 적거나 서버당 요청이 아주 적으면 상수항이 지배해 시뮬레이션과 벌어집니다.
  • 요청마다 무게가 같다고 봅니다. 무게가 크게 다르면 개수가 아니라 실제 부하를 비교해야 합니다.
  • 부하 정보가 즉시 정확히 읽힌다고 봅니다. 실제로는 정보가 오래되어 이론만큼 나오지 않습니다.
  • 화면의 시뮬레이션은 요청 수를 10만 개까지만 써서 돌립니다. 어림식 쪽은 넣은 값 그대로입니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 2일 · 결과는 참고용 추정치입니다.