도구스개발

샤드 부하 불균형(최대 샤드) 계산기

키를 해시로 고르게 뿌려도 가장 무거운 샤드는 평균보다 무겁습니다. n/m + √(2·(n/m)·ln m)라는 어림으로 최대 부하를 구하고, 실제로 뿌려 보는 시뮬레이션과 대조해 용량을 얼마나 여유 있게 잡아야 하는지 보여 줍니다.

가장 무거운 샤드의 예상 부하

15,986개

평균은 15,625개인데 가장 무거운 샤드는 그보다 2.3% 무거울 것으로 추정됩니다. 용량은 평균이 아니라 이 값으로 잡아야 합니다.

평균 부하 n/m15,625개
어림식n/m + √(2·(n/m)·ln m)
예상 최대 부하15,985.5개
초과분+360.5개 (평균의 2.31%)
포아송 꼬리로 본 문턱15,895개
시뮬레이션 최대 부하 (200판 평균)15,909.3개
시뮬레이션 95분위 최대16,016개
시뮬레이션 최소 부하15,336.6개

문턱은 「이 값을 넘는 샤드의 기대 개수가 1 아래로 떨어지는 첫 정수」입니다. 어림식과 서로 다른 길로 구한 값이라 정확히 같지는 않지만 가까이 나와야 맞습니다. 시뮬레이션은 키가 너무 많아 샤드마다 정규근사로 뽑은 것이고 씨앗을 고정해 같은 입력이면 같은 값이 나옵니다.

한 판의 샤드별 부하 (앞 40개)

해시가 완벽해도 이만큼 들쭉날쭉합니다. 막대 높이의 차이는 해시가 나빠서가 아니라 유한한 개수를 무작위로 나누면 원래 생기는 것입니다.

샤드를 늘리면 어떻게 되나

샤드평균 부하예상 최대상대 불균형
2500,000500,832.6+0.2%
4250,000250,832.6+0.3%
8125,000125,721+0.6%
1662,50063,088.7+0.9%
3231,25031,715.4+1.5%
6415,62515,985.5+2.3%
1287,812.58,087.8+3.5%
2563,906.34,114.4+5.3%
5121,953.12,109.2+8%
1024976.61,092.9+11.9%

평균은 계속 줄지만 상대 불균형은 계속 커집니다. 잘게 쪼갤수록 샤드마다 더 큰 여유를 둬야 한다는 뜻이며, 무한정 쪼개는 것이 답이 아닌 이유입니다.

어림식은 「어딘가 하나라도 넘을 기대 개수 = 1」에서 나옵니다. 샤드 하나의 부하는 평균 λ = n/m, 분산 λ인 분포에 가깝고 그 꼬리가 exp(−x²/2λ)입니다. 샤드가 m개이니 λ+x를 넘는 샤드의 기대 개수는 m·exp(−x²/2λ)이고, 이것이 1이 되는 x가 √(2λ·ln m)입니다. 최대 부하가 n/m + √(2·(n/m)·ln m)쯤이라는 말은 여기서 나옵니다.
샤드를 늘리면 상대 불균형은 커집니다. 초과분 √(2λ ln m)을 평균 λ로 나누면 √(2 ln m / λ)입니다. 샤드를 늘리면 λ = n/m이 줄어드니 이 비가 커집니다. 평균은 줄어도 「평균 대비 얼마나 튀어나오는가」는 오히려 나빠지므로, 잘게 쪼갤수록 용량 여유를 더 크게 잡아야 합니다.
용량은 평균이 아니라 최대 샤드로 잡습니다. 모든 샤드가 같은 크기의 기계에 올라간다면 가장 무거운 샤드가 들어가야 전체가 돕니다. 평균으로 잡으면 절반 가까운 샤드가 넘칩니다. 게다가 샤드가 늘어날수록 「어딘가 하나는 많이 튄다」가 확실해지므로, 규모가 커질수록 이 여유가 더 중요해집니다.
키가 치우쳐 있으면 해시로도 못 고칩니다. 여기서는 키마다 무게가 같다고 봤습니다. 특정 키 하나가 전체 트래픽의 10%를 먹는다면 (지프 분포·핫키) 그 키가 어느 샤드로 가든 그 샤드가 10%를 집니다. 해시는 키를 고르게 흩뿌릴 뿐 키 자체의 치우침을 없애지 못하므로, 그때 필요한 것은 샤드를 늘리는 것이 아니라 키를 쪼개는 것(핫키 분할·앞에 캐시 두기)입니다.
「어느 샤드로 보낼까」는 다른 문제입니다. 이 도구는 이미 고르게 뿌려졌다고 보고 그때의 불균형만 봅니다. 샤드를 더하거나 뺄 때 얼마나 옮겨야 하는가는 일관성 해싱이나 랑데부 해싱이 다루는 주제이며, 그쪽 계산기를 따로 보세요.
샤드당 키가 몇 개뿐이면 식이 달라집니다. n ≈ m처럼 성긴 영역에서는 정규근사가 무너지고 최대 부하가 ln m / ln ln m 규모가 됩니다. 샤드 1000개에 키 1000개를 뿌리면 평균은 1인데 가장 무거운 곳에는 5~6개가 들어가는 식이라, 상대 불균형이 수백 %가 됩니다. 이 도구는 λ가 20 미만이면 그쪽 어림으로 갈아탑니다.

