.. 제목: 시스템 버퍼 튜닝 - TCP 및 네트워크 성능 최적화 .. 슬러그: 시스템 버퍼 조정 .. 날짜: 2026-02-02 10:00:00 UTC .. 태그: 네트워킹, 성능, 조정, TCP, 버퍼 .. 카테고리: 기사 .. 링크: .. 설명: 네트워크 문제로 오인되는 경우가 많은 TCP 성능 문제를 해결하기 위한 시스템 버퍼 이해 및 최적화 .. 유형: 텍스트

시스템 버퍼 튜닝: "네트워크 문제"의 숨겨진 원인

요약

네트워크 엔지니어는 TCP 윈도우잉 또는 애플리케이션 성능이 네트워크 인프라 때문에 비난을 받는 상황에 자주 직면합니다. 광범위한 패킷 캡처, tcpdump 및 네트워크 분석을 수행한 후 실제 병목 현상이 발견되는 경우가 많습니다. 즉, 클라이언트 또는 서버 시스템의 NIC(네트워크 인터페이스 카드) 또는 OS 수준 버퍼가 소진된 것입니다.

이 문서에서는 Linux, Windows 및 macOS에 대한 레거시(2009년 경) 및 현재(2025~2026년) 버퍼 구성을 모두 제공하고 심각한 문제가 되기 전에 버퍼 소모를 식별하는 진단 기술을 제공합니다.

버퍼 고갈의 일반적인 증상

문제 이해

TCP 창 크기 조정 메커니즘

TCP는 수신자가 허용할 수 있는 데이터의 양을 나타내는 "창 크기"를 알리는 흐름 제어 메커니즘을 사용합니다. 시스템 버퍼가 가득 차면 이 창이 0으로 줄어들어 발신자가 기다려야 합니다. 이는 네트워크 문제로 보이지만 실제로는 호스트 리소스 문제입니다.

버퍼가 중요한 곳

진단 명령

Linux 진단

# 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"

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)에 있습니다. 버퍼 크기가 크면 심각한 메모리 압박이 발생할 수 있습니다.

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 분석

버퍼 문제에 대한 다음 지표를 찾으십시오.

시스템 모니터링

# 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 보수적인 버퍼, 가변 대기 시간 처리

일반적인 실수와 함정

피해야 할 실수

문제 해결 워크플로

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

참고자료 및 추가 자료

결론

버퍼 고갈은 네트워크와 관련된 것으로 보이는 성능 문제의 일반적인 근본 원인입니다. 네트워크 엔지니어는 2009년의 128KB 제한에서 현재의 128MB 용량으로의 버퍼 크기 변화를 이해함으로써 이러한 문제를 신속하게 식별하고 해결할 수 있습니다.

주요 내용:

기억하세요: TCP 0 창을 표시하기 위해 패킷 분석을 통해 밝혀진 "네트워크 문제"는 실제로 호스트 시스템 리소스 문제입니다. 적절한 버퍼 조정을 통해 이러한 잘못된 진단을 제거하고 최적의 성능을 얻을 수 있습니다.


최종 업데이트: 2026년 2월 2일

작성자: Baud9600 기술팀