System Buffer Tuning - TCP and Network Performance Optimization

# 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은 이전 알고리즘보다 훨씬 우수합니다.

문제 해결 워크플로

  1. 기준선 설정:iperf3 또는 유사한 도구를 사용하여 현재 성능 측정
  2. 패킷 캡처:tcpdump/Wireshark를 사용하여 TCP 창 동작 식별
  3. 시스템 통계를 확인하세요.삭제, 버퍼 고갈, 재전송을 찾습니다.
  4. BDP 계산:이론적으로 최적의 버퍼 크기 결정
  5. 증분 변경 사항을 적용합니다.한꺼번에 모든 것을 바꾸지 마세요
  6. 테스트 및 검증:실제 성능 개선 측정
  7. 시간 경과에 따른 모니터링:다양한 부하에서 설정이 최적으로 유지되도록 보장

참고자료 및 추가 자료

  • 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 기술팀