Здравствуйте! Не так давно обнаружил, что MS SQL сервер отправляет клиентам данные в пакетах размером не более 590 байт, создавая сильную фрагментацию, так как запросы обычно крупные, что отражено на скриншоте Wireshark:
Я пробовал менять опцию max packet size на 1500, но размер пакетов не изменился даже после перезагрузки сервера. Я попытался провести диагностику проблемы и вот что удалось выяснить:
Проблема не в MTU конечных компьютеров - везде значение стоит стандартное в 1500 байт.
На пути между сервером и клиентами нет оборудования с MTU меньше 1500 байт.
команда ping -l 1472 -f до любого клиента проходит успешно.
TCP-соединения устанавливаются с размером окна в 1024 байта (8192 бита).
В связи с этим вопрос - по каким причинам параметр max packet size может не влиять на размер сетевых пакетов, отсылаемых сервером? Мои идеи насчёт неверной настройки оборудования или ОС иссякли. Возможно, проблема в самом MSSQL сервере? Кто-нибудь сталкивался с подобным?
На сервере используется Windows Server 2008 R2 Enterprise.
Клиенты - Windows 7.
Ответ
Я нашёл причину этой фрагментации - это отключенная функция PMTU Discovery в Windows. Если она отключена, протокол TCP будет отправлять пакеты на любые адреса с MTU 576. Цитирую Майкрософт
Если отключить возможность определения PMTU, протокол TCP будет отправлять пакеты с размером MTU 576 байт и со снятым флагом «не фрагментировать».
Проблема была решена изменением значения ключа EnablePMTUDiscovery с 0 на 1 в ветке реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters
После перезагрузки компьютера SQL и все другие приложения стали отсылать пакеты по 1514 байт, несмотря на значение MTU самого интерфейса 1500. Честно говоря, я не совсем понимаю причины подобного поведения PMTU Discovery, но проблему удалось обойти понижением MTU интерфейса до 1486.
Комментариев нет:
Отправить комментарий