사용 방법

  1. 1키 개수와 샤드 개수를 넣습니다.
  2. 2가장 무거운 샤드의 예상 부하와 평균 대비 초과 비율을 확인합니다.
  3. 3시뮬레이션 결과가 어림식과 비슷하게 나오는지 대조합니다.
  4. 4막대그림에서 완벽한 해시로도 부하가 얼마나 들쭉날쭉한지 봅니다.
  5. 5아래 표에서 샤드를 늘릴 때 상대 불균형이 오히려 커지는 것을 확인합니다.

자주 묻는 질문

유한한 개수를 무작위로 나누면 원래 생기는 흔들림 때문입니다. 동전을 아무리 잘 던져도 앞면이 정확히 절반이 나오지 않는 것과 같습니다. 샤드 하나의 부하는 이항분포 B(n, 1/m)이고 표준편차가 √(n/m)쯤이라, 샤드가 많을수록 그 가운데 가장 큰 값이 평균에서 더 멀리 떨어집니다.

샤드당 키가 넉넉하면 n/m + √(2·(n/m)·ln m)쯤입니다. 「λ+x를 넘는 샤드의 기대 개수 m·exp(−x²/2λ)가 1이 되는 x」에서 나온 값입니다. 키 100만 개를 64개 샤드에 뿌리면 평균 15,625개에 최대는 16,000개 남짓으로 약 2.3% 더 무겁습니다.

반대입니다. 평균 부하는 줄지만 상대 불균형은 커집니다. 초과분을 평균으로 나누면 √(2 ln m / λ)인데 샤드를 늘리면 λ = n/m이 줄어 이 비가 커지기 때문입니다. 잘게 쪼갤수록 샤드마다 더 큰 여유를 둬야 합니다.

안 됩니다. 모든 샤드가 같은 크기의 기계에 올라간다면 가장 무거운 샤드가 들어가야 전체가 돕니다. 평균으로 잡으면 절반 가까운 샤드가 넘치며, 규모가 커질수록 「어딘가 하나는 많이 튄다」가 확실해집니다.

해시로는 못 고칩니다. 특정 키 하나가 전체 트래픽의 10%를 먹는다면 그 키가 어느 샤드로 가든 그 샤드가 10%를 집니다. 해시는 키를 고르게 흩뿌릴 뿐 키 자체의 치우침을 없애지 못하므로, 그때는 샤드를 늘리는 대신 키를 쪼개거나 앞에 캐시를 둬야 합니다.

식이 달라집니다. n ≈ m처럼 성긴 영역에서는 정규근사가 무너지고 최대 부하가 ln m / ln ln m 규모가 됩니다. 샤드 1000개에 키 1000개를 뿌리면 평균은 1인데 가장 무거운 곳에는 5~6개가 들어가 상대 불균형이 수백 %가 됩니다.

다루는 문제가 다릅니다. 이 도구는 이미 고르게 뿌려졌다고 보고 그때의 부하 불균형만 봅니다. 「어느 샤드로 보낼까」와 「샤드를 더하거나 뺄 때 얼마나 옮겨야 하는가」는 일관성 해싱·랑데부 해싱이 다루는 주제입니다.

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

알아두면 좋은 점

  • 키마다 무게가 같다고 봅니다. 실제 부하가 키마다 다르면(핫키·지프 분포) 이 계산보다 훨씬 심하게 치우칩니다.
  • 해시가 균등하다고 봅니다. 해시 함수가 나쁘거나 키에 구조가 있으면 별개의 문제입니다.
  • 어림식은 정확한 기댓값이 아니라 「대략 어디쯤인가」입니다. 실제 값이 궁금하면 시뮬레이션 쪽을 보세요.
  • 키가 아주 많으면 시뮬레이션이 정규근사로 넘어갑니다. 합이 정확히 키 개수가 되지는 않지만 최대 부하의 크기를 보는 데는 충분합니다.

함께 보면 좋은 도구

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