Оптимизация ОС под многопоточность

Moved Other
  • Тема создана для того чтобы пользователи делились информацией об оптимизации ОС для BAS-са.
    

    [Оптимизация TCP]
    Базовая архитектура поиска, которая направляет поиск по нескольким физическим разделам, использует порты TCP / IP и неблокирующие каналы NIO SocketChannels для подключения к поисковым системам. Эти соединения остаются открытыми в состоянии TIME_WAIT, пока операционная система не истечет их тайм-аут. Следовательно, в условиях большой нагрузки доступные порты на машине, на которой работает модуль маршрутизации, могут быть исчерпаны.
    На платформах Windows тайм-аут по умолчанию составляет 120 секунд, а максимальное количество портов составляет примерно 4000, в результате максимальная скорость составляет 33 соединения в секунду. Если ваш индекс имеет четыре раздела, для каждого поиска требуется четыре порта, что обеспечивает максимальную скорость запроса 8,3 запроса в секунду.
    Формула расчета:
    (максимальное количество портов / период ожидания) / количество разделов = максимальная скорость запроса
    Если эта скорость превышена, вы можете увидеть сбои, поскольку запас портов TCP / IP исчерпан. Симптомы включают снижение пропускной способности и ошибки, указывающие на сбой сетевых подключений. Вы можете диагностировать эту проблему, наблюдая за системой, пока она находится под нагрузкой, используя утилиту netstat, доступную в большинстве операционных систем.
    Чтобы избежать исчерпания портов и поддерживать высокую скорость соединения, уменьшите значение TIME_WAIT и увеличьте диапазон портов.
    Чтобы узнать сколько у вас запросов в очереди, пишем в cmd:

    netstat -na | find "FIN_WAIT_2" /C
    

    Если вы получите значение больше чем от 10, то у вас весят запросы в очереди.
    Для оптимизации tcp стека, выполняем ряд условий.
    Действия ниже делать на свой страх и риск!!!

    #Для Windows 10, Server 2016, Server 2019:

    netsh interface tcp set heuristics disabled
    netsh interface tcp set heuristics wsh=enabled
    netsh interface tcp set heuristics forcews=disabled
    netsh interface tcp set global rss=enabled
    netsh interface tcp set global autotuninglevel=normal   
    netsh interface tcp set global ecncapability=disabled
    netsh interface tcp set global timestamps=disabled
    netsh interface tcp set global initialrto=3000
    netsh interface tcp set global chimney=disabled 
    netsh interface tcp set global netdma=disabled 
    netsh interface tcp set global dca=disabled 
    netsh interface tcp set global rsc=disabled
    netsh interface tcp set global nonsackrttresiliency=disabled
    netsh interface tcp set global maxsynretransmissions=2
    netsh interface ip set global neighborcachelimit=4096 
    netsh interface ip set global defaultcurhoplimit=64 
    netsh interface ip set global taskoffload=enabled 
    netsh interface ip set global mediasenseeventlog=disabled
    netsh interface tcp set global prr=disabled
    netsh interface tcp set supplemental internet congestionprovider=dctcpnetsh 
    netsh interface tcp set supplemental datacenter congestionprovider=dctcp
    

    #Для Windows Server 2008, 2012, Windows 7, Windows 8

    netsh int tcp set security mpp=disabled
    netsh int tcp set security profiles=disabled
    netsh int tcp set global rss=enabled
    netsh int tcp set global chimney=disabled
    netsh int tcp set global netdma=disabled
    netsh int tcp set global dca=disabled
    netsh int tcp set global autotuninglevel=normal
    netsh int tcp set global ecncapability=disabled
    netsh interface tcp set global timestamps=disabled
    netsh interface tcp set global initialrto=3000
    netsh interface tcp set heuristics disabled
    netsh interface tcp set heuristics wsh=enabled
    netsh interface tcp set heuristics forcews=disabled
    netsh interface tcp set global rsc=disabled
    netsh interface tcp set global nonsackrttresiliency=disabled
    netsh interface tcp set global maxsynretransmissions=2
    netsh interface ip set global neighborcachelimit=4096 
    netsh interface ip set global defaultcurhoplimit=64 
    netsh interface ip set global taskoffload=enabled
    netsh interface ip set global neighborcachelimit=4096 
    netsh interface ip set global defaultcurhoplimit=64 
    netsh interface ip set global taskoffload=enabled 
    netsh interface ip set global mediasenseeventlog=disabled
    
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\Ndis\Parameters /f /v RssBaseCpu /t REG_DWORD /d 0
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\Ndis\Parameters /f /v MaxNumRssCpus /t REG_DWORD /d 8
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v TcpTimedWaitDelay /t REG_DWORD /d 30
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v TcpFinWait2Delay /t REG_DWORD /d 30
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v "Transmission Control Protocol" /t REG_DWORD /d 0
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v SynAttackProtect /t REG_DWORD /d 0
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v ArpCacheLife /t REG_DWORD /d 86400
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v ArpCacheMinReferencedLife /t REG_DWORD /d 3600
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v ArpCacheSize /t REG_DWORD /d 200
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v DefaultTTL /t REG_DWORD /d 64
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v DisableTaskOffload /t REG_DWORD /d 0
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v DnsOutstandingQueriesCount /t REG_DWORD /d 1000
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v DisableTcpChimneyOffload /t REG_DWORD /d 0
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v EnableICMPRedirect /t REG_DWORD /d 1
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v EnablePMTUBHDetect /t REG_DWORD /d 0
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v EnableWsd /t REG_DWORD /d 0
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v ForwardBroadcasts /t REG_DWORD /d 0
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v GlobalMaxTcpWindowSize /t REG_DWORD /d 524140
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v IPEnableRouter /t REG_DWORD /d 0
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v MaxUserPort /t REG_DWORD /d 65534
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v QualifyingDestinationThreshold /t REG_DWORD /d 3
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v SyncDomainWithMembership /t REG_DWORD /d 1
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v Tcp1323Opts /t REG_DWORD /d 1
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v UseDomainNameDevolution /t REG_DWORD /d 1
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v DisableMediaSenseEventLog /t REG_DWORD /d 1
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v DisableRss /t REG_DWORD /d 0
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v EnableAddrMaskReply /t REG_DWORD /d 0
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v EnableBcastArpReply /t REG_DWORD /d 0
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v EnableConnectionRateLimiting /t REG_DWORD /d 0
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v EnableIPAutoConfigurationLimits /t REG_DWORD /d 0
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v EnableTCPA /t REG_DWORD /d 1
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v StrictTimeWaitSeqCheck /t REG_DWORD /d 1
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v TCPMaxDataRetransmissions /t REG_DWORD /d 2
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v AllowUnqualifiedQuery /t REG_DWORD /d 1
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v EnableDca /t REG_DWORD /d 0
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v TcpUseRFC1122UrgentPointer /t REG_DWORD /d 1
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v TcpMaxDupAcks /t REG_DWORD /d 2
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v OverrideDefaultAddressSelection /t REG_DWORD /d 1
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v EnableTCPChimney /t REG_DWORD /d 1
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v EnablePMTUDiscovery /t REG_DWORD /d 1
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v EnableOffload /t REG_DWORD /d 1
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v EnableHeuristics /t REG_DWORD /d 0
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v DontAddDefaultGatewayDefault /t REG_DWORD /d 0
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v DeadGWDetectDefault /t REG_DWORD /d 1
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v TcpNumConnections /t REG_DWORD /d 0
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v MaxFreeTcbs  /t REG_DWORD /d 2000
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters /f /v MaxHashTableSize  /t REG_DWORD /d 65536
    

    Поднятия приоритетов:

    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\ServiceProvider /f /v LocalPriority /t REG_DWORD /d 499
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\ServiceProvider /f /v HostsPriority /t REG_DWORD /d 500
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\ServiceProvider /f /v DnsPriority /t REG_DWORD /d 2000
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\ServiceProvider /f /v NetbtPriority /t REG_DWORD /d 2001
    

    Настройка параметров интерфейса

    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters\Interfaces\<GUID> /f /v TcpACKFrequency /t REG_DWORD /d 1
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters\Interfaces\<GUID> /f /v TcpDelAckTicks /t REG_DWORD /d 0
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters\Interfaces\<GUID> /f /v TCPNoDelay /t REG_DWORD /d 1
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters\Interfaces\<GUID> /f /v PerformRouterDiscovery /t REG_DWORD /d 0
    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters\Interfaces\<GUID> /f /v InterfaceMetric /t REG_DWORD /d 0
    *<GUID> - замените на свой интерфейс который найдете, в реестре, по пути что в строке выше. Например: {DB6D12C1-35A4-4C81-B96E-F549D7297DF2}.  Айди интерфейса можно определить по IP адресу параметров внутри папки реестра.
    

    Отключаем лишнею фильтрацию (не безопасно если есть открытый доступ к серверу):

    reg.exe add HKLM\SYSTEM\CurrentControlSet\Control\Network /f /v FilterClasses /t REG_MULTI_SZ /d "ms_firewall_upper scheduler"
    

    Дополнительные параметры для Windows Server 2016/2019/Windows 10:

    netsh interface tcp set global pacingprofile=slowstart
    netsh interface tcp set global hystart=disabled
    netsh interface tcp set global fastopen=enabled
    

    Включение дополнительных настроек TCP/IP для Windows 10 через Powershell.exe

    Get-NetTCPSetting
    Get-NetOffloadGlobalSetting
    Get-Net6to4Configuration
    Get-NetIPv4Protocol
    Get-NetAdapterPowerManagement
    

    Для домашних серверов можно так же выключить защиту, которая по факту и сервер не защитит:

    netsh int tcp set security mpp=disabled
    netsh int tcp set security profiles=disabled
    

    Устанавливаем время жизни ARP кэша на минимум

    netsh interface ipv4 show interfaces - чтобы узнать айди интерфейса
    netsh interface ipv4 show interface <айди>
    netsh interface ipv4 set interface <айди> basereachable=3600000
    

    Отключаем протокол smb2 на Windows Server 20xx

    reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters /f /v SMB2 /t REG_DWORD /d 0
    

    Отключаем HomeGroup

    reg.exe add HKLM\SOFTWARE\Policies\Microsoft\Windows\HomeGroup /f /v DisableHomeGroup /t REG_DWORD /d 1
    

    Отключаем DNS multicasting (LLMNR)

    reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\DnsClient" /f /v EnableMulticast /t REG_DWORD /d 0
    

    Включаем UDP offloading (Windows Server 2016+)

    netsh int udp set global uro=enabled
    

    Сброс настроек:

    netsh winsock reset
    netsh int ip reset
    netsh int tcp reset
    

    Тесты TCP ограничений на разных Windows OS при работе BAS-се при стандартных параметрах:
    Windows 7: 33 запросов в секунду.
    Windows 10: 20 запросов в секунд.
    Windows Server 2008: 50 запросов в секунду.
    Windows Server 2012: 50 запросов в секунду.
    *Все значения тестов указаны при стандартных параметрах настроек tcp.

    Если вы нашли ошибку или с чем-то не согласны, напишите в топику.
    
  • @rsgmsk При сколько потоках возникает лимит? 500-1000?
    Проверил на 100+ ничего такого нет. Консоль вернул 0.

  • This post is deleted!
  • @FastSpace Зависит от кол-ва запросов. Я тещу на сафтах для накрутки пф. Там в среднем без оптимизации лимит достигает при 120 потоках. Опять же все зависит от сайтов. И шаблонах. И от ОС.

  • Вау, походу это пофиксило мою проблему с Already in use, закрепите где-то на форуме

  • чесн говоря и для 2012 r2 не до конца подходит, если запросов очень много то умирает. Очередь 2к на моем недопрокси сервер. Но для клиента норм.

  • спасибо. норм подборка.

    на винде 2019 нужно использовать

    netsh int tcp set supplemental Internet congestionprovider=none
    

    вместо

    netsh interface tcp set global congestionprovider=none
    

    ( иначе: Параметр congestionprovider можно задать с помощью команды "netsh int tcp set supplemental". Параметр задан неверно. )

    ну и похоже, что можно добавить

    netsh int tcp set global rsc=disabled
    Set-NetOffloadGlobalSetting -ReceiveSegmentCoalescing disabled
    netsh int tcp set heuristics forcews=disabled
    
    netsh int tcp set global maxsynretransmissions=2
    netsh int tcp set global nonsackrttresiliency=disable
    
    Set-NetTCPSetting -SettingName Internet -InitialCongestionWindow 10
    netsh int tcp set supplemental template=Internet icw=10
    
  • @oleg4ever netsh int tcp set supplemental template=Internet icw=10 Выбил ошибку Set supplemental command failed to update the specified template. The request is not supported.

  • уже 3-ий раз настраиваю tcp с подсказками с этой страницы.
    заметил таки ляп.

    вместо:

    netsh interface tcp set supplemental internet congestionprovider=dctcpnetsh
    

    надо

    netsh interface tcp set supplemental internet congestionprovider=dctcp
    
  • @rsgmsk said in Оптимизация ОС под многопоточность:

    Чтобы узнать сколько у вас запросов в очереди, пишем в cmd:

    А Если у меня 0 запросов в очереди, это хорошо или плохо?

  • Я вижу, что статья изменилась. Могу ошибаться, но старые настройки были лучше.

  • Небольшое замечание:

    Если на сервере работает BAS и один браузер с прокси, то открыто будет одно соединение(тунель) к прокси. К примеру, если запущено 50 браузеров - будет открыто 50 соединений, даже если во вкладке каждого браузера куча всякой сетевой активности.

    Смысла тюнить TCP/IP в этой ситуации я не вижу.

  • а может быть netstat -na | find "FIN_WAIT_2" /C большим из-за медленной прокси?

  • @nazar21015 said in Оптимизация ОС под многопоточность:

    а может быть netstat -na | find "FIN_WAIT_2" /C большим из-за медленной прокси?

    Если сервер с прокси не закрывает соединение, то соединение перейдет в этот статус и будет так висеть, пока не закроется по таймауту.

  • еще бы под линукс такую бы статейку)

  • @nazar21015 said in Оптимизация ОС под многопоточность:

    еще бы под линукс такую бы статейку)

    Там все сложно.

  • @sergerdn
    как же я благодарен разработчику не за сам бас, а что он работает на человеческом виндовсе, а не на этом красноглазом пингвине для квадратноголовых))

  • ModeratorM Moderator moved this topic from Off topic on