핵심 인사이트 (3줄 요약)

  1. 본질: 리틀의 법칙(Little's Law) L = λW는 시스템 내 평균 요청 수(L), 처리율(λ, TPS), 평균 응답 시간(W)의 관계를 나타내며, 세 지표 중 하나를 알면 나머지를 계산할 수 있다.
  2. 가치: 스레드 풀(Thread Pool)과 커넥션 풀(Connection Pool) 크기를 수학적으로 산정할 수 있어 "감(感) 기반" 설정에서 "근거 기반" 설정으로 전환한다.
  3. 판단 포인트: 감리 현장에서 스레드 풀 크기 설정 근거 문서가 없거나, 리틀의 법칙과 크게 괴리된 값이 설정된 경우 재검토를 요구한다.

Ⅰ. 개요 및 필요성

리틀의 법칙(Little's Law)은 1961년 존 리틀(John D.C. Little)이 증명한 큐잉 이론(Queuing Theory)의 기본 정리다. 원래는 대기열 분석에서 유도되었지만, IT 성능 공학에서 스레드 풀·DB 커넥션 풀·메시지 큐 크기 산정에 광범위하게 활용된다.

공공정보화 감리에서 스레드 풀과 커넥션 풀 설정값은 핵심 성능 파라미터다. 잘못된 설정은 서버 자원 낭비(과다 설정) 또는 요청 거부·타임아웃(과소 설정)을 유발한다.

L = λ × W

L (Lambda) : 시스템 내 평균 요청 수 (동시 처리 중인 요청)
λ (Lambda) : 처리율 (TPS, Transactions Per Second)
W (Wait)   : 평균 응답 시간 (초, second)
변수실무 매핑예시 값
L필요 스레드 풀 크기 (활성 스레드 수)50개
λTPS (초당 처리 트랜잭션 수)100 tps
W평균 응답 시간0.5초
┌──────────────┐    ┌──────────────┐    ┌──────────────┐
│ Problem      │──▶│ Core Idea    │──▶│ Expected Gain │
└──────────────┘    └──────────────┘    └──────────────┘
  • 📢 섹션 요약 비유: 리틀의 법칙은 "마트 계산대(시스템)에 항상 몇 명이 줄 서 있는지(L)는 시간당 처리 고객 수(λ)와 1명당 걸리는 시간(W)의 곱"이라는 상식적 수학이다.

Ⅱ. 아키텍처 및 핵심 원리

┌─────────────────────────────────────────────────────────────┐
│  실무 계산 예시                                               │
│                                                             │
│  목표 성능:                                                  │
│  - 목표 TPS (λ): 200 tps                                    │
│  - 평균 응답 시간 (W): 0.3초                                 │
│                                                             │
│  필요 스레드 수 (L):                                         │
│  L = λ × W = 200 × 0.3 = 60개                               │
│                                                             │
│  안전 마진 (20%) 적용:                                       │
│  스레드 풀 설정 = 60 × 1.2 = 72개  →  75개 설정             │
│                                                             │
│  커넥션 풀 산정:                                             │
│  - DB 쿼리 TPS: 150 tps (쿼리 비중 75%)                     │
│  - 평균 DB 응답 시간: 0.1초                                  │
│  L_db = 150 × 0.1 = 15개  →  커넥션 풀 20개 설정            │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│              스레드 풀 설정 시나리오 비교                     │
│                                                             │
│  [과소 설정: 스레드 풀 = 10개]                               │
│                                                             │
│  요청 60개 ──► 활성 스레드 10개 ──► 대기 큐 50개             │
│                    │                                        │
│                    ▼                                        │
│  응답 시간 급증, 타임아웃(Timeout) 발생, 500 오류             │
│                                                             │
│  [과다 설정: 스레드 풀 = 500개]                              │
│                                                             │
│  요청 60개 ──► 활성 스레드 60개 ──► 유휴 스레드 440개        │
│                    │                                        │
│                    ▼                                        │
│  메모리 낭비 (스레드 1개 = 약 1MB 스택)                      │
│  불필요한 컨텍스트 스위칭(Context Switching) 오버헤드         │
│                                                             │
│  [적정 설정: 스레드 풀 = 75개]                               │
│                                                             │
│  요청 60개 ──► 활성 스레드 60개 ──► 여유 스레드 15개         │
│                    │                                        │
│                    ▼                                        │
│  안정적 TPS 유지, 피크 부하 흡수 가능                        │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│              커넥션 풀 최적화 원리                            │
│                                                             │
│  WAS 스레드 ──► 커넥션 풀에서 커넥션 획득                    │
│                                                             │
│  커넥션 풀 부족 시:                                          │
│  스레드가 커넥션 대기 ──► 응답 시간 증가 ──► 스레드 풀 포화  │
│                                                             │
│  권장 공식:                                                  │
│  DB 커넥션 풀 = (WAS 스레드 풀) × (DB 쿼리 비중)            │
│               × (DB 응답 시간 / WAS 응답 시간)              │
│                                                             │
│  HikariCP(히카리CP) 권장:                                    │
│  connections = ((core_count × 2) + effective_spindle_count) │
│                                                             │
│  예: CPU 4코어, SSD 1개 = (4×2)+1 = 9개 (약 10개 설정)      │
└─────────────────────────────────────────────────────────────┘
항목설명포인트
핵심 역할입력·상태·출력을 분리하는 책임 경계구현보다 경계를 먼저 본다.
제어 지점조건, 이벤트, 정책이 만나는 곳병목과 결합이 생기는 곳이다.
검증 포인트테스트·로그·모니터링으로 확인할 지점운영 가능성이 설계 품질을 결정한다.
  • 📢 섹션 요약 비유: 커넥션 풀은 "공유 자동차(카쉐어링)"와 같다. 차가 너무 적으면 대기자가 생기고, 너무 많으면 주차 공간(메모리)이 낭비된다. 리틀의 법칙은 적정 차량 수를 수학적으로 알려준다.

Ⅲ. 비교 및 연결

방법정확도실무 적용성권장 상황
리틀의 법칙 (Little's Law)높음높음목표 TPS·응답 시간 명확 시
부하 테스트 기반 경험치중간높음실제 부하 데이터 존재 시
HikariCP 공식중간중간CPU 바운드 DB 서버
임의 설정 (200, 100 등)낮음낮음근거 없는 관행 설정 ❌
적용 분야L (큐 내 항목 수)λ (처리율)W (처리 시간)
WAS 스레드 풀활성 스레드 수TPS평균 응답 시간
DB 커넥션 풀활성 커넥션 수DB 쿼리 TPS평균 쿼리 시간
메시지 큐큐 적재 메시지 수소비 TPS평균 처리 시간
네트워크 버퍼버퍼 내 패킷 수패킷/초전송 지연 시간
  • 📢 섹션 요약 비유: 리틀의 법칙은 "슈퍼마켓 계산대 수 결정"에서 "공장 생산라인 설계"까지 어디서나 통하는 범용 공식이다. 단지 IT에서는 스레드와 커넥션에 적용할 뿐이다.

Ⅳ. 실무 적용 및 기술사 판단

단계확인 항목기대 결과
1단계성능 목표 TPS 및 응답 시간 확인요건 정의서에 명시
2단계현재 스레드 풀 설정값 확인server.xml 또는 application.yml
3단계리틀의 법칙으로 이론적 적정값 계산L = λ × W
4단계설정값 vs 이론값 비교20% 이내 오차 허용
5단계부하 테스트 결과와 일치 여부 확인APM 스레드 활성 수 모니터링
# Tomcat server.xml
<Executor name="tomcatThreadPool"
          maxThreads="75"       ← 리틀의 법칙 기반 설정
          minSpareThreads="10"/>

# Spring Boot application.yml
server:
  tomcat:
    threads:
      max: 75
      min-spare: 10

# HikariCP (DB 커넥션 풀)
spring:
  datasource:
    hikari:
      maximum-pool-size: 20    ← L_db = λ_db × W_db
      minimum-idle: 5
      connection-timeout: 30000

판단 체크리스트

  1. 위험 시나리오와 점검 범위가 문서로 합의되었는가?
  2. 지표·증적·로그가 재현 가능하게 수집되는가?
  3. 예외 상황과 오탐·미탐 처리 절차가 있는가?
  4. 재시험 또는 후속 조치 기준이 수치로 정의되었는가?
  • 📢 섹션 요약 비유: maxThreads=200으로 설정된 이유를 개발팀이 "기본값이라서요"라고 답한다면 감리 지적 대상이다. 설정 값에는 반드시 산정 근거가 있어야 한다.

Ⅴ. 기대효과 및 결론

리틀의 법칙을 기반으로 스레드 풀과 커넥션 풀을 산정하면 자원 낭비 없이 목표 TPS를 달성하는 최적 설정이 가능하다. 실무에서 스레드 풀 과소 설정으로 인한 타임아웃, 과다 설정으로 인한 GC(Garbage Collection) 압박은 모두 리틀의 법칙 산정 미적용에서 비롯된다. 감리인은 설정값의 산정 근거 문서를 반드시 요구하고, 이론값과의 비교 검증을 수행해야 한다.

확장 방향은 ① Policy as Code, ② Continuous Audit, ③ 인공지능(AI, Artificial Intelligence) 기반 이상 탐지와 결합하는 것이다.

  • 📢 섹션 요약 비유: 리틀의 법칙은 "교통 신호등 초록불 시간을 도로 차량 수와 통과 시간으로 최적화하는 공식"이다. 초록불이 너무 짧으면 정체, 너무 길면 다른 방향이 막힌다.

📌 관련 개념 맵

관계개념설명
상위 개념큐잉 이론 (Queuing Theory)리틀의 법칙의 수학적 기반
상위 개념성능 공학 (Performance Engineering)성능 설계·분석 학문
하위 개념스레드 풀 (Thread Pool)L = λW 적용 대상
하위 개념커넥션 풀 (Connection Pool)DB 접속 자원 관리
연관 개념TPS (Transactions Per Second)λ 값의 실무 측정
연관 개념P95 응답 시간W 값의 실무 측정 기준
연관 개념APM (Application Performance Management)L, λ, W 실시간 측정 도구

📈 관련 키워드 및 발전 흐름도

queue theory → 리틀의 법칙 성능 진단 → capacity planning

👶 어린이를 위한 3줄 비유 설명

  1. 리틀의 법칙은 "놀이공원에서 항상 몇 명이 줄 서 있는지는 1시간에 몇 명 태우는지와 1번 타는 데 걸리는 시간을 곱하면 나온다"는 거야.
  2. 스레드 풀 크기는 "롤러코스터 직원이 몇 명 필요한가"와 같아서, 너무 적으면 손님이 기다리다 포기하고, 너무 많으면 직원만 놀아.
  3. 이 공식을 모르고 설정하는 건 "감으로 직원을 뽑는 것"이고, 리틀의 법칙을 쓰면 "정확한 계산으로 딱 맞는 직원 수를 구하는 것"이야.