Network performance test: Difference between revisions
(Fix: remove --- horizontal lines (12 removed)) |
|||
| (20 intermediate revisions by 2 users not shown) | |||
| Line 1: | Line 1: | ||
== | = Network Performance Test = | ||
{{Status | |||
|status=Draft | |||
|owner=Knowledge Agent | |||
|last_update=2026-07-15 | |||
|review=Pending | |||
}} | |||
{{TOC}} | |||
== Overview == | |||
네트워크 성능 테스트는 데이터센터 및 서버의 네트워크 대역폭, 지연시간, 처리량 등을 측정하고 최적화하는 과정입니다. ethtool, netperf, pktgen 등 다양한 도구를 활용하여 테스트합니다. | |||
=== Summary === | |||
* 무엇인가? — 네트워크 성능 측정 및 최적화 | |||
* 왜 필요한가? — 병목 현상 식별, 성능 검증, 설정 최적화 | |||
* 언제 사용하는가? — 신규 서버 도입, 네트워크 업그레이드, 문제 진단 | |||
== Purpose == | |||
이 문서가 존재하는 이유 | |||
* Goal: 네트워크 성능 테스트 도구, 설정 최적화, offload 기능 제공 | |||
* Scope: speedtest, netperf, pktgen, ethtool, sysctl 튜닝, offload 기능 | |||
* Non-goals: 네트워크 보안, 방화벽 설정, VLAN 구성 | |||
== Key Concepts == | |||
{| class="wikitable" | |||
! 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 == | |||
네트워크 성능 테스트 아키텍처: | |||
= | <syntaxhighlight lang="mermaid"> | ||
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 | |||
</syntaxhighlight> | |||
== | == Workflow == | ||
/ | {| class="wikitable" | ||
! 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 업로드/다운로드 속도 측정: | |||
<syntaxhighlight lang="bash"> | |||
# 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 | |||
</syntaxhighlight> | |||
=== 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와 같은 작은 패킷은 영향 적음 | |||
<syntaxhighlight lang="bash"> | |||
# MTU 변경 | |||
$ ifconfig <interface> mtu <size> | |||
</syntaxhighlight> | |||
**장점:** | |||
* 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에 바인딩하여 캐시 미스 방지. | |||
<syntaxhighlight lang="bash"> | |||
$ taskset -p 0x1 <PID> | |||
</syntaxhighlight> | |||
=== Interrupt Coalescence === | |||
IRQ 생성 횟수를 줄이는 메커니즘. | |||
<syntaxhighlight lang="bash"> | |||
# ethtool -C로 설정 (드라이버 지원 시) | |||
$ ethtool -C ethX rx-usecs 50 | |||
</syntaxhighlight> | |||
=== Offload Features === | |||
1Hz/bit 규칙: 1bit 전송/수신에 1Hz CPU 필요. | |||
* 5Gbit/s 트래픽 → 5GHz CPU 필요 | |||
* 양방향 10Gbit/s → 8개 2.5GHz 코어 필요 | |||
**Offload 유형:** | |||
* Stateful: 연결 상태 추적 | |||
* Stateless: 상태 없이 처리 | |||
**주요 offload 기능:** | |||
{| class="wikitable" | |||
! 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 명령어 === | |||
{| class="wikitable" | |||
! 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 활성화 예시:** | |||
<syntaxhighlight lang="bash"> | |||
# 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 | |||
</syntaxhighlight> | |||
=== Kernel 설정 === | |||
/sysctl을 통해 네트워크 관련 커널 설정 변경: | |||
<syntaxhighlight lang="bash"> | |||
# 임시 설정 | |||
$ sudo sysctl -w <param>=<value> | |||
# 부팅 시 활성화 (/etc/sysctl.conf 또는 /etc/sysctl.d/) | |||
$ sudo sysctl -p /script/path | |||
# 네트워크 관련 파라미터 확인 | |||
$ sudo sysctl -a | grep net | |||
</syntaxhighlight> | |||
**중요 파라미터:** | |||
{| class="wikitable" | |||
! 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+ | |||
|} | |||
**추가 튜닝:** | |||
<syntaxhighlight lang="bash"> | |||
# 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 | |||
</syntaxhighlight> | |||
=== TCP Memory === | |||
모든 값은 BDP보다 커야 함 (패킷 드롭 방지): | |||
* `net.ipv4.tcp_rmem`: TCP 소켓 수신 버퍼 크기 | |||
* `net.ipv4.tcp_wmem`: TCP 송신 버퍼 크기 | |||
* `net.ipv4.tcp_mem`: 할당 가능한 총 TCP 버퍼 공간 | |||
=== Netperf 성능 테스트 === | |||
{| class="wikitable" | |||
! Test | |||
! Description | |||
|- | |||
| TCP_STREAM | |||
| Client → Server 트래픽 | |||
|- | |||
| TCP_MAERTS | |||
| Server → Client 트래픽 | |||
|- | |||
| UDP_STREAM | |||
| UDP 트래픽 | |||
|- | |||
| TCP_RR | |||
| 트랜잭션 성능 (요청/응답) | |||
|} | |||
<syntaxhighlight lang="bash"> | |||
# 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 | |||
</syntaxhighlight> | |||
**여러 테스트 병렬 실행 스크립트:** | |||
<syntaxhighlight lang="bash"> | |||
#!/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}' | |||
</syntaxhighlight> | |||
=== Pktgen === | |||
커널 공간 애플리케이션으로 CPU 부하 없이 고대역폭 트래픽 생성. | |||
* 네트워크 드라이버 전송 흐름 테스트 | |||
* 라우터/브리지 테스트용 일반 패킷 생성 | |||
=== Mpstat === | |||
SMP CPU 사용률 모니터링. 네트워크 테스트 중 CPU 과부하 및 IRQ 처리 CPU 식별에 유용. | |||
=== TCP Congestion Algorithms === | |||
Linux에서는 부팅 없이 실시간으로 알고리즘 변경 가능. | |||
* 기본: reno | |||
* IBM 권장: cubic | |||
<syntaxhighlight lang="bash"> | |||
# 사용 가능한 알고리즘 확인 | |||
$ 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" | |||
</syntaxhighlight> | |||
**주요 알고리즘:** | |||
* RENO: 기본 알고리즘 | |||
* CUBIC: TCP 곱절 증가 대신 큐빅 함수 사용 (고대역폭에 적합) | |||
* FAST: 빠른 혼잡 제어 | |||
== Configuration == | |||
<syntaxhighlight lang="bash"> | |||
# 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 | $ systemctl disable --now irqbalance.service | ||
# netperf 테스트 | |||
$ netperf -t TCP_STREAM -H <server_ip> -l 60 | |||
</syntaxhighlight> | |||
== Examples == | |||
=== Example 1: 네트워크 성능 테스트 === | |||
<syntaxhighlight lang="bash"> | |||
# 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 | |||
</syntaxhighlight> | |||
$ | === Example 2: offload 설정 === | ||
<syntaxhighlight lang="bash"> | |||
# 현재 설정 확인 | |||
$ 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 | |||
</syntaxhighlight> | |||
=== Example 3: 커널 튜닝 === | |||
<syntaxhighlight lang="bash"> | |||
# /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 | |||
</syntaxhighlight> | |||
== Best Practices == | |||
* Jumbo Frames는 네트워크 전체에서 일관되게 설정 | |||
* offload 기능은 필수 활성화 | |||
* IRQ balancing은 비활성화하고 수동 바인딩 | |||
* BDP보다 큰 버퍼 크기 설정 | |||
* netperf로 양방향 테스트 (TCP_STREAM + TCP_MAERTS) | |||
* pktgen으로 부하 테스트 | |||
* 정기적인 ethtool -S로 통계 모니터링 | |||
== Limitations == | |||
* Jumbo Frames는 네트워크 전체 일관성 필요 | |||
* offload 기능은 드라이버에 따라 제한적 | |||
* pktgen은 커널 모듈 필요 | |||
* netperf는 테스트 환경 설정 필요 | |||
== References == | == 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 == | |||
* [[Network]] | |||
* [[ethtool]] | |||
* [[TCP]] | |||
* [[RDMA]] | |||
* [[Jumbo Frames]] | |||
[[Category:Network]] | |||
== Knowledge Graph == | |||
Related | |||
→ [[RDMA]] | |||
→ [[NIC Bonding]] | |||
→ [[Network]] | |||
→ [[IPMI]] | |||
→ [[SDN]] | |||
→ [[NFS]] | |||
[[Category:Reference]] | |||
Latest revision as of 11:29, 17 July 2026
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
Knowledge Graph
Related