# Check NIC ring buffer sizes
ethtool -g eth0
# Monitor socket buffer usage
ss -tm
# Check for TCP zero window events
tcpdump -i any 'tcp[tcpflags] & tcp-push != 0' -vv
# Check network statistics for buffer issues
netstat -s | grep -i "buffer\|queue\|drop"
Windows 진단
# Check TCP parameters
netsh interface tcp show global
# View network adapter buffer settings
Get-NetAdapterAdvancedProperty -Name "Ethernet" | Where-Object {$_.DisplayName -like "*buffer*"}
# Monitor TCP statistics
netstat -s -p tcp
# Check receive window auto-tuning
netsh interface tcp show global | findstr "Receive Window"
macOS 진단
# Check current buffer settings
sysctl kern.ipc.maxsockbuf
sysctl net.inet.tcp.sendspace
sysctl net.inet.tcp.recvspace
# View network statistics
netstat -s -p tcp
# Monitor socket buffers
netstat -an -p tcp
Linux 버퍼 튜닝
레거시 Linux 설정(2009년경)
| 매개변수 |
레거시 가치 (2009) |
설명 |
| net.core.rmem_default |
124928(122KB) |
기본 수신 소켓 버퍼 크기 |
| 넷.코어.rmem_max |
131071(128KB) |
최대 수신 소켓 버퍼 크기 |
| net.core.wmem_default |
124928(122KB) |
기본 송신 소켓 버퍼 크기 |
| 넷.코어.wmem_max |
131071(128KB) |
최대 송신 소켓 버퍼 크기 |
| net.ipv4.tcp_rmem |
4096 87380 174760 |
TCP 수신 버퍼: 최소, 기본값, 최대(바이트) |
| net.ipv4.tcp_wmem |
4096 16384 131072 |
TCP 전송 버퍼: 최소, 기본값, 최대(바이트) |
| net.ipv4.tcp_mem |
196608 262144 393216 |
TCP 메모리 페이지: 낮음, 압력, 높음 |
| net.core.netdev_max_backlog |
1000 |
입력 대기열의 최대 패킷 |
| net.core.optmem_max |
10240(10KB) |
소켓당 최대 보조 버퍼 크기 |
현재 Linux 설정(2025~2026)
| 매개변수 |
현재 권장값 |
설명 |
| net.core.rmem_default |
16777216(16MB) |
기본 수신 소켓 버퍼 크기 |
| 넷.코어.rmem_max |
134217728 (128MB) |
최대 수신 소켓 버퍼 크기 |
| net.core.wmem_default |
16777216(16MB) |
기본 송신 소켓 버퍼 크기 |
| 넷.코어.wmem_max |
134217728 (128MB) |
최대 송신 소켓 버퍼 크기 |
| net.ipv4.tcp_rmem |
4096 87380 134217728 |
TCP 수신 버퍼: 최소, 기본값, 최대(최대 128MB) |
| net.ipv4.tcp_wmem |
4096 65536 134217728 |
TCP 전송 버퍼: 최소, 기본값, 최대(최대 128MB) |
| net.ipv4.tcp_mem |
8388608 12582912 16777216 |
TCP 메모리 페이지: 낮음, 압력, 높음(64GB 시스템) |
| net.core.netdev_max_backlog |
250000 |
입력 대기열의 최대 패킷(10GbE+) |
| net.core.optmem_max |
65536(64KB) |
소켓당 최대 보조 버퍼 크기 |
| net.ipv4.tcp_congestion_control |
bbr |
BBR 혼잡 제어 사용(Google 알고리즘) |
| net.ipv4.tcp_window_scaling |
1 |
TCP 창 크기 조정 활성화(RFC 1323) |
| net.ipv4.tcp_timestamps |
1 |
더 나은 RTT 추정을 위해 TCP 타임스탬프를 활성화합니다. |
| net.ipv4.tcp_sack |
1 |
선택적 승인 활성화 |
| net.ipv4.tcp_no_metrics_save |
1 |
TCP 지표 캐싱 비활성화 |
Linux 구성 애플리케이션
다음 설정을 추가하세요./etc/sysctl.conf아니면 새 파일을 만드세요/etc/sysctl.d/99-network-tuning.conf:
# Network Buffer Tuning for High-Performance Applications
# Optimized for 10GbE+ networks with RTT up to 300ms
# Core socket buffer settings
net.core.rmem_default = 16777216
net.core.rmem_max = 134217728
net.core.wmem_default = 16777216
net.core.wmem_max = 134217728
# TCP buffer settings
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
net.ipv4.tcp_mem = 8388608 12582912 16777216
# Device buffer settings
net.core.netdev_max_backlog = 250000
net.core.netdev_budget = 50000
net.core.netdev_budget_usecs = 5000
net.core.optmem_max = 65536
# TCP optimizations
net.ipv4.tcp_congestion_control = bbr
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_moderate_rcvbuf = 1
# Apply with: sysctl -p /etc/sysctl.d/99-network-tuning.conf
NIC 링 버퍼 튜닝
# Check current ring buffer sizes
ethtool -g eth0
# Set maximum ring buffer sizes (adjust based on NIC capabilities)
ethtool -G eth0 rx 4096 tx 4096
# Make persistent by adding to /etc/network/interfaces or systemd service
심각한 경고 - 메모리 소비:tcp_mem 값은 메모리 페이지(일반적으로 4KB)에 있습니다. 버퍼 크기가 크면 심각한 메모리 압박이 발생할 수 있습니다.
-
연결당 메모리:각 연결은 최대 rmem_max + wmem_max(128MB 버퍼 포함 256MB)를 사용할 수 있습니다.
-
총 시스템 영향:1,000개의 연결 × 256MB = 256GB의 잠재적 사용량
-
안전한 추정:최대 동시 연결 × 256MB는 시스템 RAM의 50%를 초과할 수 없습니다.
-
예:64GB 서버는 최대 연결을 128MB 버퍼를 사용하여 최대 125개의 동시 높은 처리량 연결로 제한해야 합니다.
-
RAM이 16GB 미만인 서버에 대한 권장 사항:버퍼를 최대 16-32MB로 줄이고 tcp_mem을 비례적으로 조정합니다.
Windows 버퍼 튜닝
레거시 Windows 설정(2009년경 - Windows Vista/7/Server 2008)
| 매개변수 |
레거시 가치 (2009) |
위치 |
| Tcp창 크기 |
65535(64KB) |
레지스트리: HKLM\System\CurrentControlSet\Services\Tcpip\Parameters |
| Tcp1323선택 |
0(비활성화) |
기본적으로 창 크기 조정이 비활성화되어 있습니다. |
| 기본수신창 |
8192(8KB) |
기본 수신 창 |
| 기본보내기창 |
8192(8KB) |
기본 전송 창 |
| GlobalMaxTcpWindowSize |
65535(64KB) |
최대 TCP 창 크기 |
| TcpNumConnections |
16777214 |
최대 TCP 연결 |
현재 Windows 설정(Windows 10/11/Server 2019-2025)
최신 Windows에서는 다음을 사용합니다.창 자동 조정 수신네트워크 상태에 따라 수신 버퍼를 동적으로 조정하는 기능입니다.
| 특징 |
현재 권장 설정 |
설명 |
| 자동 튜닝 수준 |
일반(또는 10GbE+의 경우 매우 실험적) |
동적 수신 창 조정 |
| 수신측 배율(RSS) |
활성화됨 |
CPU 전체에 네트워크 처리 분산 |
| 굴뚝 오프로드 |
자동(또는 최신 NIC에서는 비활성화됨) |
NIC 하드웨어로 TCP 오프로드 |
| NetDMA |
장애가 있는 |
직접 메모리 액세스(더 이상 사용되지 않음) |
| TCP 전역 매개변수 |
아래 명령을 참조하세요 |
시스템 전체 TCP 설정 |
| 혼잡 제공자 |
CUBIC(또는 NewReno 폴백) |
TCP 혼잡 제어 알고리즘 |
Windows 구성 명령
# Check current auto-tuning level
netsh interface tcp show global
# Enable auto-tuning (normal mode - default for most scenarios)
netsh interface tcp set global autotuninglevel=normal
# For high-bandwidth, high-latency networks (10GbE+, data center environments)
netsh interface tcp set global autotuninglevel=experimental
# For conservative tuning (if experimental causes issues)
netsh interface tcp set global autotuninglevel=restricted
# For very conservative tuning (not recommended for high-performance networks)
netsh interface tcp set global autotuninglevel=highlyrestricted
# Enable CUBIC congestion provider (Windows Server 2022/Windows 11+ only)
netsh interface tcp set supplemental template=Internet congestionprovider=cubic
# Note: Windows 10 and Server 2019 use Compound TCP or NewReno by default
# CUBIC is not available on these older versions
# Enable Receive-Side Scaling (RSS)
netsh interface tcp set global rss=enabled
# Set chimney offload (automatic is recommended)
netsh interface tcp set global chimney=automatic
# Disable NetDMA (recommended for modern systems)
netsh interface tcp set global netdma=disabled
# Enable Direct Cache Access (if supported)
netsh interface tcp set global dca=enabled
# Enable ECN (Explicit Congestion Notification)
netsh interface tcp set global ecncapability=enabled
# Set initial congestion window to 10 (RFC 6928)
netsh interface tcp set global initialRto=3000
고급 NIC 버퍼 설정(장치 관리자 또는 PowerShell을 통해)
# View current adapter settings
Get-NetAdapterAdvancedProperty -Name "Ethernet"
# Increase receive buffers (adjust based on NIC)
Set-NetAdapterAdvancedProperty -Name "Ethernet" -DisplayName "Receive Buffers" -DisplayValue 2048
# Increase transmit buffers
Set-NetAdapterAdvancedProperty -Name "Ethernet" -DisplayName "Transmit Buffers" -DisplayValue 2048
# Enable Jumbo Frames (if network supports it)
Set-NetAdapterAdvancedProperty -Name "Ethernet" -DisplayName "Jumbo Packet" -DisplayValue 9014
# Enable Large Send Offload (LSO)
Set-NetAdapterAdvancedProperty -Name "Ethernet" -DisplayName "Large Send Offload V2 (IPv4)" -DisplayValue Enabled
Set-NetAdapterAdvancedProperty -Name "Ethernet" -DisplayName "Large Send Offload V2 (IPv6)" -DisplayValue Enabled
레지스트리 조정(고급 - 주의해서 사용)
# These settings are typically NOT needed on Windows 10/11 due to auto-tuning
# Only modify if auto-tuning is disabled or problematic
# Registry path: HKLM\System\CurrentControlSet\Services\Tcpip\Parameters
# Maximum TCP window size (if auto-tuning disabled)
# TcpWindowSize = 16777216 (16MB) - REG_DWORD
# Enable window scaling (enabled by default on modern Windows)
# Tcp1323Opts = 3 - REG_DWORD
# Number of TCP Timed Wait Delay
# TcpTimedWaitDelay = 30 - REG_DWORD (default 240)
경고:최신 Windows(10/11/Server 2019+)에서는 자동 조정으로 인해 문제가 발생하지 않는 한 수동으로 레지스트리를 수정하지 마세요. 자동 조정 알고리즘은 일반적으로 정적 설정보다 우수합니다.
macOS 버퍼 조정
레거시 macOS 설정(2009년경 - Mac OS X 10.5/10.6)
| 매개변수 |
레거시 가치 (2009) |
설명 |
| kern.ipc.maxsockbuf |
262144(256KB) |
최대 소켓 버퍼 크기 |
| net.inet.tcp.sendspace |
32768(32KB) |
기본 TCP 전송 버퍼 |
| net.inet.tcp.recvspace |
32768(32KB) |
기본 TCP 수신 버퍼 |
| net.inet.tcp.autorcvbufmax |
131072(128KB) |
최대 자동 조정 수신 버퍼 |
| net.inet.tcp.autosndbufmax |
131072(128KB) |
최대 자동 조정 전송 버퍼 |
| net.inet.tcp.rfc1323 |
0(비활성화) |
TCP 창 크기 조정 |
현재 macOS 설정(macOS 12-15 Monterey - Sequoia)
| 매개변수 |
현재 권장값 |
설명 |
| kern.ipc.maxsockbuf |
8388608(8MB) |
최대 소켓 버퍼 크기 |
| net.inet.tcp.sendspace |
131072(128KB) |
기본 TCP 전송 버퍼 |
| net.inet.tcp.recvspace |
131072(128KB) |
기본 TCP 수신 버퍼 |
| net.inet.tcp.autorcvbufmax |
16777216(16MB) |
최대 자동 조정 수신 버퍼 |
| net.inet.tcp.autosndbufmax |
16777216(16MB) |
최대 자동 조정 전송 버퍼 |
| net.inet.tcp.rfc1323 |
1(활성화) |
TCP 창 크기 조정 활성화 |
| net.inet.tcp.sack |
1(활성화) |
선택적 승인 활성화 |
| net.inet.tcp.mssdflt |
1440 |
기본 TCP 최대 세그먼트 크기 |
| net.inet.tcp.delayed_ack |
3 |
지연된 ACK 동작 |
macOS 구성 애플리케이션
# Check current settings
sysctl kern.ipc.maxsockbuf
sysctl net.inet.tcp.sendspace
sysctl net.inet.tcp.recvspace
sysctl net.inet.tcp.autorcvbufmax
sysctl net.inet.tcp.autosndbufmax
# Apply settings temporarily (until reboot)
sudo sysctl -w kern.ipc.maxsockbuf=8388608
sudo sysctl -w net.inet.tcp.sendspace=131072
sudo sysctl -w net.inet.tcp.recvspace=131072
sudo sysctl -w net.inet.tcp.autorcvbufmax=16777216
sudo sysctl -w net.inet.tcp.autosndbufmax=16777216
sudo sysctl -w net.inet.tcp.rfc1323=1
sudo sysctl -w net.inet.tcp.sack=1
# Make settings persistent (create /etc/sysctl.conf)
sudo tee /etc/sysctl.conf <<EOF
kern.ipc.maxsockbuf=8388608
net.inet.tcp.sendspace=131072
net.inet.tcp.recvspace=131072
net.inet.tcp.autorcvbufmax=16777216
net.inet.tcp.autosndbufmax=16777216
net.inet.tcp.rfc1323=1
net.inet.tcp.sack=1
net.inet.tcp.mssdflt=1440
net.inet.tcp.delayed_ack=3
EOF
# Note: On recent macOS versions, /etc/sysctl.conf may not be read automatically
# Use a LaunchDaemon to apply settings at boot
영구 설정을 위한 LaunchDaemon 생성
# Create /Library/LaunchDaemons/com.local.sysctl.plist
sudo tee /Library/LaunchDaemons/com.local.sysctl.plist <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.local.sysctl</string>
<key>ProgramArguments</key>
<array>
<string>/usr/sbin/sysctl</string>
<string>-w</string>
<string>kern.ipc.maxsockbuf=8388608</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
EOF
sudo chmod 644 /Library/LaunchDaemons/com.local.sysctl.plist
sudo launchctl load /Library/LaunchDaemons/com.local.sysctl.plist
경고:macOS Ventura(13) 이상에는 SIP(시스템 무결성 보호) 제한이 있습니다. 일부 커널 매개변수는 sudo를 사용해도 수정이 불가능할 수 있습니다. 특정 환경에서 설정을 테스트합니다.
성능 테스트 및 검증
버퍼 성능 테스트 도구
iperf3 - 네트워크 성능 테스트
# Server side
iperf3 -s
# Client side - test TCP throughput
iperf3 -c server_ip -t 60 -i 5 -w 16M
# Test with multiple parallel streams
iperf3 -c server_ip -P 10 -t 60
# Test UDP performance
iperf3 -c server_ip -u -b 1000M -t 60
tcpdump - TCP 창 크기 캡처
# Capture and display TCP window sizes
tcpdump -i any -n 'tcp' -vv | grep -i window
# Save capture for Wireshark analysis
tcpdump -i any -w /tmp/capture.pcap 'tcp port 443'
Wireshark 분석
버퍼 문제에 대한 다음 지표를 찾으십시오.
- TCP 제로 윈도우 메시지
- TCP 창 업데이트 패킷
- TCP 창 전체 알림
- 낮은 RTT로 높은 재전송 속도
시스템 모니터링
# Linux - Monitor network buffer statistics
watch -n 1 'cat /proc/net/sockstat'
watch -n 1 'ss -tm | grep -i mem'
# Check for drops
netstat -s | grep -i drop
# Windows - Monitor TCP statistics
netstat -e 1
# macOS - Monitor network statistics
netstat -s -p tcp
대역폭 지연 곱(BDP) 계산
네트워크에 대한 최적의 버퍼 크기를 결정하려면 대역폭-지연 곱을 계산하십시오.
BDP = Bandwidth (bits/sec) × RTT (seconds)
Example for 10 Gigabit Ethernet with 50ms RTT:
BDP = 10,000,000,000 × 0.050 = 500,000,000 bits = 62.5 MB
Buffer Size = BDP × 2 (for bidirectional traffic and headroom)
Buffer Size = 62.5 MB × 2 = 125 MB
This is why modern settings recommend 128MB maximum buffers.
워크로드별 권장 사항
| 워크로드 유형 |
권장 버퍼 크기 |
주요 매개변수 |
| 웹 서버(낮은 대기 시간) |
4~16MB |
더 낮은 버퍼, 더 많은 연결, 빠른 응답 |
| 데이터베이스 서버 |
16-32MB |
적당한 버퍼, 일관된 처리량 |
| 파일 전송/백업 |
64-128MB |
최대 버퍼, 높은 처리량 우선순위 |
| 비디오 스트리밍 |
32-64MB |
대규모 버퍼, 일관된 전달 속도 |
| HPC/데이터센터 |
128-256MB |
최대 버퍼, 전문적인 혼잡 제어 |
| 무선/모바일 |
2~8MB |
보수적인 버퍼, 가변 대기 시간 처리 |
일반적인 실수와 함정
피해야 할 실수
-
오버버퍼링:버퍼가 지나치게 크면 버퍼블로트가 발생하여 대기 시간이 길어질 수 있습니다.
-
메모리 제약 무시:대형 버퍼는 연결 수를 곱합니다. 10,000개의 연결과 128MB 버퍼를 갖춘 서버에는 1.25TB의 RAM이 필요합니다.
-
이유 없이 자동 튜닝을 비활성화하는 경우:최신 OS 자동 조정은 일반적으로 정적 설정보다 낫습니다.
-
변경 후 테스트하지 않음:실제 워크로드를 통해 항상 성능 개선을 검증하세요.
-
NIC 버퍼를 잊어버리는 중:링 버퍼 고갈은 소켓 버퍼와 독립적으로 발생할 수 있습니다.
-
일관되지 않은 설정:클라이언트와 서버는 호환 가능한 버퍼 구성을 가지고 있어야 합니다.
-
혼잡 제어 무시:BBR 및 CUBIC은 이전 알고리즘보다 훨씬 우수합니다.
문제 해결 워크플로
-
기준선 설정:iperf3 또는 유사한 도구를 사용하여 현재 성능 측정
-
패킷 캡처:tcpdump/Wireshark를 사용하여 TCP 창 동작 식별
-
시스템 통계를 확인하세요.삭제, 버퍼 고갈, 재전송을 찾습니다.
-
BDP 계산:이론적으로 최적의 버퍼 크기 결정
-
증분 변경 사항을 적용합니다.한꺼번에 모든 것을 바꾸지 마세요
-
테스트 및 검증:실제 성능 개선 측정
-
시간 경과에 따른 모니터링:다양한 부하에서 설정이 최적으로 유지되도록 보장
참고자료 및 추가 자료
- RFC 1323 - 고성능을 위한 TCP 확장(창 크기 조정)
- RFC 2018 - TCP 선택적 승인 옵션
- RFC 6928 - TCP의 초기 창 늘리기
- RFC 8312 - CUBIC 혼잡 제어 알고리즘
- BBR 혼잡 제어(Google) - https://research.google/pubs/pub45646/
- Linux 커널 문서 -네트워킹/ip-sysctl.txt
- Windows TCP/IP 성능 조정 가이드(Microsoft)
- ESnet 네트워크 튜닝 가이드 - https://fasterdata.es.net/
결론
버퍼 고갈은 네트워크와 관련된 것으로 보이는 성능 문제의 일반적인 근본 원인입니다. 네트워크 엔지니어는 2009년의 128KB 제한에서 현재의 128MB 용량으로의 버퍼 크기 변화를 이해함으로써 이러한 문제를 신속하게 식별하고 해결할 수 있습니다.
주요 내용:
- 최신 시스템에는 레거시(2009) 구성보다 훨씬 더 큰 버퍼가 필요합니다.
- 항상 특정 네트워크 조건에 맞게 BDP를 계산하세요.
- 가능한 경우 OS 자동 조정 기능 사용(Windows, 최신 Linux)
- 변경 사항을 확인하기 위한 모니터링 및 테스트
- 튜닝 시 워크로드별 요구 사항 고려
기억하세요: TCP 0 창을 표시하기 위해 패킷 분석을 통해 밝혀진 "네트워크 문제"는 실제로 호스트 시스템 리소스 문제입니다. 적절한 버퍼 조정을 통해 이러한 잘못된 진단을 제거하고 최적의 성능을 얻을 수 있습니다.
최종 업데이트: 2026년 2월 2일
작성자: Baud9600 기술팀