들어가며
병목 현상이란 단어를 들어봤지만, 명확하게 알고 설명하지 못하는 것 같아 블로그로 포스팅하며 정확히 파악해보려 합니다. 처음에는 ‘어려움을 만났을 때 원활하게 해결하지 못하는 현상’이라고 생각했지만, 이제 명확히 이해해보겠습니다.
병목 현상(Bottleneck effect)
병(bottle)의 목(neck)에 비유
병목 현상이란 특정 요소의 한계로 인해 전체 시스템의 성능이 저하되는 현상을 말합니다. 병의 목이 좁아 액체가 천천히 나오는 것처럼, 시스템의 한 부분이 제 기능을 못하면 전체 시스템의 성능이 떨어집니다.
예시 - 도로 교통
큰 차로가 좁아지는 구간에서 발생하는 교통 체증이 좋은 예입니다. 많은 차들이 몰리면서 원활하게 흐르지 못하고 정체되는 현상을 병목 현상이라고 합니다.
컴퓨터 분야의 병목 현상
컴퓨터에서도 병목 현상은 유사하게 발생합니다. 시스템 내 특정 부분의 성능 저하로 인해 전체 성능이 떨어집니다. 예를 들어, CPU, 메모리, 네트워크 대역폭 등이 병목 지점이 될 수 있습니다. 병목 현상은 시스템 자원 간의 불균형으로 인해 발생하며, 이를 완전히 제거하는 것은 불가능하지만 최소화할 수는 있습니다.
병목 현상은 어떻게 해결되는가?
처리량과 응답은 밀접한 관계가 있다.
응답이 매우 느린 시스템에서는 다수의 사용자 요청이 시스템 내에 누적되므로 전체 처리량도 낮아진다. 처리량이 포화 상태가 되면 리소스가 부족해져서 응답도 함께 악화된다.
병목 현상을 해결하려면 먼저 병목 지점을 찾아야 합니다. 이는 각 서버의 처리량과 응답 시간을 분석하여 가능합니다. 병목 지점을 찾았다면 두 가지 접근법을 사용합니다:
1. 병목 위치를 파악해서 해결
2. 시스템 이용자 수를 제한
모든 서버, 소프트웨어 물리 장비가 균등하게 처리량을 분배하는 것은 이론상 불가능하고, 조금이라도 특정 부분이 처리량이 낮다면 그곳이 병목 지점이라고 파악할 수 있습니다. 인프라를 구축할 때 "특정 응답은 몇 퍼센트 개선시킨다.", "200명이 접속해도 문제 없도록 처리량을 개선한다"등 목표를 만드는 것이 매우 중요합니다.
구체적인 사례
메모리 병목 현상
메모리 부족이나 특정 메모리 영역의 경합으로 발생합니다. 해결 방법으로는 메모리 락 관리나 경합이 발생하지 않도록 설계하는 것이 있습니다.
메모리 영역 병목 현상은 크게 영역 부족과 동일 영역의 경합으로 나눌 수 있습니다.
1. 영역 부족
메모리 양이 모자라 가장 메모리를 사용으로 일어나는 병목 현상입니다.
2. 동일 영역의 경합
특정 영역을 복수의 프로세스가 공유하는 경우, 메모리 영역을 참조 또는 갱신할 때 관리가 필요합니다. 1바이트 메모리 영역을 관리하기 위해 대기 행렬을 작성했다고 하면 1바이트 이상의 대기 행렬 메모리 공간이 필요하기에 오버헤드 발생합니다.
해결 방법은 애초에 경합이 발생하지 않도록 복수의 프로세스나 스레드가 같은 메모리 영역을 참조하지 않도록 설계합니다. 혹은 메모리 락(Lock) 관리를 통해 방지합니다.
애플리케이션 병목 현상
알고리즘 비효율성이나 특정 데이터 접근 문제로 발생합니다. 이를 해결하려면 알고리즘을 최적화하거나 데이터 접근 방식을 개선해야 합니다.
애플리케이션 병목 현상 부분도 Scale Up, Out을 통해 해결이 가능합니다.
하지만, 알고리즘의 문제라면 인프라 측 리소스를 아무리 늘려도 응답 속도 개선은 미미합니다.
1. 데이터 갱신의 병목 현상
특정 레코드에 여러 처리가 동시에 접근했을 때 발생됩니다. 대기 큐를 이용하거나 베타적 제어로 제어 가능합니다. 이 외에도 2가지 개선 방법이 있습니다.
먼저, 값의 캐시화입니다. DB서버가 아닌 AP 서버에 값을 캐시합니다. 하지만, 병목 지점이라는 변함은 없어 근본적인 해결책이 아닙니다.
다음, 병목 지점의 분할입니다. 재고 확인을 엄밀하게 처리하지 않고 레코드를 두 개로 나누는 형태입니다. 예를 들면, 재고가 200개 있다고 하면 100개씩 레코드를 분할하여 각각 레코드에 접근하여 처리 다중화합니다. 하지만, 데이터 일치성 문제와 한쪽이 먼저 고갈될 경우 데이터 최신성 문제가 새롭게 발생합니다.
2. 외부 질의의 병목 현상
시스템은 하나로 완성되는 경우는 없고 다른 시스템이나 데이터를 연계 협력하는 경우가 많습니다. 이때 외부 질의를 통해 병목이 발생할 수 있습니다. 예를 들어, 인증 서버에 질의를 할 때 1 트랜잭션마다 1 질의를 하면 병목이 발생합니다. 1회 질의할 때 1회 인증을 하는 형식으로 변경 시 해결이 가능합니다.
이 외에도 CPU 병목 현상, 디스크 I/O 병목 현상, 네트워크 I/O 병목 현상 예시 또한 있습니다.
결론
병목 현상은 시스템 성능 저하의 주요 원인 중 하나입니다. 이를 해결하기 위해서는 병목 지점을 정확히 파악하고, 효율적인 자원 분배 및 최적화를 통해 성능을 개선해야 합니다. 병목 현상은 완전히 제거할 수는 없지만, 지속적인 모니터링과 최적화를 통해 최소화할 수 있습니다. 따라서 시스템 설계 시 병목 현상을 고려하여 목표를 설정하고, 주기적으로 성능을 점검하는 것이 중요합니다.
출처
'Etc' 카테고리의 다른 글
[Notion] 스터디 전용 노션 페이지를 만들고 싶은데.. (0) | 2024.05.31 |
---|---|
[Review] Hello World24 컨퍼런스 회고 (0) | 2024.04.01 |
쿠키(Cookie)와 세션(Session) (0) | 2024.03.29 |
[Etc] Kakao Maps 단일 오버레이 관리하기 (0) | 2024.03.29 |
[npm] ERROR : EACCES: permission denied, mkdir (0) | 2024.03.20 |