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의 한계#

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

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