Отключаем Recieve Window Auto-Tuning в Windows 7/Server 2008
Несколько лет назад, работая в IT отделе одной компании, столкнулся я с одной проблемой. Заключалась она в невозможности копирования по сети файлов большого размера. При попытке скопировать\перенести файл размером больше 100 МБ процесс намертво вставал, иногда вешая всю систему. Причем, что самое неприятное, проблема проявлялась периодически на разных компьютерах и локализовать ее не удавалось.
В тот раз решить проблему так и не удалось. Через некоторое время она ушла сама, так же неожиданно, как и появилась, и о ней благополучно забыли. И вот, по прошествии некоторого количества лет (и смены нескольких мест работы) я снова увидел знакомые симптомы. Но на сей раз все же удалось раскопать причину подобного поведения.
Дело в том, что в новой версии набора протоколов TCP/IP для Windows 7\Server 2008 была реализована функция TCP Receive Window Auto-Tuning — автоматическая настройка окна приема TCP. Теоретически эта функция предназначена для оптимизации пропускной способности и улучшения работы сети, а практически является причиной множества проблем.
Окно приема TCP используется для ограничения потока данных и для обеспечения возможности контроля потока на принимающей стороне. Окно TCP представляет собой объем данных, который получатель разрешает отправлять за один прием. То есть, чем больше окно, тем лучше работа в сетях с высокой пропускной способностью.
Для TCP/IP в Windows XP\Server 2003 максимальный размер окна приема фиксирован и по умолчению составляет 64КБ. В Windows 7\Server 2008 оптимальный размер окна приема определяется динамически. Для этого измеряется пропускная способности канала и скорость извлечения приложением данных из окна приема, после чего размер окна адаптируется в соответствии с этими параметрами. Автотюнинг использует масштабирование окна TCP, благодаря чему максимальный размер окна приема составляет 16 МБ.
В идеале при включении автотюнинга передача данных по сети должна стать более эффективной. Однако не всё так просто. Например, приложение не успевает извлекать данные, текущее окно приема заполняется и принимающий узел начинает уменьшать его размер. При заполнении максимального окна приема размер текущего окна уменьшается до 0 байт, после чего передача данных прекратится.
Как я уже говорил, проблему с автотюнингом очень сложно локализовать. Поэтому, при наличии неопределенных проблем с сетевыми подключениями в первую очередь смотрим настройки TCP. Сделать это можно из командной строки (с повышенными привилегиями) командой:
1 |
netsh interface tcp show global |
Здесь нас интересует параметр ″Уровень автонастройки окна получения″ (англ. Receive Window Auto-Tuning Level). Он может принимать значения:
• disabled — автотюнинг выключен, используется фиксированное значение размера приемного окна TCP — 64KB;
• higlyrestricted — позволяет размеру приемного окна выходить за пределы значения по умолчанию, очень ограниченно превышая его;
• restricted — допускает более существенный рост размера окна относительно значения по умолчанию;
• normal — по умолчанию. Позволяет менять размер окна в зависимости от различных условий работы;
• experimental — позволяет увеличивать размер окна до очень больших значений. Следует применять очень осторожно.
Можно попробовать подобрать нужный уровень, например попробовать higlyrestricted, а если не помогает, то отключить:
1 |
netsh interface tcp set global autotuninglevel=disabled |
После изменения настройки компьютер следует перезагрузить.
Проблема с автотюнингом присутствует в операционных системах Windows Vista, Windows 7, Windows Server 2008 и 2008 R2. По Windows 8 и Server 2012 пока данных нет, хотя автотюнинг в них есть и используется. Возможно всплывет позже