При обновлении системного окружения многие администраторы и разработчики 1С сталкиваются с парадоксальной ситуацией: более свежая версия СУБД (в данном случае MS SQL Server 2017) показывает результаты в тестах производительности (например, тест Гилева) значительно хуже, чем предыдущая версия SQL Server 2016. Особенно остро это проявляется при параллельной нагрузке, когда показатели «попугаев» могут падать в два и более раз. В этой статье мы подробно разберем причины такого поведения и выясним, какие настройки необходимо изменить для стабилизации работы системы.
Рассмотрим ситуацию на конкретном примере. При одиночном тесте (без нагрузки) SQL Server 2017 может показывать даже лучшие результаты, чем 2016-я версия. Однако, как только начинается параллельная обработка данных, производительность резко снижается. Пользователи отмечают 100% загрузку процессора при аномально низком потреблении оперативной памяти и минимальной нагрузке на дисковую подсистему. Это классический симптом того, что сервер тратит ресурсы не на выполнение запросов, а на их планирование и управление ресурсами.
Выясним основные причины, по которым 17-я версия может «захлебываться» там, где 16-я работала стабильно:
Memory Grant Feedback. Если SQL Server считает, что запросу нужно меньше памяти, чем было выделено ранее, он урезает лимит. В динамической среде 1С это часто приводит к тому, что запросу не хватает памяти для выполнения Sort или Hash Join, и данные начинают сбрасываться в TempDB, вызывая простои.TARGET_RECOVERY_TIME установлен в 60 секунд, что заставляет систему чаще сбрасывать «грязные» страницы на диск, создавая дополнительную нагрузку на CPU.Проанализируем работу оптимизатора. В большинстве случаев для стабильной работы 1С требуется вернуть логику работы оптимизатора к «старой» модели (Legacy), которая более предсказуемо обрабатывает специфические запросы платформы. Посмотрим, как это сделать на уровне базы данных.
Выполним следующую команду для изменения настроек конфигурации базы данных:
ALTER DATABASE SCOPED CONFIGURATION SET LEGACY_CARDINALITY_ESTIMATION = ON;
GO
Это позволит использовать проверенные алгоритмы оценки, которые корректно работают с временными таблицами 1С, не заставляя процессор пересчитывать планы при каждом изменении объема данных.
Разберем использование специальных флагов трассировки, которые являются «золотым стандартом» для настройки SQL под 1С. Флаги позволяют принудительно включить или выключить определенные механизмы ядра СУБД.
Флаг трассировки 4199: Данный флаг включает все исправления оптимизатора запросов, которые были выпущены в различных обновлениях (Hotfix). Для современных версий SQL это критически важно.
Флаг трассировки 9481: Если изменение LEGACY_CARDINALITY_ESTIMATION на уровне базы не помогло, этот флаг принудительно включает старую модель оценщика на уровне всего сервера.
Для включения флагов необходимо добавить их в параметры запуска службы SQL Server (SQL Server Configuration Manager) в формате -T4199 и -T9481, либо выполнить команду:
DBCC TRACEON (4199, 9481, -1);
GO
Проанализируем настройки параллелизма. Несмотря на то что автор темы использовал MAXDOP = 1, в SQL Server 2017 работа с TempDB претерпела изменения. Рассмотрим рекомендации по настройке для многопоточной нагрузки:
CXPACKET.TempDB соответствует числу логических ядер (но не более 8, если ядер больше). Это критически важно для снижения задержек на системных страницах PFS и SGAM.Выясним причину высокой загрузки CPU при низкой нагрузке на диск на «стареньких» ноутбуках. SQL Server 2017 активно использует современные инструкции процессора (AVX2). Если ваш процессор (например, Sandy Bridge) их поддерживает, но система охлаждения не рассчитана на длительную пиковую нагрузку, срабатывает троттлинг.
В отличие от 2016-го сервера, 2017-й может более агрессивно использовать механизмы Soft-NUMA, пытаясь автоматически разделить физические ядра на логические узлы. На процессорах с небольшим количеством ядер это создает лишние накладные расходы на переключение контекста. Попробуем отключить автоматический Soft-NUMA, если вы наблюдаете неадекватное распределение нагрузки по ядрам.
Если вы решили остаться на MS SQL Server 2017 или планируете переход, выполните следующие действия для достижения производительности уровня 2016-й версии и выше:
140 (SQL Server 2017), но при этом обязательно включите Legacy Cardinality Estimation.Max Server Memory оставлял ОС и 1С как минимум 4-8 ГБ оперативной памяти, чтобы избежать свопинга, который в 2017 версии может обрабатываться медленнее из-за новых механизмов управления кэшем.Таким образом, падение производительности в 2017 версии не является «приговором» или признаком того, что версия плохая. Это результат внедрения новых «умных» алгоритмов, которые пока еще не идеально адаптированы под специфическую архитектуру запросов 1С. Тщательная настройка позволит вам использовать преимущества ядра 2017 года без потери скорости.