실습 목표#
- 처리량과 지연을 재는 도구를 익히고 지표를 읽는 법을 배운다.
- 싱글 서버와 멀티 서버를 같은 부하로 측정해 차이를 수치로 확인한다.
- 부하를 바꿔 가며 멀티가 유리해지는 조건을 찾는다.
실습 1. 측정 도구 점검#
단일 라즈베리파이에서 자기 자신을 상대로 도구가 정상 작동하는지 먼저 확인한다.
make
./ecu_single 1000
./load_client 127.0.0.1 4 50

관찰 포인트
throughput과 latency 표가 찍히면 도구가 정상. 인자 1000은 요청당 처리 지연.
실습 2. 싱글 서버 측정#
라즈베리파이에서 서버를 실행하고 노트북에서 부하를 발생시킨다. 10명이 동시에 각각 100번씩, 총 1000개의 요청을 처리한다.
./ecu_single 1000
make
./load_client 192.168.10.2 10 100
throughput : ____ req/s total time : ____ ms
latency avg : ____ us p99 : ____ us

실습 2 분석 : Single과 Multi의 코드 차이#
두 서버의 차이는 accept() 다음 한 줄뿐이다.
ecu_single.cpp는 현재 요청 처리가 완료된 후 다음 요청을 수락하고, ecu_multi.cpp는 스레드를 생성하여 즉시 다음 요청을 수락한다.
int conn = accept(srv, nullptr, nullptr);
handle_connection(conn, work_us, app_buf);
// 이 함수가 끝나야 다음 accept로 감
int conn = accept(srv, nullptr, nullptr);
std::thread(handle_connection, conn, work_us, app_buf).detach();
// 맡기고 곧바로 다음 accept로 감
실습 3. 멀티 서버 측정#
단일 스레드와 완전히 동일한 부하 조건에서 수치를 비교한다. 서버만 바꾸고 부하 명령은 그대로 적용한다.
make
./ecu_multi 1000
./load_client 192.168.10.2 10 100

실습 3 결과 : Single vs Multi-threading#
동일한 부하 조건에서 측정한 4개의 값을 나란히 적고 배수를 계산한다. 처리량은 몇 배가 되는지, 지연은 얼마나 줄었는지 확인한다.
| 항목 | 싱글 | 멀티 | 배수 |
|---|---|---|---|
처리량 (req/s) |
|||
총 시간 (ms) |
|||
평균 지연 (μs) |
|||
지연 p99 (μs) |
실습 3 분석 : Multi-threading이 빠른 이유#
싱글스레드는 한 요청이 끝난 뒤 다음 요청을 시작하고, 멀티스레드는 여러 요청의 대기 구간을 겹쳐서 처리한다.
핵심
같은 시간 동안 여러 요청의 대기 구간을 겹치기 때문에 멀티스레드 방식의 처리량이 더 높다.
실습 4. 부하 스윕 · 클라이언트 수#
- 서버는 멀티로 켜 둔 채 동시 클라이언트 수만 바꿔 가며 측정한다.
- 싱글로도 같은 스윕을 해 보면 차이가 분명해진다.
./load_client 192.168.10.2 1 100
./load_client 192.168.10.2 5 100
./load_client 192.168.10.2 10 100
./load_client 192.168.10.2 20 100
| 동시 클라이언트 | 멀티 처리량 (req/s) |
싱글 처리량 (req/s) |
|---|---|---|
| 1 | ||
| 5 | ||
| 10 | ||
| 20 | ||
| 직접 정한 값 |
동시 클라이언트 1개 muti vs single#
동시 클라이언트 5개 muti vs single#
동시 클라이언트 10개 muti vs single#
동시 클라이언트 20개 muti vs single#

실습 4 결과 : 동시성과 처리량#
멀티스레드는 동시 연결 수가 증가할수록 처리량이 함께 향상된다. 반면, 싱글스레드는 동시 연결 수가 증가해도 처리량이 거의 변하지 않고 지연만 길어진다.
실습 5. 부하 스윕 · 처리 지연#
서버의 처리 지연을 변경하며 동일한 부하를 적용한다. 처리 지연이 클수록 싱글과 멀티의 처리량 차이가 커진다.
./ecu_multi 200
./ecu_multi 2000
./load_client 192.168.10.2 10 100
| 처리 지연 | 멀티 처리량 (req/s) |
싱글 처리량 (req/s) |
|---|---|---|
200 μs |
||
2,000 μs |
||
| 직접 정한 값 |
가벼운 처리#

무거운 처리#

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