부하테스트에서 병목 지점(Bottleneck Point)이라는 말을 많이 사용한다. 병목 지점(Bottleneck Point)이란, 전체 시스템에서 특정 서버 자원(CPU, Memory 등)이 한계에 도달해 전체 성능이 저하되는 구간을 의미한다.
고속 도로에 비유하자면 길이 갑자기 좁아지는 구간에서 차가 확 막히는 경우가 많다. 3차선 도로가 소화할만한 차들이 갑자기 2차선으로 몰려들면서 정체가 발생한다. 그럼 이 2차선 구간에서 발생한 정체를 보고 병목 지점(Bottlenectk Point)라고 얘기한다.
전체적인 고속 도로 정체를 해결하기 위해서는 교통 정체가 일어난 곳을 해결해야 한다. 정체가 없는 3차선 도로를 아무리 더 넓혀봐야, 2차선 도로의 정체가 나아지지 않는다. 정체가 발생한 2차선 도로를 해결해야 전체적인 고속 도로 정체가 해결된다. 이와 비슷하게 시스템의 성능을 개선하려면 ‘병목 지점’을 개선해야 한다.
✅ ’병목 지점의 Throughput’이 곧 ‘전체 Throughput’이다.
A~B~C까지 1시간에 통과할 수 있는 자동차의 대수가 300대이다. 왜냐하면 A~B의 구간에서 아무리 1시간에 1,000대를 통과시킨다고 하더라도, B~C 구간에서 1시간에 300대만 통과할 수 있기 때문이다.
시스템에서도 동일하게 적용된다. 사용자 ↔ 백엔드 서버 ↔ DB의 구조에서 백엔드 서버가 1초에 1,000개의 요청을 처리할 수 있고, DB가 1초에 300개의 요청을 처리할 수 있다고 가정하자. 그러면 전체적인 시스템에서 1초당 처리할 수 있는 요청의 양은 300개이다.
위 사례를 통해 ‘병목 지점의 Throughput’이 곧 ‘전체 Throughput’이라는 걸 알 수 있다.
✅ 특정 병목 지점을 해소하면 다른 곳에서 새로운 병목 지점이 발생한다.
A~B~C 구간에서 통과할 수 있는 자동차의 대수는 시간당 300대이다. A~B~C 구간을 통과할 수 있는 자동차 대수를 늘리기 위해 병목 지점인 B~C 구간을 아래와 같이 개선해봤다.
이제는 A~B~C 구간에서 통과할 수 있는 자동차의 대수는 시간당 1,000대 이다. B~C 구간에서는 시간당 1,500대의 자동차가 지나갈 수 있을지라도, A~B 구간에서는 시간당 1,000대의 자동차만 지나갈 수 있기 때문이다.
위 예를 통해 특정 병목 지점을 해소하면 다른 곳에서 새로운 병목 지점이 발생한다는 점을 알 수 있다.