Thundering Herd 란?
2026. 4. 23. 11:12

👉Thundering Herd(우르르 몰려드는 소떼) 문제는 컴퓨터 과학 및 시스템 엔지니어링에서 발생하는 고전적인 성능 병목 현상이다.

말 그대로 수많은 프로세스나 스레드가 어떤 이벤트(예: 락 해제, 서비스 복구, 캐시 만료 등)를 기다리다가, 이벤트가 발생하는 순간 동시에 깨어나 하나의 리소스를 차지하기 위해 격렬하게 경쟁하는 상황을 의미한다.

 

 

 1. 주요 발생 시나리오

Thundering Herd 문제는 인프라와 애플리케이션 아키텍처 전반에 걸쳐 다양한 형태로 나타난다.

  • 캐시 스탬피드 (Cache Stampede / Cache Miss Storm): 가장 흔하게 접할 수 있는 시나리오이다. 트래픽이 매우 높은 특정 데이터(예: 메인 화면의 공지사항)의 캐시 TTL(Time-To-Live)이 만료되었다고 가정하면, 그 순간 수천 개의 요청이 동시에 들어오면, 모든 요청이 '캐시 미스(Cache Miss)'를 겪고 동시에 원본 데이터베이스(DB)로 쿼리를 날려 DB가 과부하로 다운될 수 있다.
  • 프로세스/스레드 웨이크업 (Process Wake-up): 전통적인 운영체제 수준의 문제이다. 여러 개의 워커 프로세스가 하나의 소켓을 감시(accept())하고 있을 때, 새로운 연결이 들어오면 대기 중이던 모든 프로세스가 동시에 깨어나며, 하지만 연결을 가져가는 것은 단 하나의 프로세스뿐이다. 나머지는 다시 수면 상태로 돌아가는데, 이 과정에서 불필요한 컨텍스트 스위칭과 CPU 리소스 낭비가 발생한다.
  • 서버 재시작 및 Retry 폭주 (Microservices / API): 특정 마이크로서비스나 DB가 일시적인 장애로 다운되었다가 복구되는 순간, 타임아웃을 겪고 대기하던 수많은 클라이언트들이 **동시에 재시도(Retry)**를 요청하면서 갓 복구된 서버를 다시 다운시키는 현상이다.

2. 시스템에 미치는 영향

이 문제가 발생하면 시스템은 리소스를 유용한 작업이 아닌 '경쟁 상태를 처리하는 데' 모두 소모하게 됩니다.

  • CPU 스파이크(Spike): 수많은 프로세스가 동시에 깨어나며 컨텍스트 스위칭 비용이 급증하여 CPU 사용률이 100%를 찍습니다.
  • 메모리 및 네트워크 병목: 동시에 많은 커넥션이 생성되고 데이터를 요청하면서 메모리가 고갈되거나 네트워크 대역폭이 포화 상태가 됩니다.
  • 연쇄 장애 (Cascading Failure): 타임아웃이 발생하고, 재시도가 반복되면서 하나의 작은 지연이 전체 시스템의 장애로 번지게 됩니다.

3. 해결 및 완화 전략

Thundering Herd 현상을 방지하기 위해서는 '분산'과 '통제'가 핵심입니다.

A. Jitter (지터) 및 Exponential Backoff 도입

클라이언트가 재시도를 할 때 똑같은 주기로 요청하지 않도록, 재시도 간격에 무작위성(Random Jitter)을 부여하는 방식입니다.

  • 적용 예: 서비스 장애 복구 시, 클라이언트 A는 1.1초 후, 클라이언트 B는 2.3초 후, 클라이언트 C는 1.5초 후에 재시도하도록 분산시켜 트래픽 충격을 완화합니다.

B. 분산 락 (Distributed Lock) / Mutex 사용

캐시가 만료되었을 때, 캐시를 갱신할 수 있는 권한(Lock)을 단 하나의 요청(스레드)에게만 부여합니다.

  • 적용 예: 캐시 미스가 발생하면 첫 번째 요청이 락을 획득하여 DB에서 데이터를 조회하고 캐시를 갱신합니다. 락을 얻지 못한 나머지 대기 요청들은 잠시 대기하다가 갱신된 캐시 데이터를 읽어가거나, 시스템 설정에 따라 과거의 데이터(Stale Data)를 반환받습니다.

C. Request Coalescing (요청 병합)

동일한 데이터에 대한 여러 요청이 들어왔을 때, 이를 개별적으로 처리하지 않고 하나의 백엔드 요청으로 병합하는 방법입니다.

  • 적용 예: Nginx의 proxy_cache_lock 지시어나 API Gateway의 쿼리 병합 기능을 사용하면, 100개의 동일한 캐시 미스 요청이 들어와도 백엔드로는 단 1개의 요청만 전달됩니다.

D. Stale-While-Revalidate 패턴

캐시 만료 시간을 두 가지로 관리하는 방법입니다.

  • 캐시가 만료되었더라도 즉시 삭제하지 않고, 클라이언트에게는 일단 약간 오래된(Stale) 데이터를 먼저 빠르게 반환합니다.
  • 그와 동시에 백그라운드에서는 비동기적으로 단일 스레드가 DB를 조회하여 최신 데이터로 캐시를 조용히 갱신(Revalidate)합니다.

E. OS/인프라 레벨의 최적화

현대의 커널 및 웹 서버(예: Nginx)에서는 이 문제를 방지하기 위해 여러 워커가 동시에 깨어나지 않도록 EPOLLEXCLUSIVE 플래그를 사용하거나, SO_REUSEPORT 소켓 옵션을 통해 커널 단위에서 트래픽을 분산시키는 기술을 기본적으로 적용하고 있습니다.

 

'기초기술&토픽' 카테고리의 다른 글

C-LAB / B-LAB  (0) 2026.02.05
스캐폴딩(Scaffolding)이란 무엇인가??  (0) 2026.01.13
CRONTAB 과 배치(Batch,SpringBatch)  (0) 2025.10.16
소켓통신 이란?  (0) 2025.10.16
SSL / TSL 프로토콜  (0) 2025.10.16