Infra/Performance

병목현상

baek-dev 2025. 3. 22. 14:40

병목현상(Bottleneck)과 해결법

 

1. 병목현상(Bottleneck)이란?

 

병목현상이란 전체 시스템이나 애플리케이션의 성능을 제한하거나 느리게 만드는 특정 지점이나 구간을 말함. 즉, 마치 병의 좁은 목 부분이 전체 흐름을 느리게 만들 듯이, 한정된 리소스나 비효율적인 코드로 인해 시스템 전체 성능이 떨어지는 현상임.

 

병목현상이 발생하면 시스템의 다른 부분이 아무리 빨라도, 결국 가장 느린 구간의 속도로 전체 시스템 성능이 제한됨.

 


2. 병목현상이 발생하는 원인과 대표적 사례

 

병목현상은 일반적으로 다음과 같은 원인에 의해 발생함.

 

(1) CPU 병목

 

CPU가 과도한 연산으로 인해 성능이 제한되는 현상임.

무거운 연산이 과도하게 집중될 때

싱글 스레드 환경에서의 CPU 집중 작업

 

(2) 메모리 병목

 

메모리 사용량이 너무 많거나 메모리가 부족하여 자주 Garbage Collection(GC)이 일어나면서 성능이 저하되는 현상임.

메모리 누수(memory leak)

비효율적인 객체 생성 및 제거

GC 성능 문제

 

(3) 디스크 병목(I/O 병목)

 

디스크 읽기/쓰기가 자주 발생하거나 속도가 느려 전체 성능을 저하시키는 현상임.

데이터베이스의 잦은 읽기/쓰기 연산

비효율적인 파일 입출력 작업

데이터의 잘못된 인덱스 설정

 

(4) 네트워크 병목

 

네트워크의 대역폭 부족, 많은 요청 수, 또는 긴 지연시간(Latency)으로 인해 성능이 저하됨.

많은 동시 접속자로 인한 부하

너무 큰 데이터 전송

비효율적인 네트워크 호출 방식(잦은 API 호출)

 


3. 병목현상을 확인하는 방법 (진단 방법)

 

병목현상을 해결하려면 우선 어디서 병목이 발생하는지 정확히 진단해야 함.

 

다음 방법을 통해 병목 지점을 진단할 수 있음.

 

(1) 시스템 모니터링 도구 활용

Grafana, Prometheus, New Relic, Datadog 등 APM 도구 활용

CPU, 메모리, 디스크 사용률을 실시간으로 확인 가능

 

(2) JVM 프로파일링 도구 사용 (Java 애플리케이션 기준)

VisualVM, JProfiler, YourKit 같은 프로파일링 도구로 메모리 및 CPU 병목 지점 찾기 가능

GC 로그 분석을 통해 메모리 병목 지점 확인 가능

 

(3) 데이터베이스 성능 분석

MySQL의 EXPLAIN 명령어를 이용하여 쿼리 병목 확인 가능

Slow Query 로그 분석으로 느린 쿼리 파악 가능

 

(4) 로드 테스트를 통한 병목 탐지

Apache JMeter, Gatling 등 부하 테스트 도구로 병목 지점 탐지

부하 테스트를 통해 실제 병목 지점을 객관적으로 파악 가능

 


4. 병목현상 해결법 (유형별 대응 방법)

 

병목 유형별로 다음과 같은 해결법이 있음.

 

(1) CPU 병목 해결 방법

연산 최적화: 불필요한 반복 및 연산 제거

멀티스레드 프로그래밍 도입으로 CPU 자원을 효율적으로 활용

필요할 경우 CPU 용량 증가(수직적 확장)

 

(2) 메모리 병목 해결 방법

객체 재사용 및 객체 생성 최소화

JVM 설정 튜닝(Xmx, Xms, UseG1GC 등)을 통해 GC 성능 최적화

메모리 누수 여부 확인 후 해결

 

(3) 디스크 병목 해결 방법

데이터베이스 인덱스 최적화

쿼리 튜닝을 통한 디스크 접근 최소화

SSD 같은 빠른 스토리지 사용

데이터 캐싱을 통해 디스크 접근 빈도 감소

 

(4) 네트워크 병목 해결 방법

데이터 압축 및 전송량 최적화

CDN(Content Delivery Network)을 통해 리소스를 가까운 서버에서 제공

로드 밸런싱(Load Balancing)으로 요청 분산

HTTP 요청 및 응답 최적화(헤더 최소화, keep-alive 등)

 


5. 병목현상 해결 시 주의사항

 

병목현상 해결 과정에서 다음 사항을 유의하면 좋음.

한 번에 많은 부분을 바꾸지 않고, 작은 부분부터 점진적으로 개선함.

성능 측정 → 개선 → 다시 측정의 사이클을 반복하여 객관적인 데이터를 기반으로 최적화 진행함.

코드의 가독성과 유지보수성을 지나치게 떨어뜨리지 않도록 균형을 유지함.

특정 리소스를 무작정 증설하기보다는 근본 원인을 찾아 먼저 해결하는 것이 좋음.

 


6. 병목현상 진단 및 해결 예시 (실무적 접근법)

 

예를 들어, 웹 애플리케이션이 느릴 때 해결 방법은 다음과 같음.

 

(1) 로드 테스트 도구(JMeter 등)로 부하 테스트 실행

시스템의 최대 처리량과 응답속도를 파악함.

 

(2) 병목이 확인되면 시스템 모니터링으로 문제 확인

CPU 사용률이 90% 이상이면 CPU 병목 의심

메모리 사용량이 급증하고 GC가 빈번히 발생하면 메모리 병목 의심

Slow Query 로그가 쌓이고 있다면 디스크(DB) 병목 의심

 

(3) 프로파일링 도구 및 쿼리 분석 도구를 통해 세부 문제 파악

CPU 및 메모리 사용량 상세 분석, 쿼리 분석으로 정확한 원인을 찾음

 

(4) 병목 지점을 최적화하고 다시 테스트하여 성능 향상 여부 확인

지속적으로 성능을 측정하며 최적화를 반복함

 


정리하면:

병목현상은 시스템 성능을 제한하는 특정 지점을 말함.

CPU, 메모리, 디스크, 네트워크 병목 등이 대표적임.

진단과 모니터링 도구를 이용하여 정확히 병목 지점을 파악함.

병목 지점에 따라 적절한 최적화 방법을 적용하고 다시 성능을 검증하는 과정이 중요함.

 

 

 

 

출처 : ChatGPT

'Infra > Performance' 카테고리의 다른 글

Artillery (부하테스트 툴)  (0) 2025.03.26
MySQL 인덱스를 활용한 성능 최적화  (0) 2025.03.21
성능 최적화  (0) 2025.03.20