Skip to content

실습 목표#

  • 처리량과 지연을 재는 도구를 익히고 지표를 읽는 법을 배운다.
  • 싱글 서버와 멀티 서버를 같은 부하로 측정해 차이를 수치로 확인한다.
  • 부하를 바꿔 가며 멀티가 유리해지는 조건을 찾는다.


실습 1. 측정 도구 점검#


단일 라즈베리파이에서 자기 자신을 상대로 도구가 정상 작동하는지 먼저 확인한다.

라즈베리파이
make
라즈베리파이·터미널 1
./ecu_single 1000
라즈베리파이·터미널 2
./load_client 127.0.0.1 4 50

alt text

관찰 포인트

throughput과 latency 표가 찍히면 도구가 정상. 인자 1000은 요청당 처리 지연.


실습 2. 싱글 서버 측정#


라즈베리파이에서 서버를 실행하고 노트북에서 부하를 발생시킨다. 10명이 동시에 각각 100번씩, 총 1000개의 요청을 처리한다.

라즈베리파이·터미널
./ecu_single 1000
노트북·WSL
make
./load_client 192.168.10.2 10 100
테스터 출력
throughput    : ____ req/s      total time : ____ ms
latency avg   : ____ us         p99        : ____ us

alt text


실습 2 분석 : Single과 Multi의 코드 차이#

두 서버의 차이는 accept() 다음 한 줄뿐이다.
ecu_single.cpp는 현재 요청 처리가 완료된 후 다음 요청을 수락하고, ecu_multi.cpp는 스레드를 생성하여 즉시 다음 요청을 수락한다.

ecu_single.cpp
int conn = accept(srv, nullptr, nullptr);
handle_connection(conn, work_us, app_buf);
//  함수가 끝나야 다음 accept로 
ecu_multi.cpp
int conn = accept(srv, nullptr, nullptr);
std::thread(handle_connection, conn, work_us, app_buf).detach();
// 맡기고 곧바로 다음 accept로 


실습 3. 멀티 서버 측정#


단일 스레드와 완전히 동일한 부하 조건에서 수치를 비교한다. 서버만 바꾸고 부하 명령은 그대로 적용한다.

라즈베리파이·터미널
make
./ecu_multi 1000
노트북·WSL
./load_client 192.168.10.2 10 100

alt text


실습 3 결과 : Single vs Multi-threading#

동일한 부하 조건에서 측정한 4개의 값을 나란히 적고 배수를 계산한다. 처리량은 몇 배가 되는지, 지연은 얼마나 줄었는지 확인한다.

항목 싱글 멀티 배수
처리량 (req/s)
총 시간 (ms)
평균 지연 (μs)
지연 p99 (μs)

실습 3 분석 : Multi-threading이 빠른 이유#

싱글스레드는 한 요청이 끝난 뒤 다음 요청을 시작하고, 멀티스레드는 여러 요청의 대기 구간을 겹쳐서 처리한다.

싱글스레드 · 순차 처리
요청 1
요청 2
요청 3
요청 4
앞 요청이 끝나야 다음 요청이 시작됨
멀티스레드 · 동시 처리
요청 1
요청 2
요청 3
요청 4
여러 요청이 같은 시간 구간에서 함께 진행됨

핵심

같은 시간 동안 여러 요청의 대기 구간을 겹치기 때문에 멀티스레드 방식의 처리량이 더 높다.


실습 4. 부하 스윕 · 클라이언트 수#


  • 서버는 멀티로 켜 둔 채 동시 클라이언트 수만 바꿔 가며 측정한다.
  • 싱글로도 같은 스윕을 해 보면 차이가 분명해진다.

노트북·WSL
./load_client 192.168.10.2  1 100
노트북·WSL
./load_client 192.168.10.2  5 100
노트북·WSL
./load_client 192.168.10.2  10 100
노트북·WSL
./load_client 192.168.10.2  20 100

동시 클라이언트 멀티 처리량 (req/s) 싱글 처리량 (req/s)
1
5
10
20
직접 정한 값

동시 클라이언트 1개 muti vs single#

alt text alt text

동시 클라이언트 5개 muti vs single#

alt text alt text

동시 클라이언트 10개 muti vs single#

alt text alt text

동시 클라이언트 20개 muti vs single#

alt text alt text


실습 4 결과 : 동시성과 처리량#

멀티스레드는 동시 연결 수가 증가할수록 처리량이 함께 향상된다. 반면, 싱글스레드는 동시 연결 수가 증가해도 처리량이 거의 변하지 않고 지연만 길어진다.

멀티 · 함께 증가 싱글 · 거의 그대로 처리량 동시 클라이언트 수


실습 5. 부하 스윕 · 처리 지연#


서버의 처리 지연을 변경하며 동일한 부하를 적용한다. 처리 지연이 클수록 싱글과 멀티의 처리량 차이가 커진다.

라즈베리파이·터미널 가벼운처리
./ecu_multi 200
라즈베리파이·터미널 무거운처리
./ecu_multi 2000
노트북·WSL
./load_client 192.168.10.2 10 100

처리 지연 멀티 처리량 (req/s) 싱글 처리량 (req/s)
200 μs
2,000 μs
직접 정한 값

가벼운 처리#

alt text

무거운 처리#

alt text


실습 5 분석 : Multi-threading의 한계#

연결 수에 비례하여 스레드 수도 증가한다. 스레드마다 메모리와 전환 비용이 발생하므로, 임계치를 초과하면 어느 순간 느려진다.

받는 흐름
스레드
스레드
스레드
스레드
스레드
스레드
스레드
스레드
스레드
스레드
스레드
스레드
스레드
스레드
스레드
스레드
스레드
스레드
동시 연결이 늘어난 만큼 스레드가 생성될 수 있음