System Buffer Tuning - TCP and Network Performance Optimization

מערכת Buffer Tuning: The Hidden Culprit מאחורי "בעיות רשת"

סיכום Executive

מהנדסי רשת נתקלים לעתים קרובות במצבים שבהם הביצועים של TCP או היישום הואשם על תשתיות רשת. לאחר ביצוע לכידת חבילה נרחבת, tcpdumps, וניתוח רשת, צוואר הבקבוק האמיתי מתגלה לעתים קרובות: מותש NIC (כרטיס ממשק רשת) או מציצים ברמה של מערכת הלקוח או השרת.

מאמר זה מספק את המורשת (Crca 2009) ואת הנוכחי (2025-2026) buffer תצורה עבור לינוקס, Windows ו- MacOS, יחד עם טכניקות אבחון כדי לזהות buffer exhaustion לפני שהוא הופך לבעיה קריטית.

סימפטומים נפוצים של Buffer Exhaustion

  • TCP Zero Window Events
  • שיעורי הסגירה גבוהים למרות שקיפות רשת נמוכה
  • יישום באמצעות חישוב באופן משמעותי מתחת רוחב פס זמין
  • ירידה בביצוע תחת עומס משתפרת כאשר העומס יורד
  • ביצועים עקביים על פני הגדרות חומרה דומות
  • שגיאות Socket או הודעות "Resource בלתי זמינות באופן זמני"

להבין את הבעיה

חלון TCP Scaling Mechanism

TCP משתמש במנגנון בקרת זרימה שבו המקלט מפרסם "גודל חלון" המציין כמה נתונים הוא יכול לקבל. כשהמערכת מתמלאת, החלון מתכווץ לאפס, ומאלץ את השולח להמתין. זה נראה כמו בעיה ברשת אבל הוא למעשה נושא משאבים מארח.

איפה Buffers Matter

  • Socket Buffers (SO SNDBUF/SO RCVBUF): Per-socket Send and Get Buffers
  • חלון TCP Buffers: גודל חלון TCP מקסימלי לחיבורים
  • מכשיר רשת Buffers: NIC Ring Buffers For Pack
  • זיכרון מערכתי: זיכרון כללי שהוקצה לרשתות

פקודות אבחון

לינוקס אבחון

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

# 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

לינוקס Buffer Tuning

Legacy Linux Settings (Circa 2009)

Parameter ערך מורשת (2009) תיאור תיאור
רשת.core.rmem default 124928 (122KB) Default Get Socket buffer size
רשת.core.rmem max 131071 (128KB) כמות מקסימלית של buffer
שם הסרטון: net.core.wmem default 124928 (122KB) Default Send Socket buffer size
רשת.core.wmem max 131071 (128KB) המונחים: buffer size
Net.ipv4.tcp rmem 4096 87380 174760 TCP מקבל buffer: דקות, ברירת מחדל, מקס (בעמודים)
Net.ipv4.tcp wmem 4096 16384 131072 TCP שולח buffer: דקות, ברירת מחדל, מקס (בעמודים)
Net.ipv4.tcp mem 1966 262144 393216 דפי זיכרון TCP: נמוך, לחץ, גבוה
רשת.core.netdev max backlog 1000 חבילות מקסימליות בתור קלט
רשת.core.optmem max 10240 (10KB) גודל buffer מקסימלי ל socket

הגדרות לינוקס נוכחיות (2025-2026)

Parameter ערך מוסף Description
net.core.rmem_default 16777216 (16MB) Default receive socket buffer size
net.core.rmem_max 1342177 (128MB) Maximum receive socket buffer size
net.core.wmem_default 16777216 (16MB) Default send socket buffer size
net.core.wmem_max 134217728 (128MB) Maximum send socket buffer size
net.ipv4.tcp_rmem 4096 87380 1342177 TCP מקבל buffer: דקות, ברירת מחדל, מקס (128MB max)
net.ipv4.tcp_wmem 4096 65536 1342177 TCP שולח buffer: Min, ברירת מחדל, max (128MB max)
net.ipv4.tcp_mem 8388608 12582912 16777216 דפי זיכרון TCP: נמוך, לחץ, גבוה (64GB)
net.core.netdev_max_backlog 250000 חבילות מקסימליות בתור קלט (10GbE+)
net.core.optmem_max 65536 (64KB) Maximum ancillary buffer size per socket
Net.ipv4.tcp congestion שליטה bbr שימוש ב-BBR congestion control (אלגוריתם של Google)
Net.ipv4.tcp window scaling 1 1 חלון TCP מדרג (RFC 1323)
Web.ipv4.tcp timestamps 1 TCP Timestamps for Better RTT estimation
Net.ipv4.tcp sack 1 תגית: Ac Knowledgment
Net.ipv4.tcp no metrics save 1 המונחים: TCP metrics

