Go клиент базы данных убивает больше соединений с SQL Server, чем ожидалось - PullRequest
0 голосов
/ 29 октября 2018

В ходе отладки некоторых других проблем на нашем сервере я заметил несколько странное поведение в отношении соединений, которое я надеюсь понять.

У меня есть два сервера go, один из которых обращается к экземпляру SQL Server RDS, а другой - к управляемому экземпляру SQL Server в Azure.

Я полагаю, есть небольшая разница в том, как работают 2 бэкэнда - RDS имеет один порт (1433), на котором клиент аутентифицируется и впоследствии устанавливает соединение. Кажется, что Azure SQL проходит проверку подлинности через порт 1433, а затем перенаправляет клиента в другую службу, которая фактически обрабатывает соединения.

В обоих случаях у меня значительная нагрузка на серверы. Как минимум 500 запросов / с, с пиками около 2 тыс. Запросов / с. Каждый из этих запросов приводит к запросу Select, который возвращает одну строку с поиском первичного ключа - таким образом, действительно недолговечные соединения с SQL. Среднее время на запрос составляет 50-80мс на оба, с p95 в диапазоне 100-150мс

Поведение, которое я пытаюсь понять:

Я использую драйвер go database / sql с реализацией MS-SQL (в частности, go-mssqldb ).

Я установил для Max Idle подключений и Max Open соединений для 64.

Что бы я ожидал : 64 длительных сеанса Установленные соединения, которые иногда простаивают, но быстро используются повторно.

То, что я вижу : обычно установлено 64 соединения, число которых часто падает до 50-64. Это также приводит к 200-400 соединениям в TIME_WAIT состояние в любой момент времени.

Что может быть причиной такого поведения? Это просто тот факт, что водитель go лениво закрывает соединения? Если так, то почему число упало бы ниже 64?

Я рад предоставить более подробную информацию!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...