Network performance test
Network Performance Test
Overview
네트워크 성능 테스트는 데이터센터 및 서버의 네트워크 대역폭, 지연시간, 처리량 등을 측정하고 최적화하는 과정입니다. ethtool, netperf, pktgen 등 다양한 도구를 활용하여 테스트합니다.
Summary
- 무엇인가? — 네트워크 성능 측정 및 최적화
- 왜 필요한가? — 병목 현상 식별, 성능 검증, 설정 최적화
- 언제 사용하는가? — 신규 서버 도입, 네트워크 업그레이드, 문제 진단
---
Purpose
이 문서가 존재하는 이유
- Goal: 네트워크 성능 테스트 도구, 설정 최적화, offload 기능 제공
- Scope: speedtest, netperf, pktgen, ethtool, sysctl 튜닝, offload 기능
- Non-goals: 네트워크 보안, 방화벽 설정, VLAN 구성
---
Key Concepts
| Concept | Description | Related |
|---|---|---|
| Throughput | 실제 데이터 전송률 (bit/s) | Network performance test |
| Bandwidth Delay Product | 네트워크 경로 최대 데이터량 | Network performance test |
| Jumbo Frames | MTU 9000+ 대형 프레임 | Network performance test |
| RDMA | 원격 메모리 직접 접근 | Network performance test |
| Offload | NIC가 TCP/IP 처리 담당 | Network performance test |
| IRQ Affinity | 인터럽트 CPU 바인딩 | Network performance test |
| Netperf | 네트워크 성능 테스트 도구 | Network performance test |
| Pktgen | 커널 공간 패킷 생성기 | Network performance test |
---
Architecture
네트워크 성능 테스트 아키텍처:
graph TD
A[Client] -->|TCP/UDP| B[Network]
B --> C[Server]
D[Netperf] --> A
D --> C
E[Pktgen] --> B
F[ethtool] --> A
F --> C
G[sysctl] --> A
G --> C---
Workflow
| Stage | Input | Output |
|---|---|---|
| Bandwidth Test | speedtest/netperf | Throughput (Gbit/s) |
| Latency Test | ping/traceroute | RTT (msec) |
| Offload Check | ethtool -k | Feature status |
| Kernel Tuning | sysctl -w | Performance improvement |
| Stress Test | pktgen | Max throughput |
---
Detailed Explanation
Speedtest
Broadband 업로드/다운로드 속도 측정:
# Debian/Ubuntu
curl -s https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.deb.sh | sudo bash
sudo apt-get install speedtest
# RHEL/CentOS
curl -s https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.rpm.sh | sudo bash
sudo yum install speedtest
# 실행
$ speedtest
Throughput
데이터 전송률 또는 디지털 대역폭 소비를 나타내며, 물리 계층 위 데이터 링크 계층에서 측정됩니다.
- 1 Kbit/s = 1,000 bit/s (1,024 아님)
Round Trip Time (RTT)
패킷이 목적지에 도달하여 소스로 돌아오는 데 걸리는 총 시간.
- 일반적으로 1msec ~ 100msec
- ping 또는 traceroute로 측정
Bandwidth Delay Product (BDP)
네트워크 경로에 동시에 존재할 수 있는 데이터 양의 근사치.
BDP = Bandwidth × RTT
- 버퍼는 BDP보다 커야 함 (패킷 오버플로우 방지)
- TCP/IP 튜닝에 중요
Jumbo Frames
표준 1500바이트보다 큰 이더넷 프레임 (최대 9000바이트, Super Jumbo는 16128바이트).
- 10Gbit/s 스위치는 거의 모두 지원
- MTU는 네트워크 전체 노드에서 동일해야 함
- SSH와 같은 작은 패킷은 영향 적음
# MTU 변경
$ ifconfig <interface> mtu <size>
- 장점:**
- I/O 오버헤드 감소
- TCP 혼잡 윈도우 증가 가속화 (표준 MTU 대비 6배)
Remote DMA (RDMA)
커널을 우회하여 한 컴퓨터의 메모리에서 다른 컴퓨터의 메모리로 직접 데이터 이동.
- Linux: OpenRDMA 프로젝트
- NFS 등 애플리케이션에 이미 구현됨
Transmission Queue Size
송신 큐는 전송 예정 패킷을 버퍼링합니다.
- 기본값: 1000 패킷
- 권장: 3000 패킷 (네트워크 특성에 따라)
SMP IRQ Affinity
SMP 시스템에서 특정 IRQ를 처리하는 CPU 선택이 성능에 중요.
- IRQ balancing 비활성화: `systemctl disable --now irqbalance.service`
- IRQ를 특정 CPU에 바인딩: `/proc/<IRQ number>/smp_affinity`
- hex 값: CPU0=0x1, CPU2=0x4
Taskset Affinity
멀티 스트림 설정에서 태스크를 특정 CPU에 바인딩하여 캐시 미스 방지.
$ taskset -p 0x1 <PID>
Interrupt Coalescence
IRQ 생성 횟수를 줄이는 메커니즘.
# ethtool -C로 설정 (드라이버 지원 시)
$ ethtool -C ethX rx-usecs 50
Offload Features
1Hz/bit 규칙: 1bit 전송/수신에 1Hz CPU 필요.
- 5Gbit/s 트래픽 → 5GHz CPU 필요
- 양방향 10Gbit/s → 8개 2.5GHz 코어 필요
- Offload 유형:**
- Stateful: 연결 상태 추적
- Stateless: 상태 없이 처리
- 주요 offload 기능:**
| Feature | Description | 권장 |
|---|---|---|
| TX Checksum | TX 체크섬 오프로드 | on |
| RX Checksum | RX 체크섬 오프로드 | on |
| TSO | TCP Segmentation Offload | on |
| GSO | Generic Segmentation Offload | on |
| GRO | Generic Receive Offload | on |
| LRO | Large Receive Offload | on (드라이버별) |
| SG | Scatter-Gather | on |
- CPU 절감 효과:**
- PCI-X Gbit + 1500 MTU: ~5%
- PCI-X Gbit + 9000 MTU: ~15%
ethtool 명령어
| Command | Description |
|---|---|
| ethtool -k ethX | Offload 기능 확인 |
| ethtool -K ethX tso off | TSO 비활성화 |
| ethtool -K ethX gro off lro off | GRO/LRO 비활성화 |
| ethtool -g ethX | Ring 크기 확인 |
| ethtool -G ethX rx N | Ring 크기 설정 |
| ethtool -S ethX | 통계 확인 |
| ethtool -c ethX | 현재 offload 기능 표시 |
| ethtool -C ethX rx-frames N | 인터럽트 코얼레선스 설정 |
| ethtool --set-eee ethX eee off | EEE 비활성화 |
| ethtool -t ethX | 자가 진단 테스트 |
- offload 활성화 예시:**
# TX/RX 체크섬 활성화
$ sudo ethtool -K eno1np0 tx on
$ sudo ethtool -K eno1np0 rx on
# Scatter-Gather 활성화
$ sudo ethtool -K eno1np0 sg on
# TSO 활성화
$ sudo ethtool -K eno1np0 tso on
# GSO 활성화
$ sudo ethtool -K eno1np0 gso on
Kernel 설정
/sysctl을 통해 네트워크 관련 커널 설정 변경:
# 임시 설정
$ sudo sysctl -w <param>=<value>
# 부팅 시 활성화 (/etc/sysctl.conf 또는 /etc/sysctl.d/)
$ sudo sysctl -p /script/path
# 네트워크 관련 파라미터 확인
$ sudo sysctl -a | grep net
- 중요 파라미터:**
| Parameter | Description | 10G 권장값 |
|---|---|---|
| net.ipv4.tcp_low_latency | 지연시간 우선 (기본 0) | 1 |
| net.ipv4.tcp_window_scaling | 큰 TCP 윈도우 지원 | 1 |
| net.ipv4.tcp_max_tw_buckets | TIME_WAIT 버킷 (기본 262,144) | 450,000 |
| net.ipv4.tcp_timestamps | 정확한 RTT 측정 | 1 |
| net.ipv4.tcp_sack | 선택적 확인응답 | 1 |
| net.ipv4.tcp_no_metrics_save | TCP 메트릭 저장 비활성화 | 1 |
| net.ipv4.tcp_max_syn_backlog | 대기 연결 최대값 | 4096+ |
| net.core.rmem_max / wmem_max | 소켓 수신/송신 버퍼 최대 | 1,048,576+ |
| net.core.netdev_max_backlog | 수신 패킷 백로그 최대 | 30,000+ |
- 추가 튜닝:**
# RX 버퍼 크기 증가
$ sudo sysctl -w net.core.rmem_max=16777216
# TCP 윈도우 스케일링 활성화
$ sudo sysctl net.ipv4.tcp_window_scaling
# TCP 타임스탬프 비활성화 (오버헤드 감소)
$ sudo sysctl -w net.ipv4.tcp_timestamps=0
# TCP FIN 타임아웃 (기본 60s → 5s)
$ sudo sysctl -w net.ipv4.tcp_fin_timeout=5
# TCP SACK 비활성화
$ sudo sysctl -w net.ipv4.tcp_sack=0
TCP Memory
모든 값은 BDP보다 커야 함 (패킷 드롭 방지):
- `net.ipv4.tcp_rmem`: TCP 소켓 수신 버퍼 크기
- `net.ipv4.tcp_wmem`: TCP 송신 버퍼 크기
- `net.ipv4.tcp_mem`: 할당 가능한 총 TCP 버퍼 공간
Netperf 성능 테스트
| Test | Description |
|---|---|
| TCP_STREAM | Client → Server 트래픽 |
| TCP_MAERTS | Server → Client 트래픽 |
| UDP_STREAM | UDP 트래픽 |
| TCP_RR | 트랜잭션 성능 (요청/응답) |
# TCP_STREAM 10초 테스트
$ netperf -t TCP_STREAM -H 192.168.1.6 -l 10
# TCP_RR 테스트
$ netperf -H 192.168.1.6 -t TCP_RR -l 10
# CPU 사용률 보고
$ netperf -T0,0 -C -c
- 여러 테스트 병렬 실행 스크립트:**
#!/bin/bash
NUMBER=8
TMPFILE=mktemp
DURATION=10
PEER=192.168.1.6
pids=""
echo '' > $TMPFILE
for i in $(seq $NUMBER); do
echo "Start test ${i}"
netperf -H $PEER -l 10 -t TCP_STREAM -- >> $TMPFILE &
pids="$pids $!"
netperf -H $PEER -l 10 -t TCP_MAERTS -- >> $TMPFILE &
pids="$pids $!"
done
wait $pids
echo -n "Total throughput (10^6bits/sec) result: "
cat $TMPFILE | awk '{sum += $5} END{print sum}'
Pktgen
커널 공간 애플리케이션으로 CPU 부하 없이 고대역폭 트래픽 생성.
- 네트워크 드라이버 전송 흐름 테스트
- 라우터/브리지 테스트용 일반 패킷 생성
Mpstat
SMP CPU 사용률 모니터링. 네트워크 테스트 중 CPU 과부하 및 IRQ 처리 CPU 식별에 유용.
TCP Congestion Algorithms
Linux에서는 부팅 없이 실시간으로 알고리즘 변경 가능.
- 기본: reno
- IBM 권장: cubic
# 사용 가능한 알고리즘 확인
$ cat /proc/sys/net/ipv4/tcp_available_congestion_control
reno cubic
# 현재 알고리즘 확인
$ cat /proc/sys/net/ipv4/tcp_congestion_control
cubic
# 알고리즘 변경
$ sudo sh -c "echo cubic > /proc/sys/net/ipv4/tcp_congestion_control"
- 주요 알고리즘:**
- RENO: 기본 알고리즘
- CUBIC: TCP 곱절 증가 대신 큐빅 함수 사용 (고대역폭에 적합)
- FAST: 빠른 혼잡 제어
---
Configuration
# offload 확인
$ sudo ethtool -k eth0
# offload 활성화
$ sudo ethtool -K eth0 tso on gso on gro on sg on
# Ring 크기 설정
$ sudo ethtool -G eth0 rx 4096 tx 4096
# 커널 튜닝
$ sudo sysctl -w net.core.rmem_max=16777216
$ sudo sysctl -w net.core.wmem_max=16777216
$ sudo sysctl -w net.ipv4.tcp_window_scaling=1
# IRQ balancing 비활성화
$ systemctl disable --now irqbalance.service
# netperf 테스트
$ netperf -t TCP_STREAM -H <server_ip> -l 60
---
Examples
Example 1: 네트워크 성능 테스트
# speedtest
$ speedtest
# netperf TCP_STREAM
$ netperf -t TCP_STREAM -H 192.168.1.6 -l 60
# netperf TCP_RR
$ netperf -H 192.168.1.6 -t TCP_RR -l 60
Example 2: offload 설정
# 현재 설정 확인
$ sudo ethtool -k eth0
# 모든 offload 활성화
$ sudo ethtool -K eth0 tx on rx on tso on gso on gro on sg on
# Ring 크기 증가
$ sudo ethtool -G eth0 rx 4096 tx 4096
Example 3: 커널 튜닝
# /etc/sysctl.d/99-network-tuning.conf
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_window_scaling=1
net.ipv4.tcp_max_syn_backlog=4096
net.core.netdev_max_backlog=30000
# 적용
$ sudo sysctl -p /etc/sysctl.d/99-network-tuning.conf
---
Best Practices
- Jumbo Frames는 네트워크 전체에서 일관되게 설정
- offload 기능은 필수 활성화
- IRQ balancing은 비활성화하고 수동 바인딩
- BDP보다 큰 버퍼 크기 설정
- netperf로 양방향 테스트 (TCP_STREAM + TCP_MAERTS)
- pktgen으로 부하 테스트
- 정기적인 ethtool -S로 통계 모니터링
---
Limitations
- Jumbo Frames는 네트워크 전체 일관성 필요
- offload 기능은 드라이버에 따라 제한적
- pktgen은 커널 모듈 필요
- netperf는 테스트 환경 설정 필요
---
References
- https://hewlettpackard.github.io/netperf/
- https://www.kernel.org/doc/Documentation/networking/pktgen.txt
- https://www.kernel.org/doc/ols/2009/ols2009-pages-169-184.pdf
---
Related Pages
---