יישום לינוקס

הוסף הגדרות אלה /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 Ring Buffer Tuning

# 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 (256MB עם 128MB)
  • השפעת המערכת הכוללת: 1,000 חיבורים × 256MB = 256GB פוטנציאל השימוש
  • הערכה בטוחה: חיבורים × 256MB לא יעלה על 50% מהמערכת
  • דוגמה: שרת 64GB צריכה להגביל חיבורים מקסיים ל -125 חיבורים בתפוקה גבוהה במקביל עם 128MB
  • המלצה לשרתים עם <16GB RAM: להפחית Buffers ל 16-32MB max ולהתאים tcp mem באופן יחסי

Windows Buffer Tuning

Legacy Windows Settings (Circa 2009 - Windows Vista/7/Server Server 2008)

Parameter Legacy Value (2009) מיקום Location
TcpWindowsize 65535 (64KB) המונחים: HKLM\System\CurrentControlSet\Services\Tcpip\Parameters
Tcp1323Opts 0 (disabled) החלפת חלונות עם מוגבלויות כברירת מחדל
Default ReceiveWindow 8198 (8KB) Default מקבל חלון
DefaultsendWindow 8192 (8KB) שלח חלון
GlobalMaxTcpWindowsize 65535 (64KB) גודל חלון TCP
TcpNumconnections 16777214 חיבורי TCP

הגדרות Windows נוכחיות (Windows 10/11/Server 2019-2025)

חלונות מודרניים משתמשים עקבו אחרי Window Auto-Tuning תכונה, אשר להסתגל דינמי מקבל buffers מבוסס על תנאי רשת.

תכונות המונחים Description
רמה אוטומטית רגיל (או ניסיוני ביותר עבור 10GbE+) דינמי מקבל תיקון חלון
קבלה-Side Scaling (RSS) זמין עיבוד רשתות Distribute ברחבי CPUs
Chimney Offload אוטומטי (או נכה על NICs מודרניים) TCP Offload to NIC חומרה
NetDMA מוגבלות גישה לזיכרון (Deprecated)
TCP Global Parameters ראה הוראות למטה הגדרות TCP
ספק CUBIC (או NewReno Fallback) אלגוריתם בקרת TCP

Windows Configuration Commands

# 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

Advanced NIC Buffer Settings (באמצעות מנהל ההתקן או ה- PowerPoint)

# 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

רישום Tweaks (מתקדמים - שימוש ב Caution)

# 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 Buffer Tuning

Legacy macOS Settings (Circa 2009 - Mac OS X 10.5/10.6)

Parameter Legacy Value (2009) Description
גרעין:maxsockbuf 262144 (256KB) buffer size
רשת.inet.tcp.sendspace 32768 (32KB) Default TCP שלח buffer
המונחים: net.inet.tcvspace 32768 (32KB) Default TCP מקבל buffer
net.inet.tcp.autorcvbufmax 131072 (128KB) מקסימום אוטומטי מותאם מקבל buffer
net.inet.tcp.autosndbufmax 131072 (128KB) משלוח buffer
Net.inet.tcp.rfc1323 0 (disabled) חלון TCP מדרג

הגדרות macOS נוכחיות (macOS 12-15 Monterey through Sequoia)

Parameter Current Recommended Value Description
kern.ipc.maxsockbuf 8388608 (8MB) Maximum socket buffer size
net.inet.tcp.sendspace 131072 (128KB) Default TCP send buffer
net.inet.tcp.recvspace 131072 (128KB) Default TCP receive buffer
net.inet.tcp.autorcvbufmax 16777216 (16MB) Maximum auto-tuned receive buffer
net.inet.tcp.autosndbufmax 16777216 (16MB) Maximum auto-tuned send buffer
net.inet.tcp.rfc1323 1 (enabled) חלון TCP מדרג
Net.inet.tcp.sack 1 (enabled) Enable Selective Acknowledgment
Net.inet.tcp.msdflt 1440 Default TCP המקסימום
net.inet.tcp.delayed ack 3 התנהגות ACK

macOS Configuration Application

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

יצירת שיגור DAemon עבור הגדרות עקביות

# Create /Library/LaunchDaemons/com.local.sysctl.plist
sudo tee /Library/LaunchDaemons/com.local.sysctl.plist <Labelcom.local.sysctlProgramArguments/usr/sbin/sysctl-wkern.ipc.maxsockbuf=8388608RunAtLoad
EOF

sudo chmod 644 /Library/LaunchDaemons/com.local.sysctl.plist
sudo launchctl load /Library/LaunchDaemons/com.local.sysctl.plist
אזהרה: macOS Ventura (13) ומאוחר יותר יש מגבלות הגנה על המערכת (SIP). חלק מהפרמטרים של הקרנל עשויים לא להיות ניתנים למדידה אפילו עם sudo. בדיקות הגדרות בסביבה הספציפית שלך.

