제곱근 인력배치(square root staffing) 법칙은 얼랑-C 대기행렬에서 목표 대기 시간을 지키는 데 필요한 여유 인력을 부하의 제곱근에 비례하는 값(β·√R)으로 정하는 원칙이다. 이 원칙 덕분에 통화량이 4배로 몰려도 추가로 필요한 여유 인력은 2배면 충분하다.
"상담원이 모두 통화 중"인 순간의 반직관적 셈법

은행이나 통신사 콜센터에 전화를 걸면, 유난히 "상담원이 모두 통화 중"이라는 안내음만 반복되는 시간대가 있다. 통화가 평소의 4배로 몰리는 이런 피크에도, 대기 시간을 똑같이 지키는 데 추가로 필요한 여유 인력은 4배가 아니라 그 제곱근인 2배면 된다.
직관과 정면으로 어긋난다. 손님이 4배로 밀려들면 계산대도 4배로 늘려야 줄 길이가 그대로일 것 같다. 그런데 대기행렬 이론은 정반대를 말한다. 늘려야 하는 건 부하 전체가 아니라, 부하 위에 얹는 여유뿐이다. 그리고 그 여유는 부하의 제곱근만큼만 늘리면 충분하다. 이 글은 그 반직관이 왜 성립하는지를, 콜센터라는 익숙한 무대에서 식 하나까지 끝까지 따라가 본다.
필요한 상담원 수를 구하는 첫 번째 셈: 부하 R + 여유
먼저 "부하"가 무엇인지부터 정하자. 1분에 걸려오는 통화 수를 도착률 $\lambda$, 통화 한 건을 처리하는 평균 시간을 $h$라 하면, 시스템에 걸리는 부하는 둘의 곱 $R = \lambda \times h$다. 단위는 얼랑(Erlang)이라 부른다. 뜻은 단순하다 — 지금 이 순간 통화 중인 상담원이 평균 몇 명인가. 1분에 28통이 들어오고 한 통에 2분이 걸린다면 부하는 56얼랑, 언제나 평균 56명이 통화에 붙어 있는 셈이다.
여기서 첫 번째 규칙이 나온다. 배치하는 상담원 수 $s$는 부하 $R$보다 반드시 커야 한다. 평균 56명이 통화 중인데 딱 56명만 앉혀 두면, 통화량이 조금만 출렁여도 대기열이 끝없이 쌓인다. 그래서 $s > R$은 타협이 아니라 시스템이 무너지지 않기 위한 최소 조건이다. 진짜 물어야 할 건 그 위에 있다. 부하를 넘겨 얹는 여유, 그러니까 $s – R$을 얼마로 잡아야 대기 시간이 견딜 만해지는가.
여유 없이 배치하면: 얼랑-C 대기확률의 폭주
전화를 건 사람이 곧바로 연결되지 못하고 대기음을 듣게 될 확률에는 이름이 붙어 있다. 얼랑-C(Erlang-C) 공식이다. 이 공식에 들어가는 부하 $a$는 앞 절에서 정의한 부하 $R = \lambda \times h$와 같은 양으로, 얼랑-C 문헌의 표기를 따라 기호만 $a$로 바꿔 쓴 것이다. 상담원 $s$명, 부하 $a$얼랑일 때 걸려온 통화가 대기해야 할 확률을 이렇게 쓴다.
식 1의 생김새는 복잡하지만, 읽는 법은 한 가지만 알면 된다. 분모와 분자에 똑같이 들어 있는 $s/(s-a)$ 항이다. 여유 $s – a$가 0으로 다가갈수록 이 항은 무한대로 튄다. 여유가 얇아지면 대기확률이 급격히 치솟고, $s = a$인 순간엔 대기열이 발산해 버린다는 뜻이다. 여유 없이 딱 맞춰 배치하는 건 확률적으로 반드시 무너지는 배치다. 그렇다면 이 폭주를 막아 줄 여유는 얼마나 두툼해야 할까.
안전 여유가 √R로 충분한 이유 — 제곱근 인력배치와 Halfin-Whitt 레짐
핵심 직관은 대수의 법칙에 있다. 상담원이 한 명뿐이면 그 사람이 통화 중인지 아닌지에 시스템 전체가 휘둘린다. 여럿이면 사정이 다르다. 누군가 바쁠 때 누군가는 한가하고, 그 흔들림들이 서로 다른 방향으로 어긋나며 상쇄된다. 그림 1처럼 제각각인 파동이 겹쳐질수록 합의 상대적 변동은 잦아든다. 시스템이 커질수록 "운 나쁘게 모두가 동시에 바쁠" 확률이 줄어드는 것이다.
변동이 부하의 제곱근 규모로 자라니, 그 변동을 덮을 여유도 제곱근 규모면 충분하다. 이 사실을 식으로 정리한 것이 제곱근 인력배치이고, 대기행렬 이론에서는 Halfin-Whitt 레짐이라 부른다. 목표를 지키는 데 필요한 상담원 수 $N^{*}$는 부하에 제곱근 규모의 여유를 얹은 값으로 근사된다.
식 2에서 $\beta$는 서비스 품질을 정하는 1 안팎의 상수다. 목표 대기 시간을 빡빡하게 잡을수록 $\beta$를 키운다. 정작 중요한 건 여유 항이 $R$이 아니라 $\sqrt{R}$에 붙어 있다는 사실이다. 부하가 4배가 되면 $\sqrt{R}$은 2배가 되고, 그래서 여유도 2배면 된다. 서론의 "통화 4배, 여유 2배"가 바로 이 제곱근 한 글자에서 나온다.
이 곡선을 눈으로 확인해 보자. 부하를 $R = 56$으로 고정하고 상담원 수 $s$를 늘려가면, 얼랑-C 대기확률은 그림 2처럼 가파르게 떨어진다. $s$가 $R$에 바싹 붙은 왼쪽 끝에서는 확률이 1에 가깝다가, 여유를 조금만 얹어도 급격히 내려앉는다.
곡선 위에서 딱 한 점, $s = 64$를 골라 정확히 계산하면 문턱의 뜻이 분명해진다. 아래 코드는 그 한 점의 과잉용량과 대기 시간을 얼랑-C로 직접 구한다.
import math
def erlang_c(s, a):
# a=오퍼드 로드(얼랑), s=상담원 수, 반드시 s>a
summ, term = 1.0, 1.0 # k=0 항: a^0/0! = 1
for k in range(1, s):
term *= a / k # a^k / k!
summ += term
term_s = term * a / s # a^s / s!
top = term_s * s / (s - a) # 얼랑-C 분자
return top / (summ + top)
s, a, h = 64, 56, 120 # 상담원 64, 부하 56얼랑, 평균 통화 120초
pw = erlang_c(s, a)
over = 100 * (1 - a / s)
Wq = pw * h / (s - a) # 평균 대기 시간(초)
print(f"과잉용량 = {over:.1f}%")
print(f"안전 여유 = {s - a}명 (= √{s} = {math.isqrt(s)})")
print(f"대기확률(C) = {pw:.3f}")
print(f"평균 대기시간 = {Wq:.2f}초")과잉용량 = 12.5%
안전 여유 = 8명 (= √64 = 8)
대기확률(C) = 0.215
평균 대기시간 = 3.23초56얼랑짜리 부하에 여유 8명을 얹은 64명이면, 대기확률은 0.215로 눌리고 평균 대기 시간은 3.23초에 그친다. 여기서 눈여겨볼 숫자는 여유 8이 정확히 $\sqrt{64}$라는 점이다. 이 8이 이 글 전체의 뼈대다.
규모가 커질수록 1인당 여유는 준다 — 3단 스케일링 실측
제곱근이 붙는다는 건 규모의 경제가 생긴다는 말과 같다. 여유는 부하가 아니라 부하의 제곱근으로 자라니, 시스템이 커질수록 부하 대비 여유의 비율은 줄어든다. 세 단계를 나란히 놓으면 규칙이 또렷해진다. 상담원 수가 4배씩 커질 때마다 상대적 과잉용량이 정확히 절반으로 접힌다.
$s = 4$(부하 2)일 때 여유는 2명, 과잉용량은 50%다. 상담원을 4배로 키운 $s = 16$(부하 12)에서 여유는 4명, 과잉용량은 25%로 반이 된다. 다시 4배인 $s = 64$(부하 56)에서는 여유 8명에 과잉용량 12.5%다. 그림 3의 세 막대가 절반씩 낮아지는 이유가 여기 있다. 여유는 2·4·8로 곱절씩 늘지만 부하는 그보다 훨씬 빠르게 커지니, 한 명이 짊어지는 여유는 오히려 얇아진다. 큰 콜센터일수록 상담원 한 명이 더 효율적으로 일하는 셈이다.
그렇다고 이득이 무한하진 않다 — 배증은 결국 배증 인력으로 수렴
여기서 멈추면 지나치게 장밋빛이다. "부하가 커질수록 1인당 여유가 준다"를 "부하가 아무리 커져도 인력은 조금만 늘리면 된다"로 읽어 버리기 쉽다. 정직하게 병기하자. 줄어드는 건 여유의 비율이지, 필요한 인력 $s$의 절대량이 아니다. 부하가 배로 늘 때 $s$가 얼마나 늘어야 하는지 역산 공식으로 따라가 보면, 처음엔 이득이 크다가 갈수록 그 이득이 얇아진다.
import math
def staff(a, c=1.0):
# 역산 스태핑: 과잉용량(%)·√s = 100c 를 만족하는 s
return ((c + math.sqrt(c * c + 4 * a)) / 2) ** 2
prev = None
print(" 부하 a | 필요 인력 s | 배증비(s/직전)")
for a in [2, 4, 8, 16, 32, 64]:
s = staff(a)
ratio = f"{s / prev:.2f}" if prev else " - "
print(f" {a:3d} | {s:6.2f} | {ratio}")
prev = s 부하 a | 필요 인력 s | 배증비(s/직전)
2 | 4.00 | -
4 | 6.56 | 1.64
8 | 11.37 | 1.73
16 | 20.53 | 1.81
32 | 38.18 | 1.86
64 | 72.52 | 1.90부하가 2에서 4로 배가 될 때 인력은 1.64배만 늘리면 된다. 확실히 배증보다 덜 든다. 그런데 배증비 열을 아래로 훑어보라. 1.64에서 1.73, 1.81, 1.86, 1.90으로 계속 2에 다가간다. 부하가 아주 커지면 부하를 배로 늘릴 때 인력도 거의 배로 늘려야 한다는 뜻이다. 규모의 경제는 진짜지만 무한하지 않다 — 제곱근이 주는 할인은 실재하되, 절대 인력은 결국 부하를 따라 배증으로 수렴한다.
콜센터를 넘어: 응급실 병상, 서버 풀, 그리고 근사식이 깨지는 지점
같은 셈은 콜센터 밖에서도 그대로 통한다. 밀려드는 환자를 받아야 하는 응급실 병상, 쏟아지는 요청을 처리하는 서버·스레드 풀 모두 "도착률 × 처리시간 = 부하"라는 같은 골격의 대기행렬이다. 병상 수, 워커 수, 커넥션 풀 크기를 정하는 문제가 곧 상담원 수를 정하는 문제다.
오토스케일러의 버퍼를 부하에 정비례해 잡고 있다면 과다 프로비저닝일 가능성이 높다. 필요한 여유는 부하가 아니라 √부하 규모다. 스레드 풀·커넥션 풀·워커 풀 사이징에도 얼랑-C 계산이 그대로 적용되니, 피크 부하 $R$을 추정했다면 $R + \beta\sqrt{R}$을 첫 후보 크기로 잡고 정확한 공식으로 검증하면 된다.
실무에서 인력을 확정하는 절차는 근사식 하나로 끝나지 않는다. 근사는 후보를 빠르게 좁히는 도구이고, 마지막 판단은 정확한 얼랑-C로 내린다.
- 도착률 $\lambda$와 평균 처리시간 $h$를 측정해 부하 $R = \lambda \times h$를 구한다.
- $R + \beta\sqrt{R}$로 후보 인력 $s$를 잡고, 그 $s$로 얼랑-C 대기확률을 정확히 다시 계산한다.
- 목표 대기 시간·목표 대기확률과 비교해 $s$를 한 칸씩 조정하며 확정한다.
다만 이 규칙을 만능 공식으로 믿으면 곤란하다. 근사식은 시스템이 충분히 클 때만 잘 맞는다.
제곱근 인력배치는 근사식이라 몇몇 조건에서 어긋난다. 부하 $R$이 한 자릿수인 소규모 시스템에서는 오차가 커진다. 처리 시간이 지수분포와 크게 다르거나(비지수 처리시간), 대기하던 고객이 끊고 재통화하는 포기·재시도가 잦으면 얼랑-C의 가정 자체가 무너진다. 이럴 땐 근사식 대신 시뮬레이션이나 확장된 대기행렬 모형으로 검증해야 한다.
콜센터의 상담원, 응급실의 병상, 서버 풀의 워커 — 도착과 처리로 이뤄진 대기 시스템이라면 어디든, 피크에 대비할 여유는 부하 전체가 아니라 부하의 제곱근만큼만 준비하면 충분하다. 부하가 4배로 몰려도 여유는 2배면 되는 이유가, 바로 그 제곱근 한 글자에 담겨 있다.
더 읽기
- Halfin, S. & Whitt, W. (1981). "Heavy-Traffic Limits for Queues with Many Exponential Servers". Operations Research 29(3), 567–588.
- Gans, N., Koole, G. & Mandelbaum, A. (2003). "Telephone Call Centers: Tutorial, Review, and Research Prospects". Manufacturing & Service Operations Management 5(2), 79–141.
- Square root staffing rule — Call Center Mathematics