[SQL Server] Использование trace flag 9592 для сжатия траффика в кластере AlwaysOn

18.05.20

База данных - HighLoad оптимизация

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

Для обеспечения высокой доступности и восстановления при аварии мы используем SQL Server AlwaysOn кластер с синхронными репликами.
При этом сам кластер находится в облаке AWS с репликами в разных датацентрах в рамках одного региона. Если на активном сервере происходит сбой кластер автоматически обнаруживает проблему и переводит пользовательский траффик на другой сервер без потери данных. 

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

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

В статистике ожиданий SQL Server видно, что WRITELOG ожидание увеличилось незначительно, а то время как HADR_SYNC_COMMIT ожидание увеличилось многократно.

WRITELOG ожидание / затраты текущего сервера на запись в журнал транзаций.

HADR_SYNC_COMMIT аналогичное ожидание, но на стороне синхронной реплики.

(визуализация данных с помощью ElasticSearch+Kibana - Мониторинг здоровья MS SQL Server)

т.е. явно проблемы с передачей данных вторичному серверу. 

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

Мы не выявили ни одной из этих проблем и решили попробовать включить сжатия траффика между сихронными репликами.

https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/tune-compression-for-availability-group?view=sql-server-ver15

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

Сжатие траффика позволило уменьшить объем передаваемых данных между репликами примерно на 70%, что также положительно сказалось на затратах - траффик между датацентрами AWS не бесплатный даже в рамках одного региона.

Какой я сделал вывод для себя?

Я бы, наверное, не стал рекомендовать использовать сжатие траффика всеми по умолчанию.
Все зависит от конкретной конфигурации и должно быть проверено на реальной работающей системе в контролируемой манере.
Но, если вы это протестировали и результат устраивает, то это отличный способ снизить объем передаваемого траффика, что может быть особенно полезно если сеть между репликами медленная.

Для тестирования можно воспользоваться следующими командами:

-- получить список текущих trace flag-ов
DBCC TRACESTATUS;

-- включить trace flag для всех процессов
DBCC TRACEON (9592, -1);

-- отключить trace flag для всех процессов
DBCC TRACEOFF (9592, -1);

Для включения этого параметра на постоянной основе лучше его добавить в командную строку:

 

sqlserver traceflag alwayson

См. также

HighLoad оптимизация Программист Платформа 1С v8.3 1C:ERP Бесплатно (free)

Приведем примеры использования различных в динамических списках и посмотрим, почему это плохо.

18.02.2025    4319    ivanov660    39    

56

HighLoad оптимизация Технологический журнал Системный администратор Программист Бесплатно (free)

Обсудим поиск и разбор причин длительных серверных вызовов CALL, SCALL.

24.06.2024    7003    ivanov660    13    

59

HighLoad оптимизация Программист Платформа 1С v8.3 Бесплатно (free)

Метод очень медленно работает, когда параметр приемник содержит намного меньше свойств, чем источник.

06.06.2024    11929    Evg-Lylyk    63    

45

HighLoad оптимизация Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Анализ простого плана запроса. Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы.

13.03.2024    6071    spyke    29    

51

HighLoad оптимизация Программист Платформа 1С v8.3 Бесплатно (free)

Оказывается, в типовых конфигурациях 1С есть, что улучшить!

13.03.2024    9035    vasilev2015    22    

44

HighLoad оптимизация Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

Обработка для простого и удобного анализа настроек, нагрузки и проблем с SQL сервером с упором на использование оного для 1С. Анализ текущих запросов на sql, ожиданий, конвертация запроса в 1С и рекомендации, где может тормозить.

5 стартмани

15.02.2024    14951    293    ZAOSTG    100    

121
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. пользователь 18.05.20 10:15
(0) интересная информация.

+
2. SGordon1 18.05.20 10:36 Сейчас в теме
А такие веселые картинки со временами по типам задержек кто рисует?
4. Shmell 548 05.11.20 16:20 Сейчас в теме
Нужно взять на заметку. Спасибо!
Оставьте свое сообщение