Малые запросы работают, большие срываются: какой размер пакета?
Пакеты драйвера SQL Server, лимиты сообщений MySQL и MTU IP-пути — разные единицы. Сбой, зависящий от размера, не делает их взаимозаменяемыми.
Малые запросы возвращаются, большие зависают или обрываются, и первая мысль — что-то не так с размером пакета. Эта мысль обычно верна и почти всегда направлена на неверный уровень. Три настройки делят слово пакет и измеряют три несвязанные вещи: транспортную упаковку драйвера базы данных, лимит сообщений сервера базы данных и максимальную единицу передачи IP-пути. Настраивать одну, чтобы исправить симптом, вызванный другой, — это путь, которым проблема на пять минут превращается в неделю настройки. Порядок ниже — тот, который стоил мне меньше всего времени.
Три уровня, одно общее слово
Каждая строка ниже — разная единица с разным владельцем, и ни о одной нельзя рассуждать исходя из других. Сообщение базы данных может охватывать много сегментов TCP и много IP-пакетов, поэтому увеличение разрешённого размера не расширяет путь, а снижение настройки драйвера — не та же операция, что смена MTU интерфейса. Слово встречается в трёх разных файлах конфигурации, поэтому поиск по нему возвращает три несвязанных ответа. Сначала прочитайте текст ошибки, затем решите, какой файл открыть.
| Setting or observation | Unit it describes |
|---|---|
| SQL Server client network packet setting | The provider's transport packaging for that connection |
| MySQL communication packet limit | A database message, such as one statement, row or replication event |
| IP path MTU | The largest IP packet the path carries without fragmentation handling |
Запишите, к какому уровню относится сбойная операция, прежде чем открыть файл конфигурации. Текст ошибки обычно говорит это, и именно эту часть люди пропускают.
Определите поставщика, прежде чем менять его настройку
Для SQL Server запишите приложение, имя драйвера или поставщика, версию и действующую конфигурацию соединения. Диагностический скрипт и настольное приложение могут достигать одного сервера через разных поставщиков, поэтому настройка, помогающая одному, ничего не доказывает о другом. Значения по умолчанию у поставщиков различаются, и похожее по названию поле строки подключения не является доказательством, что каждый поставщик трактует его одинаково.
Не заменяйте поддерживаемый драйвер на старый только потому, что старое обходное решение использовало его синтаксис. Текущая документация не поощряет новую разработку на этих более старых компонентах, а наследование их ограничений — плохая сделка ради одной настройки.
Отклонение сообщения — не остановка пути
В MySQL 8.4 документация по пакету связи описывает отклонение слишком большого оператора, строки или события бинарного журнала относительно применимого предела, и могут иметь значение как клиентский, так и серверный пределы. Это отклонение на уровне базы данных, а не утверждение, что сеть должна нести гигантский IP-пакет. Прочитайте фактическую ошибку и форму проблемного сообщения: большой результат из множества маленьких строк — это другой случай, чем одна огромная строка, и они срываются по-разному.
Установкам MariaDB нужны документированные пределы и диагностика собственной версии. Копировать значения MySQL по умолчанию на MariaDB — это угадывание с дополнительными шагами.
Как на самом деле выглядят доказательства пути
Проблема размера пути имеет свой отпечаток: воспроизводимый сбой транспорта, зависящий от размера, на определённом маршруте и семействе адресов, с накладными расходами туннеля и обратной связью обнаружения, ведущей себя так, как позволяет путь. Один только тайм-аут не отличает её от медленного запроса, ошибки драйвера или серверного предела, и отношение к тайм-ауту как к доказательству проблем MTU уверенно отправляет вас не на тот уровень.
Если вы проверяете путь, держите пункт назначения, учётную запись и нагрузку фиксированными, чтобы единственной переменной был размер, который вы исследуете. Тест, в котором изменились три вещи, ничего не говорит о том, какая из них имела значение.
Измените одну документированную переменную, затем запишите её
Держите пункт назначения, учётную запись, поставщика и нагрузку постоянными, запишите исходное значение, примените одно поддерживаемое изменение и запишите результат. Меньшая настройка, позволяющая пройти одному тесту, — полезное доказательство об этом проверенном стеке; она не универсальный оптимум и не устанавливает, что вызвало исходный сбой. Это разные утверждения, и только первое подкреплено одним экспериментом.
Решите выявленный предел на его собственном уровне, затем отметьте, какой это был уровень. Именно заметка мешает следующему человеку настраивать драйвер, потому что проблемой был путь.