#sql_server #сеть #windows_server_2008_r2
Здравствуйте! Не так давно обнаружил, что 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.
Ответы
Ответ 1
Я нашёл причину этой фрагментации - это отключенная функция 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.
Комментариев нет:
Отправить комментарий