Страницы

Поиск по вопросам

понедельник, 15 октября 2018 г.

Размер пакетов от MS SQL не может быть больше 590 байт?

Здравствуйте! Не так давно обнаружил, что 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.

Комментариев нет:

Отправить комментарий