부하테스트에서 **병목 지점(Bottleneck Point)**이라는 말을 많이 사용한다. **병목 지점(Bottleneck Point)**이란, 전체 시스템에서 특정 서버 자원(CPU, Memory 등)이 한계에 도달해 전체 성능이 저하되는 구간을 의미한다.
고속 도로에 비유하자면 길이 갑자기 좁아지는 구간에서 차가 확 막히는 경우가 많다. 3차선 도로가 소화할만한 차들이 갑자기 2차선으로 몰려들면서 정체가 발생한다. 그럼 이 2차선 구간에서 발생한 정체를 보고 **병목 지점(Bottlenectk Point)**라고 얘기한다.
전체적인 고속 도로 정체를 해결하기 위해서는 교통 정체가 일어난 곳을 해결해야 한다. 정체가 없는 3차선 도로를 아무리 더 넓혀봐야, 2차선 도로의 정체가 나아지지 않는다. 정체가 발생한 2차선 도로를 해결해야 전체적인 고속 도로 정체가 해결된다. 이와 비슷하게 시스템의 성능을 개선하려면 ‘병목 지점’을 개선해야 한다.
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대의 자동차만 지나갈 수 있기 때문이다.