serversim
학습시뮬레이터템플릿가격
…
…
메뉴 열기
학습↗시뮬레이터↗템플릿↗가격↗
내 Documents문서
기초 트랙 목차/7 / 85분

창구가 200개인데 왜 10개만 일할까?

함정 질문요청을 받을 자리를 200개나 열어뒀는데, 왜 처리량은 그만큼 늘지 않을까요?

움직여 보기

0/96 스텝속도도장전화(ms)
0.0초완료0123456×200도장 0/2줄 0
응대 중통화 중금고에 감비어 있음

0.0초 · 줄 0명 · 응대 중 0곳 · 완료 0명 — 아직 아무도 오지 않았습니다

문장 따라가기

1/48

창구가 200개인데 왜 10개만 일할까요?

텍스트 모드에서는 3초마다 다음 문장으로 넘어갑니다.

이렇게 생각해 보세요

창구가 200개인 은행입니다 — 이 장에서 창구는 요청을 받는 자리(스레드)입니다. 위 그림에는 그중 여섯 개만 그렸고, 옆의 ×200 배지가 나머지를 대신합니다. 그런데 서류에 찍을 도장은 두 개뿐입니다.

도장을 쥐지 못한 창구는 손님을 부를 수가 없습니다. 그래서 그림의 여섯 창구 중 네 곳은 도장이 돌아오기를 기다리며 계속 비어 있고, 줄만 길어집니다 — 밖에서 보면 "직원은 많은데 줄은 안 줄어드는" 상태입니다. 그림은 기다리는 손님을 줄에 세워 두지만, 실제 서버에서는 그 요청이 이미 스레드를 하나 붙잡은 채 연결을 기다리며 앉아 있습니다.

위 그림에서 도장을 2에서 6으로 올려 보세요. 창구는 하나도 늘리지 않았는데 줄이 거의 없어집니다. 늘린 것은 창구가 아니라 "동시에 일을 시작할 수 있는 수"입니다.

이번엔 전화를 켜 보세요. 은행원이 수화기를 들고 있는 동안 그 창구는 다음 손님을 받지 못합니다 — 도장이 여섯 개나 있는데도 줄이 다시 자랍니다.

숫자로 뒤집기

실측 · 지금 계산됨

이제 같은 은행을 실제 서버 규모로 재봤습니다 — 그림보다 손님도 도장도 많습니다. 창구 200개, 한 건 처리에 200밀리초, 도장 10개에 손님이 초당 300명씩 옵니다. 실제로 볼일을 마치고 나간 손님은 초당 50.0명뿐이고, 나머지 초당 250명은 줄에 쌓입니다.

그 숫자는 우연이 아닙니다. 도장 하나가 1초에 5명을 보내니 도장 10개면 상한은 초당 50명이고, 위에서 잰 처리량이 바로 그 상한입니다 — 창구가 200개든 2,000개든 이 상한은 그대로입니다. 도장을 50개로 늘리면 상한이 초당 250명, 실측도 250명으로 정확히 5배가 됩니다.

도장을 창구 수만큼(200개) 늘리면 상한은 초당 1,000명이 되고, 이제 손님이 줄에 쌓이지 않습니다 — 초당 300명이 와서 초당 299명이 나갑니다. 이때 창구는 29.9%만 바쁩니다 — 이제 도장은 병목이 아닙니다.

그 상태에서 은행원이 전화 한 통을 560밀리초씩 붙잡으면, 손님 한 명이 창구를 쓰는 시간이 200에서 760밀리초로 늘어납니다. 상한은 초당 263명 — 도장 수는 200개 그대로인데 3.8분의 1이 됐습니다. 도장이 노는 것도 아닙니다: 통화 중인 손님이 도장을 쥔 채 기다리고 있어서 도장 이용률은 99.8%입니다 — 이제 처리량을 정하는 것은 도장이 몇 개냐가 아니라, 도장 하나를 얼마나 오래 붙잡고 있느냐입니다. 자기 일을 0초에 끝낸다 쳐도 창구 200개 ÷ 통화 560밀리초 = 초당 357명이 천장입니다.

이 숫자는 문구에 박아둔 값이 아니라, 이 화면을 그릴 때 시뮬을 돌려 나온 값입니다.

시뮬레이터에서 해보기

  1. 1.'HikariCP 풀 고갈' 프리셋을 기본값으로 열어 보세요 — 요청을 받는 자리(Tomcat threads.max)는 200개인데 DB 연결(HikariCP pool)은 5개입니다. KPI 패널의 Success는 2.4%뿐입니다.
  2. 2.인스펙터에서 HikariCP pool을 50으로 올려도 Success는 그대로 2.4%입니다 — 이번엔 더 뒤(디스크)가 좁은 쪽이기 때문입니다. 좁은 자리를 하나 넓히면 다음 좁은 자리가 보입니다.
  • 프리셋 목록에서 "외부 의존 부분 장애"도 열어 보세요 — 500 RPS × 홀드 0.56초라 동시에 280개가 필요한데 Tomcat 스레드는 200개뿐이고, 성공률이 50.3%로 내려갑니다. 이 장의 전화가 그대로 나타납니다.
  • "Circuit Breaker — cascading 차단"은 그 전화를 빨리 끊습니다. CB를 켜면 내부 API 트래픽 5,077건이 전부 통과하고 p50이 243ms에서 60ms가 되지만, 총 성공률은 60.9%에서 51.7%로 내려갑니다 — 좁은 자리를 지키려고 외부 호출을 포기한 대가입니다.
시뮬레이터에서 열기 →

한 문장으로

동시에 처리할 수 있는 일의 수는 자리 수가 아니라 가장 적은 자원이 정합니다 — 자리를 오래 붙잡는 일(외부 호출)도 그 수를 깎습니다.

진도는 이 브라우저에만 저장됩니다 (계정·기기 간 동기화 없음).

확인 문제

0 / 3 맞음
  1. 1.자리 200개, 도장 10개일 때 처리량을 늘리려면?

  2. 2.도장을 창구 수만큼 늘렸는데도 처리량이 초당 263명에서 멈춘 이유는?

  3. 3.외부 API 응답이 느려졌을 때 우리 서버에서 가장 먼저 마르는 것은?

새로 나온 말

연결 풀
데이터베이스로 가는 통로를 미리 몇 개 만들어 두고 돌려 쓰는 묶음입니다. 비유의 도장이고, 이 수가 동시에 DB를 쓸 수 있는 요청 수를 정합니다.
외부 호출
우리 서버가 다른 서비스(결제사·인증·지도 API)에 요청을 보내고 응답을 기다리는 일입니다. 비유의 전화이고, 기다리는 동안에도 자리를 붙잡고 있습니다.
병목
전체 속도를 정하는 가장 좁은 자리입니다. 하나를 넓히면 그 다음으로 좁은 곳이 병목이 됩니다.

이전 장

서버가 바쁘면 왜 요청이 밀릴까?

다음 장

이벤트루프는 언제 유리하고 언제 불리할까?

serversim

서버가 느려지고 터지는 이유를 배우고, 같은 현상을 직접 시뮬레이션하는 학습 도구.

© 2025-2026 serversim · 아키텍처 시뮬레이션 도구

제품

  • 학습
  • 시뮬레이터
  • 템플릿
  • 가격

자료

  • 문서
  • 벤치마크
  • 블로그

정책

  • 개인정보
  • 약관
  • 환불 정책