בדיקות ביצועים ואימות

כלים לבדיקה בביצוע Buffer

Iper3 - Network Performance Testing

# 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

TCP Window Sizes

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

חפש את האינדיקטורים של בעיות buffer:

  • TCP Zero Window
  • TCP Window Update
  • וידאו: TCP Window Full
  • שיעורי תגמול גבוהים עם 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

Bandwidth-Delay Product (BDP) Calculation

כדי לקבוע גדלים אופטימליים עבור הרשת שלך, לחשב את המוצר Bandwidth-Delay:

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.

המלצות לעומס העבודה

עומס עבודה המונחים: Buffer Size המונחים: key Parameters
Web Server (Low latency) 4-16 MB תחתונים, יותר קשרים, תגובה מהירה
מסד הנתונים Server 16-32 MB Buffers מתון, עקבי דרךput
העברה / Backup 64-128 MB מקסימום Buffers, High Throughput
וידאו הזרמת 32-64 MB Buffers גדול, שיעור משלוח עקבי
HPC / Data Center 128-256 MB מקסימום Buffers, בקרת גודש מיוחד
Wireless / Mobile 2-8 MB שמרנים Buffers, טיפול בכבדות משתנה

טעויות נפוצות ומלכודות

טעויות להימנע

  • Over-buffering: כיפים גדולים מדי יכול לגרום bufferbloat, הגדלת latency
  • התעלמות ממגבלות הזיכרון: Buffers גדולים להכפיל על ידי ספירת חיבור; שרת עם 10,000 חיבורים 128MB Buffers צריך 1.25TB של RAM
  • כוונון אוטומטי ללא סיבה: כוונון רכב מודרני הוא בדרך כלל טוב יותר מאשר הגדרות סטטיות
  • לא בדיקות אחרי שינויים: תמיד לאמת שיפורים בביצועים עם עומסי עבודה אמיתיים
  • לשכוח את ה-NIC Buffers: buffer exhaustion יכול להתרחש באופן עצמאי של socket buffers
  • הגדרות לא עקביות: הלקוח והשרת צריכים להיות תצורה של buffer
  • התעלמות משליטה: BBR ו- CUBIC טובים משמעותית מאלגוריתמים מבוגרים יותר

פתרון זרימת עבודה

  1. המונחים: עקבו אחרי iperf3 or similar Tools
  2. לכידת חבילות: השתמש tcpdump/Wireshark כדי לזהות את התנהגות חלון TCP
  3. בדוק נתונים סטטיסטיים במערכת: חפש טיפות, buffer exhaustion, retransmissions
  4. חישוב BDP: Determine אופטימלית buffer גדלים
  5. החל שינויים מצטברים: אל תשנה הכל בבת אחת
  6. מבחן ואימות: שיפור ביצועים בפועל
  7. עקבו אחרי הזמן: להבטיח הגדרות להישאר אופטימליות תחת עומסים שונים

המלצות וקריאה נוספת

  • RFC 1323 - הרחבות TCP עבור ביצועים גבוהים (Window Scaling)
  • RFC 2018 - אפשרויות למניעת ידע
  • RFC 6928 - הגדלת החלון הראשון של TCP
  • RFC 8312 - CUBIC Communityestion Control Algorithm
  • BBRungestion Control (Google) - https.google/pubs/pub45646/pub45646
  • לינוקס Kernel Documentation - Network/ip-sysctl.txt
  • Windows TCP/IP Performance Tuning Guide (Microsoft)
  • ESnet Network Tuning Guide - google:fasterdata

מסקנה

Buffer exhaustion הוא גורם שורש משותף של בעיות ביצועים שנראים קשורים לרשת. על ידי הבנת האבולוציה של buffer ממגבלות 128KB של 2009 ליכולות של 128MB של היום, מהנדסי רשת יכולים לזהות במהירות ולפתור בעיות אלה.

המונחים:

  • מערכות מודרניות זקוקות לחיידקים גדולים יותר באופן משמעותי מאשר תצורה של מורשת (2009)
  • תמיד לחשב BDP עבור תנאי הרשת הספציפיים שלך
  • השתמש בתכונות הפעלה אוטומטי כאשר זמין (Windows, לינוקס מודרנית)
  • מעקב ומבחן כדי לאמת שינויים
  • שקול דרישות ספציפיות עומס עבודה בעת כוונון

זכור: "בעיה מבוססת" שנחשפה על ידי ניתוח חבילות כדי להראות ל-TCP אפס חלונות היא למעשה בעיה של משאב מערכת מארחת. עם כוונון מתאים, אתה יכול לחסל את האבחון המזויף הללו ולהשיג ביצועים אופטימליים.


עדכון אחרון: 2 בפברואר 2026

מקור: Baud9600 Technical Team