SQL Azure задерживает ответ каждые 10 секунд - PullRequest
0 голосов
/ 29 августа 2018

Мы запускаем несколько веб-приложений Azure (.NET Core, MVC4, MVC5) для SQL Azure. Каждые 10 секунд происходит значительная задержка ответа от сервера SQL. Мы проверили это с помощью консольного приложения, повторяющего один и тот же запрос 100 раз, и независимо от того, когда мы запускаем консольное приложение, задержка происходит ровно каждые 10 секунд.

Запрос обычно занимает 150 мсек. Каждые 10 секунд это займет 2-3 секунды.

Поведение одинаково на тестовых и производственных серверах БД. Мы используем несколько триггеров (5), ни один из которых не запускается запросом, используемым в нагрузочном тесте.

Нагрузочный тест - это хранимая процедура с простым запросом выбора. Пока мы выполняем эти тесты, других пользователей, использующих нашу тестовую среду, нет.

Мы также провели нагрузочное тестирование, используя инструмент тестирования производительности на портале Azure, с такими же результатами.

Есть идеи о том, с чего начать поиск первопричины этой задержки?

Наш тестовый код:

    private static void Main(string[] args)
    {
        var ss = new Stopwatch();
        // Let's go
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            for (var i = 0; i < 100; i++)
            {
                ss.Restart();
                connection.Open();
                var sql = "EXEC usp_loadTestSp";
                using (SqlCommand command = new SqlCommand(sql, connection))
                {
                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        Console.WriteLine($"Current time {i}: {DateTime.UtcNow}");
                    }
                }
                connection.Close();
                Console.WriteLine($"Loop time {i}: {ss.ElapsedMilliseconds}");
            }
        }

        EndApp();
    }

Обновление: Просто создал новый сервер SQL с новой пустой базой данных SQL в Azure. Нет таблиц, нет ничего. Обновлена ​​строка подключения в тестовом приложении, изменен запрос на SELECT NULL. Тот же результат, это занимает намного больше времени каждые 10 секунд ...

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Спасибо всем за ответ и извините за задержку с ответом.

Я нашел причину этой проблемы, и она не имеет ничего общего с SQL Azure или любой другой службой Azure.

Проблема была локальной на моем устройстве, и виновником был клиент Google Drive Stream, который я использую для синхронизации своих документов с Google Drive. Тестируя с помощью «ping -t», я получаю очень устойчивую задержку в 2 секунды каждые 10 секунд. Отключение Google Drive Stream, пинг быстрый все время. Повторно включите Google Drive Stream, и задержка вернулась.

Теперь узнайте, как продолжать использовать файловый поток без задержек.

TGM

0 голосов
/ 31 августа 2018

Нет особой причины, по которой SQL Azure будет вести себя таким образом. Однако, когда вы видите подобные ситуации, я бы рекомендовал сначала отделить логику на стороне клиента и драйвер / сеть клиента от логики, возникающей на сервере. Таким образом, в этом случае вы можете создать хранимую процедуру, которая будет эквивалентна вашему циклу в вашей программе, и попытаться запустить ее на сервере и время. Он должен дать вам некоторые данные без участия других частей.

Другой вариант - посмотреть хранилище запросов (которое даст вам сводные данные о времени выполнения на сервере для запросов, а не данные уровня трассировки, но даст вам min / max / last / avg / stdev для каждая метрика). Это должно дать вам еще одну точку данных для оценки, со стороны сервера или со стороны клиента / приложения. https://docs.microsoft.com/en-us/sql/relational-databases/performance/monitoring-performance-by-using-the-query-store?view=sql-server-2017

Другой вариант - включить настройку «время статистики» для выполнения ваших запросов - это даст вам дополнительный набор данных, которые вы можете получить в драйвере клиента о том, сколько ресурсов сервер использовал для обработки вашего запроса.

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

Наконец, вы можете использовать XEvents для отслеживания времени выполнения каждого запроса (хотя для настройки в настоящее время в SQL Azure требуется немного усилий, можно вывести трассировку событий из запросов в хранилище больших двоичных объектов, чтобы вы могли может проверить, сколько времени сервер думает, что использует).

Я надеюсь, что это даст вам несколько вещей, чтобы попытаться раскрыть вашу тайну.

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