System Buffer Tuning - TCP and Network Performance Optimization
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 г.)
| Параметър | Legacy Value (2009) | Описание |
|---|---|---|
| net.core.rmem_default | 124928 (122KB) | Размер на буфера на сокета за получаване по подразбиране |
| net.core.rmem_max | 131071 (128KB) | Максимален размер на буфера на сокета за получаване |
| net.core.wmem_default | 124928 (122KB) | Размер на буфера на гнездото за изпращане по подразбиране |
| net.core.wmem_max | 131071 (128KB) | Максимален размер на буфера на гнездото за изпращане |
| net.ipv4.tcp_rmem | 4096 87380 174760 | TCP буфер за получаване: мин., по подразбиране, макс. (в байтове) |
| net.ipv4.tcp_wmem | 4096 16384 131072 | TCP буфер за изпращане: min, default, max (в байтове) |
| 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) | Размер на буфера на сокета за получаване по подразбиране |
| net.core.rmem_max | 134217728 (128MB) | Максимален размер на буфера на сокета за получаване |
| net.core.wmem_default | 16777216 (16MB) | Размер на буфера на сокета за изпращане по подразбиране |
| net.core.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 | Активирайте TCP клеймото за време за по-добра RTT оценка |
| 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 Ring Buffer Настройка
# 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
- Памет за всяка връзка:Всяка връзка може да използва до rmem_max + wmem_max (256MB със 128MB буфери)
- Общо въздействие върху системата:1000 връзки × 256MB = 256GB потенциално използване
- Безопасна оценка:Максималните едновременни връзки × 256MB не трябва да надвишават 50% от системната RAM
- Пример:64GB сървър трябва да ограничи максималните връзки до ~125 едновременни връзки с висока пропускателна способност със 128MB буфери
- Препоръка за сървъри с <16GB RAM:Намалете буферите до 16-32MB максимум и коригирайте tcp_mem пропорционално
Настройка на буфера на Windows
Наследени настройки на Windows (около 2009 г. - Windows Vista/7/Server 2008)
| Параметър | Legacy Value (2009) | Местоположение |
|---|---|---|
| TcpWindowSize | 65535 (64KB) | Регистър: HKLM\System\CurrentControlSet\Services\Tcpip\Parameters |
| Tcp1323Opts | 0 (забранено) | Мащабирането на прозореца е деактивирано по подразбиране |
| DefaultReceiveWindow | 8192 (8KB) | Прозорец за получаване по подразбиране |
| DefaultSendWindow | 8192 (8KB) | Прозорец за изпращане по подразбиране |
| GlobalMaxTcpWindowSize | 65535 (64KB) | Максимален размер на TCP прозореца |
| TcpNumConnections | 16777214 | Максимален брой TCP връзки |
Текущи настройки на Windows (Windows 10/11/Server 2019-2025)
Съвременният Windows използваПолучаване на автоматична настройка на прозорецафункция, която динамично настройва буферите за получаване въз основа на мрежовите условия.
| Характеристика | Текуща препоръчителна настройка | Описание |
|---|---|---|
| Ниво на автоматична настройка | нормално (или силно експериментално за 10GbE+) | Динамично регулиране на прозореца за получаване |
| Мащабиране от страна на приемане (RSS) | активиран | Разпределете мрежовата обработка между процесорите |
| Разтоварване на комина | автоматично (или деактивирано на съвременните мрежови карти) | TCP разтоварване към NIC хардуер |
| 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 буфера (чрез Device Manager или 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)
Настройка на буфера на macOS
Наследени настройки на macOS (около 2009 г. - Mac OS X 10.5/10.6)
| Параметър | Legacy Value (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
Тестване и валидиране на ефективността
Инструменти за тестване на производителността на буфера
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 Zero Window
- Пакети за актуализиране на TCP прозорец
- TCP Window Full notifications
- Високи скорости на препредаване с нисък 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-16 MB | По-ниски буфери, повече връзки, бърз отговор |
| Сървър за база данни | 16-32 MB | Умерени буфери, постоянна производителност |
| Прехвърляне на файлове / архивиране | 64-128 MB | Максимални буфери, висок приоритет на пропускателната способност |
| Видео поточно предаване | 32-64 MB | Големи буфери, постоянна скорост на доставка |
| HPC / център за данни | 128-256 MB | Максимални буфери, специализиран контрол на задръстванията |
| Безжичен/мобилен | 2-8 MB | Консервативни буфери, обработка с променлива латентност |
Често срещани грешки и клопки
Грешки, които трябва да се избягват
- Свръхбуфериране:Прекалено големите буфери могат да причинят раздуване на буфера, увеличавайки латентността
- Игнориране на ограниченията на паметта:Големите буфери се умножават по броя на връзките; сървър с 10 000 връзки и 128MB буфери се нуждае от 1,25TB RAM
- Деактивиране на автоматичната настройка без причина:Автоматичната настройка на съвременната ОС обикновено е по-добра от статичните настройки
- Не се тества след промени:Винаги проверявайте подобренията в производителността с реални натоварвания
- Забравяне на NIC буфери:Изчерпването на пръстенния буфер може да възникне независимо от буферите на сокета
- Непоследователни настройки:Клиентът и сървърът трябва да имат съвместими буферни конфигурации
- Пренебрегване на контрола на задръстванията:BBR и CUBIC са значително по-добри от по-старите алгоритми
Работен процес за отстраняване на неизправности
- Установете базовата линия:Измерете текущата производителност с iperf3 или подобни инструменти
- Улавяне на пакети:Използвайте tcpdump/Wireshark, за да идентифицирате поведението на TCP прозореца
- Проверете системната статистика:Потърсете спадове, изчерпване на буфера, препредаване
- Изчислете BDP:Определете теоретично оптималните размери на буфера
- Прилагане на постепенни промени:Не променяйте всичко наведнъж
- Тествайте и валидирайте:Измерете действителното подобрение на производителността
- Наблюдение във времето:Уверете се, че настройките остават оптимални при различни натоварвания
Препратки и допълнителна литература
- RFC 1323 - TCP разширения за висока производителност (мащабиране на прозорци)
- RFC 2018 - Опции за селективно потвърждение на TCP
- RFC 6928 - Увеличаване на началния прозорец на TCP
- RFC 8312 - Алгоритъм за контрол на задръстванията CUBIC
- BBR Congestion Control (Google) – https://research.google/pubs/pub45646/
- Документация на ядрото на Linux - networking/ip-sysctl.txt
- Windows TCP/IP Ръководство за настройка на производителността (Microsoft)
- Ръководство за настройка на мрежата на ESnet - https://fasterdata.es.net/
Заключение
Изчерпването на буфера е често срещана основна причина за проблеми с производителността, които изглежда са свързани с мрежата. Като разбират еволюцията на оразмеряването на буфера от ограниченията от 128 KB от 2009 г. до днешните възможности от 128 MB, мрежовите инженери могат бързо да идентифицират и разрешат тези проблеми.
Ключови изводи:
- Съвременните системи се нуждаят от значително по-големи буфери от наследените (2009) конфигурации
- Винаги изчислявайте BDP за вашите специфични мрежови условия
- Използвайте функциите за автоматична настройка на ОС, когато са налични (Windows, модерен Linux)
- Наблюдавайте и тествайте, за да потвърдите промените
- Помислете за специфичните за натоварването изисквания, когато настройвате
Запомнете: "мрежов проблем", разкрит чрез анализ на пакети, за да покаже нулеви TCP прозорци, всъщност е проблем с ресурсите на хост системата. С подходяща настройка на буфера можете да елиминирате тези фалшиви диагнози и да постигнете оптимална производителност.
Последна актуализация: 2 февруари 2026 г
Автор: Технически екип на Baud9600