.. 제목: 시스템 버퍼 튜닝 - TCP 및 네트워크 성능 최적화 .. 슬러그: 시스템 버퍼 조정 .. 날짜: 2026-02-02 10:00:00 UTC .. 태그: 네트워킹, 성능, 조정, TCP, 버퍼 .. 카테고리: 기사 .. 링크: .. 설명: 네트워크 문제로 오인되는 경우가 많은 TCP 성능 문제를 해결하기 위한 시스템 버퍼 이해 및 최적화 .. 유형: 텍스트
네트워크 엔지니어는 TCP 윈도우잉 또는 애플리케이션 성능이 네트워크 인프라 때문에 비난을 받는 상황에 자주 직면합니다. 광범위한 패킷 캡처, tcpdump 및 네트워크 분석을 수행한 후 실제 병목 현상이 발견되는 경우가 많습니다. 즉, 클라이언트 또는 서버 시스템의 NIC(네트워크 인터페이스 카드) 또는 OS 수준 버퍼가 소진된 것입니다.
이 문서에서는 Linux, Windows 및 macOS에 대한 레거시(2009년 경) 및 현재(2025~2026년) 버퍼 구성을 모두 제공하고 심각한 문제가 되기 전에 버퍼 소모를 식별하는 진단 기술을 제공합니다.
TCP는 수신자가 허용할 수 있는 데이터의 양을 나타내는 "창 크기"를 알리는 흐름 제어 메커니즘을 사용합니다. 시스템 버퍼가 가득 차면 이 창이 0으로 줄어들어 발신자가 기다려야 합니다. 이는 네트워크 문제로 보이지만 실제로는 호스트 리소스 문제입니다.
# Check current TCP buffer settings sysctl net.ipv4.tcp_rmem sysctl net.ipv4.tcp_wmem sysctl net.core.rmem_max sysctl net.core.wmem_max # 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"
# 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"
# 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
| 매개변수 | 레거시 가치 (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) | 소켓당 최대 보조 버퍼 크기 |
| 매개변수 | 현재 권장값 | 설명 |
|---|---|---|
| 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 지표 캐싱 비활성화 |
다음 설정을 추가하세요./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
# 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
| 매개변수 | 레거시 가치 (2009) | 위치 |
|---|---|---|
| Tcp창 크기 | 65535(64KB) | 레지스트리: HKLM\System\CurrentControlSet\Services\Tcpip\Parameters |
| Tcp1323선택 | 0(비활성화) | 기본적으로 창 크기 조정이 비활성화되어 있습니다. |
| 기본수신창 | 8192(8KB) | 기본 수신 창 |
| 기본보내기창 | 8192(8KB) | 기본 전송 창 |
| GlobalMaxTcpWindowSize | 65535(64KB) | 최대 TCP 창 크기 |
| TcpNumConnections | 16777214 | 최대 TCP 연결 |
최신 Windows에서는 다음을 사용합니다.창 자동 조정 수신네트워크 상태에 따라 수신 버퍼를 동적으로 조정하는 기능입니다.
| 특징 | 현재 권장 설정 | 설명 |
|---|---|---|
| 자동 튜닝 수준 | 일반(또는 10GbE+의 경우 매우 실험적) | 동적 수신 창 조정 |
| 수신측 배율(RSS) | 활성화됨 | CPU 전체에 네트워크 처리 분산 |
| 굴뚝 오프로드 | 자동(또는 최신 NIC에서는 비활성화됨) | NIC 하드웨어로 TCP 오프로드 |
| NetDMA | 장애가 있는 | 직접 메모리 액세스(더 이상 사용되지 않음) |
| TCP 전역 매개변수 | 아래 명령을 참조하세요 | 시스템 전체 TCP 설정 |
| 혼잡 제공자 | CUBIC(또는 NewReno 폴백) | TCP 혼잡 제어 알고리즘 |
# 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
# 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)
| 매개변수 | 레거시 가치 (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 창 크기 조정 |
| 매개변수 | 현재 권장값 | 설명 |
|---|---|---|
| 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 동작 |
# 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
# 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
# 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
# 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'
버퍼 문제에 대한 다음 지표를 찾으십시오.
# 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 = 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 | 보수적인 버퍼, 가변 대기 시간 처리 |
버퍼 고갈은 네트워크와 관련된 것으로 보이는 성능 문제의 일반적인 근본 원인입니다. 네트워크 엔지니어는 2009년의 128KB 제한에서 현재의 128MB 용량으로의 버퍼 크기 변화를 이해함으로써 이러한 문제를 신속하게 식별하고 해결할 수 있습니다.
주요 내용:
기억하세요: TCP 0 창을 표시하기 위해 패킷 분석을 통해 밝혀진 "네트워크 문제"는 실제로 호스트 시스템 리소스 문제입니다. 적절한 버퍼 조정을 통해 이러한 잘못된 진단을 제거하고 최적의 성능을 얻을 수 있습니다.
최종 업데이트: 2026년 2월 2일
작성자: Baud9600 기술팀